0

I need to transform some data using xslt. Basically, I need to group the info per customer. Afterwards, all date & time values should be displayed per customer level. I must mention that I don't have to display only distinct values.

<XMLLINE>

<Customer>1</Customer>

<Day> Monday </Day>

<Hour> 10:00 <Hour>

 </XMLLine>

<XMLLINE>

<Customer>2</Customer>

<Day> Monday</Day>

<Hour> 12:00 <Hour>

 </XMLLine>

<XMLLINE>

<Customer>1</Customer>

<Day> Tuesday</Day>

<Hour> 12:00 <Hour>

 </XMLLine>

</XMLines>

Output should look like

<Clients>

<Customer>

<Id> 1 </Id>

<Days>

<Day> Monday </Day>

<Hour> 10:00 <Hour>

<Day> Tuesday</Day>

<Hour> 12:00 <Hour>

</Days>

</Customer>

<Customer>

<Id> 2 </Id>

<Days>

<Day> Monday </Day>

<Hour> 12:00 <Hour>

</Days>

</Customer>

</Clients>

Thanks a lot guys

chopstix21
  • 21
  • 4

1 Answers1

0

Just group with Muenchian grouping, defining a key and then using the key function to find all items in a group:

<xsl:stylesheet version="1.0" 
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>

<xsl:key name="c-by-id" match="XMLLINE" use="Customer"/>

<xsl:template match="XMLines">
  <Clients>
    <xsl:apply-templates select="XMLLINE[generate-id() = generate-id(key('c-by-id', Customer)[1])]"/>
  </Clients>
</xsl:template>

<xsl:template match="XMLLINE">
  <Customer>
    <Id><xsl:value-of select="Customer"/></Id>
    <Days>
      <xsl:copy-of select="key('c-by-id', Customer)/*[self::Day | self::Hour]"/>
    </Days>
  </Customer>
</xsl:template>

</xsl:stylesheet>

Transforms

<XMLines>
<XMLLINE>

<Customer>1</Customer>

<Day> Monday </Day>

<Hour> 10:00 </Hour>

 </XMLLINE>

<XMLLINE>

<Customer>2</Customer>

<Day> Monday</Day>

<Hour> 12:00 </Hour>

 </XMLLINE>

<XMLLINE>

<Customer>1</Customer>

<Day> Tuesday</Day>

<Hour> 12:00 </Hour>

 </XMLLINE>

</XMLines>

into

<Clients>
   <Customer>
      <Id>1</Id>
      <Days>
         <Day> Monday </Day>
         <Hour> 10:00 </Hour>
         <Day> Tuesday</Day>
         <Hour> 12:00 </Hour>
      </Days>
   </Customer>
   <Customer>
      <Id>2</Id>
      <Days>
         <Day> Monday</Day>
         <Hour> 12:00 </Hour>
      </Days>
   </Customer>
</Clients>
Martin Honnen
  • 160,499
  • 6
  • 90
  • 110