XSLT - for each loop based on sorting

Viewed 22
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <ns2:CommissionEvents xmlns="urn:tracelink:mapper:sl:canonical:commontypes" xmlns:ns2="urn:tracelink:mapper:sl:canonical:serialized_operations_manager">
        <ns2:CommissionEvent>
           <NumberList>
            <Serial barcodeContent="(01)00355135132011(21)897883089643(17)230430(10)TLSMKTST" companyPrefix="0355135" filterValue="0" format="AI(01)+AI(21)">010035513513201121897883089643</Serial>
            </NumberList>
    </ns2:CommissionEvent>
        <ns2:CommissionEvent>
           <NumberList>
            <Serial barcodeContent="(01)00355135132011(21)903131477120(17)230430(10)TLSMKTST" companyPrefix="0355135" filterValue="0" format="AI(01)+AI(21)">010035513513201121903131477120</Serial>
           </NumberList>
    </ns2:CommissionEvent>
    <ns2:CommissionEvent>
           <NumberList>
            <Serial barcodeContent="(01)30355135132012(21)389170110454(17)230430(10)TLSMKTST" companyPrefix="0355135" filterValue="3" format="AI(01)+AI(21)">013035513513201221389170110454</Serial>
           </NumberList>
    </ns2:CommissionEvent>
    <ns2:CommissionEvent>
           <NumberList>
            <Serial barcodeContent="(00)003551350000000907" companyPrefix="0355135" filterValue="0" format="AI(00)">00003551350000000907</Serial>
           </NumberList>
    </ns2:CommissionEvent>
    <ns2:CommissionEvent>
            <NumberList>
              <Serial barcodeContent="(00)103551350000000645" companyPrefix="0355135" filterValue="1" format="AI(00)">00103551350000000645</Serial>
            </NumberList>
    </ns2:CommissionEvent>
    </ns2:CommissionEvents>

The output I'm trying to achieve is something like the below. I tried for each loop grouping based on @filterValue and @format. Could someone help me achieving this using xslt 1.0 or xslt 2.0

<ns2:CommissionEvents>              
        <ns2:CommissionEvent>
           <ns0:NumberList>
            <ns0:Serial barcodeContent="(01)00355135132011(21)897883089643(17)230430(10)TLSMKTST" companyPrefix="0355135" filterValue="0" format="AI(01)+AI(21)" />
            <ns0:Serial barcodeContent="(01)00355135132011(21)903131477120(17)230430(10)TLSMKTST" companyPrefix="0355135" filterValue="0" format="AI(01)+AI(21)" />
            </ns0:NumberList>
    </ns2:CommissionEvent>
    <ns2:CommissionEvent>
           <ns0:NumberList>
            <ns0:Serial barcodeContent="(01)30355135132012(21)389170110454(17)230430(10)TLSMKTST" companyPrefix="0355135" filterValue="3" format="AI(01)+AI(21)" />
           </ns0:NumberList>
    </ns2:CommissionEvent>
    <ns2:CommissionEvent>
            <ns0:NumberList>
            <ns0:Serial barcodeContent="(00)003551350000000907" companyPrefix="0355135" filterValue="0" format="AI(00)" />
            <ns0:Serial barcodeContent="(00)103551350000000645" companyPrefix="0355135" filterValue="1" format="AI(00)" />
           </ns0:NumberList>
    </ns2:CommissionEvent>
    </ns2:CommissionEvents>
1 Answers

This might get you started. I'm seeing four different groups in the output:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="2.0"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:ns1="urn:tracelink:mapper:sl:canonical:commontypes"
  xmlns:ns2="urn:tracelink:mapper:sl:canonical:serialized_operations_manager"
  exclude-result-prefixes="#all">
  
  <xsl:output method="xml" indent="yes" />

  <xsl:template match="/ns2:CommissionEvents" >
    <xsl:copy>
      <xsl:for-each-group select="ns2:CommissionEvent/ns1:NumberList/ns1:Serial" 
                          group-by="concat(@filterValue, '##', @format)" >
        <ns2:CommissionEvent>
          <ns1:NumberList>
            <ns1:Serial>
              <xsl:copy-of select="current-group()" />
            </ns1:Serial>
          </ns1:NumberList>          
        </ns2:CommissionEvent>
      </xsl:for-each-group>
    </xsl:copy>
  </xsl:template>
  
</xsl:stylesheet>

with output (giving explicit prefix ns1 whereas was implicit in the input)

<?xml version="1.0" encoding="UTF-8"?>
<ns2:CommissionEvents xmlns:ns2="urn:tracelink:mapper:sl:canonical:serialized_operations_manager" xmlns="urn:tracelink:mapper:sl:canonical:commontypes">
   <ns2:CommissionEvent>
      <ns1:NumberList xmlns:ns1="urn:tracelink:mapper:sl:canonical:commontypes">
         <ns1:Serial>
            <Serial barcodeContent="(01)00355135132011(21)897883089643(17)230430(10)TLSMKTST" companyPrefix="0355135" filterValue="0" format="AI(01)+AI(21)">010035513513201121897883089643</Serial>
            <Serial barcodeContent="(01)00355135132011(21)903131477120(17)230430(10)TLSMKTST" companyPrefix="0355135" filterValue="0" format="AI(01)+AI(21)">010035513513201121903131477120</Serial>
         </ns1:Serial>
      </ns1:NumberList>
   </ns2:CommissionEvent>
   <ns2:CommissionEvent>
      <ns1:NumberList xmlns:ns1="urn:tracelink:mapper:sl:canonical:commontypes">
         <ns1:Serial>
            <Serial barcodeContent="(01)30355135132012(21)389170110454(17)230430(10)TLSMKTST" companyPrefix="0355135" filterValue="3" format="AI(01)+AI(21)">013035513513201221389170110454</Serial>
         </ns1:Serial>
      </ns1:NumberList>
   </ns2:CommissionEvent>
   <ns2:CommissionEvent>
      <ns1:NumberList xmlns:ns1="urn:tracelink:mapper:sl:canonical:commontypes">
         <ns1:Serial>
            <Serial barcodeContent="(00)003551350000000907" companyPrefix="0355135" filterValue="0" format="AI(00)">00003551350000000907</Serial>
         </ns1:Serial>
      </ns1:NumberList>
   </ns2:CommissionEvent>
   <ns2:CommissionEvent>
      <ns1:NumberList xmlns:ns1="urn:tracelink:mapper:sl:canonical:commontypes">
         <ns1:Serial>
            <Serial barcodeContent="(00)103551350000000645" companyPrefix="0355135" filterValue="1" format="AI(00)">00103551350000000645</Serial>
         </ns1:Serial>
      </ns1:NumberList>
   </ns2:CommissionEvent>
</ns2:CommissionEvents>
Related