I am attempting to use the muenchian sort on a list of invoices that are sorted by invoice number. What I am trying to do is outer sort by invoice number, then inner sort and copy
only the lineitem nodes that match by invoice number.
Here's my sample invoice list:
<INVOICELIST>
<INVOICE>
<INVNUM>111</INVNUM>
<LINEITEM>
<QTY>12</QTY>
<LINETOTAL>12</LINETOTAL>
</LINEITEM>
<INVOICETOTAL>12</INVOICETOTAL>
</INVOICE>
<INVOICE>
<INVNUM>112</INVNUM>
<LINEITEM>
<QTY>15</QTY>
<LINETOTAL>15</LINETOTAL>
</LINEITEM>
<INVOICETOTAL>19</INVOICETOTAL>
</INVOICE>
<INVOICE>
<INVNUM>112</INVNUM>
<LINEITEM>
<QTY>4</QTY>
<LINETOTAL>4</LINETOTAL>
</LINEITEM>
<INVOICETOTAL>19</INVOICETOTAL>
</INVOICE>
<INVOICE>
<INVNUM>113</INVNUM>
<LINEITEM>
<QTY>23</QTY>
<LINETOTAL>23</LINETOTAL>
</LINEITEM>
<INVOICETOTAL>23</INVOICETOTAL>
</INVOICE>
</INVOICELIST>
the stylesheet I'm trying to use:
Code:
<?xml version='1.0'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<!-- Add an index (key) that allows selection based on the value of INVNUM -->
<xsl:key name="X" match="NODE" use="INVNUM"/>
<xsl:template match="/">
<!-- The outer for-each selects the first node for every unique INVNUM value. In other words, the outer for-each will iterate exactly once for each unique value of INVNUM -->
<xsl:for-each select="//NODE[generate-id(.)=generate-id(key('X', INVNUM)[1])]">
<xsl:sort select="INVNUM"/>
<xsl:value-of select="INVNUM"/>
<!-- The inner for-each iterates over all nodes that match the outer for-each INVNUM value -->
<xsl:for-each select="key('X', INVNUM)">
<xsl:sort select="LINEITEM"/>
<xsl:value-of select="LINEITEM"/>
</xsl:for-each>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Desired output:
<INVOICELIST>
<INVOICE>
<INVNUM>111</INVNUM>
<LINEITEM>
<QTY>12</QTY>
<LINETOTAL>12</LINETOTAL>
</LINEITEM>
<INVOICETOTAL>12</INVOICETOTAL>
</INVOICE>
<INVOICE>
<INVNUM>112</INVNUM>
<LINEITEM>
<QTY>15</QTY>
<LINETOTAL>15</LINETOTAL>
</LINEITEM>
<LINEITEM>
<QTY>4</QTY>
<LINETOTAL>4</LINETOTAL>
</LINEITEM>
<INVOICETOTAL>19</INVOICETOTAL>
</INVOICE>
<INVOICE>
<INVNUM>113</INVNUM>
<LINEITEM>
<QTY>23</QTY>
<LINETOTAL>23</LINETOTAL>
</LINEITEM>
<INVOICETOTAL>23</INVOICETOTAL>
</INVOICE>
</INVOICELIST>
I get no output....
I'm running this from a batch like this:
msxsl.exe einvoices.xml muenchsort.xsl -o outfinal.xml
Any nudge in the right direction would be welcome.