Search code examples
xmlxsltmsxml

sorting xml having adjacent same name tag using xsl


I was recently working on xsl. I wrote code to sort <valueSet><key> in ascending order of the value of the key element.

Below is the xml I want to sort according to key. I want all occurrences of valueSet to be sorted by the value of the second <key> and then by the value of the first key. Following is the xml:

<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2011 sp1 (http://www.altova.com)-->
<?xml-stylesheet type="text/xsl" href="lookupResources.xsl"?>
<LOOKUP_RESOURCES xsi:noNamespaceSchemaLocation="lookupResources.xsd" 
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<lookup_defs>
    <lookup_def>
        <name>ShowoutAccounts</name>
        <table>
            <valueSet>
                <key>03</key>
                <key>02</key>
                <result>0321</result>
                <result>0322</result>
                <result>0323</result>
                <result>0324</result>
                <result>0325</result>
                <result>0326</result>
                <displayText>Enter your Operator Id in field 7 of the adjustment item.</displayText>
            </valueSet>
            <valueSet>
                <key>01</key>
                <key>02</key>
                <result>0121</result>
                <result>0122</result>
                <result>0123</result>
                <result>0124</result>
                <result>0125</result>
                <result>0126</result>
                <displayText>Enter your Operator Id in field 7 of the adjustment item.</displayText>
            </valueSet>
            <valueSet>
                <key>01</key>
                <key>01</key>
                <result>0111</result>
                <result>0112</result>
                <result>0113</result>
                <result>0114</result>
                <result>0115</result>
                <result>0116</result>
                <result>0117</result>
                <displayText>Enter your Operator Id in field 7 of the adjustment item.</displayText>
            </valueSet>
            <valueSet>
                <key>02</key>
                <key>01</key>
                <result>0211</result>
                <result>0212</result>
                <result>0213</result>
                <result>0214</result>
                <result>0215</result>
                <result>0216</result>
                <displayText>Enter your Operator Id in field 7 of the adjustment item.</displayText>
            </valueSet>
            <valueSet>
                <key>03</key>
                <key>01</key>
                <result>0311</result>
                <result>0312</result>
                <result>0313</result>
                <result>0314</result>
                <result>0315</result>
                <result>0316</result>
                <displayText>Enter your Operator Id in field 7 of the adjustment item.</displayText>
            </valueSet>
            <valueSet>
                <key>02</key>
                <key>02</key>
                <result>0221</result>
                <result>0222</result>
                <result>0223</result>
                <result>0224</result>
                <result>0225</result>
                <result>0226</result>
                <displayText>Enter your Operator Id in field 7 of the adjustment item.</displayText>
            </valueSet>
        </table>
    </lookup_def>
    <lookup_def>
        <name>ExcludedRTs</name>
        <file>
            <inputFilePath>\\BapServer\PARAMETERS\apptype\lookupFiles</inputFilePath>
            <inputFileName>excludedRTs</inputFileName>
            <type>CSV</type>
        </file>
        <leadingCharsToIgnore>0</leadingCharsToIgnore>
    </lookup_def>
</lookup_defs>
</LOOKUP_RESOURCES>



<?xml version="1.0" encoding="UTF-8"?>
 <xsl:stylesheet version="1.0"
                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output indent="yes" />
 <xsl:param name="sortBy" select="'key'\value"/>
 <xsl:param name="strXPath" select="//valueSet"/>
 <xsl:template match="valueSet">
    <xsl:copy>
        <xsl:for-each select="$strXPath">
            <xsl:sort select="*[name()=$sortBy]" order="ascending"/>
            <xsl:copy-of select="."/>
        </xsl:for-each>
    </xsl:copy>
 </xsl:template>
 <xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
 </xsl:template>
</xsl:stylesheet>



<?xml version="1.0" encoding="UTF-8"?>
<!--Sample XML file generated by XMLSpy v2011 sp1 (http://www.altova.com)-->
<?xml-stylesheet type="text/xsl" href="lookupResources.xsl"?>
<LOOKUP_RESOURCES xsi:noNamespaceSchemaLocation="lookupResources.xsd"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <lookup_defs>
    <lookup_def>
        <name>ShowoutAccounts</name>
        <table>
            <valueSet>
                <key>01</key>
                <key>01</key>
                <result>0111</result>
                <result>0112</result>
                <result>0113</result>
                <result>0114</result>
                <result>0115</result>
                <result>0116</result>
                <result>0117</result>
                <displayText>Enter your Operator Id in field 7 of the adjustment item.</displayText>
            </valueSet>
            <valueSet>
                <key>01</key>
                <key>02</key>
                <result>0121</result>
                <result>0122</result>
                <result>0123</result>
                <result>0124</result>
                <result>0125</result>
                <result>0126</result>
                <displayText>Enter your Operator Id in field 7 of the adjustment item.</displayText>
            </valueSet>
            <valueSet>
                <key>02</key>
                <key>01</key>
                <result>0211</result>
                <result>0212</result>
                <result>0213</result>
                <result>0214</result>
                <result>0215</result>
                <result>0216</result>
                <displayText>Enter your Operator Id in field 7 of the adjustment item.</displayText>
            </valueSet>
            <valueSet>
                <key>02</key>
                <key>02</key>
                <result>0221</result>
                <result>0222</result>
                <result>0223</result>
                <result>0224</result>
                <result>0225</result>
                <result>0226</result>
                <displayText>Enter your Operator Id in field 7 of the adjustment item.</displayText>
            </valueSet>
            <valueSet>
                <key>03</key>
                <key>01</key>
                <result>0311</result>
                <result>0312</result>
                <result>0313</result>
                <result>0314</result>
                <result>0315</result>
                <result>0316</result>
                <displayText>Enter your Operator Id in field 7 of the adjustment item.</displayText>
            </valueSet>
            <valueSet>
                <key>03</key>
                <key>02</key>
                <result>0321</result>
                <result>0322</result>
                <result>0323</result>
                <result>0324</result>
                <result>0325</result>
                <result>0326</result>
                <displayText>Enter your Operator Id in field 7 of the adjustment item.</displayText>
            </valueSet>
        </table>
    </lookup_def>
    <lookup_def>
        <name>ExcludedRTs</name>
        <file>
            <inputFilePath>\\BapServer\PARAMETERS\apptype\lookupFiles</inputFilePath>
            <inputFileName>excludedRTs</inputFileName>
            <type>CSV</type>
        </file>
        <leadingCharsToIgnore>0</leadingCharsToIgnore>
    </lookup_def>
</lookup_defs>
</LOOKUP_RESOURCES>

Solution

  • How about doing it the simple way?

    XSLT 1.0

    <xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>
    
    <!-- identity transform -->
    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    
     <xsl:template match="table">
        <xsl:copy>
            <xsl:apply-templates select="valueSet">
                <xsl:sort select="key[1]" data-type="text" order="ascending"/>
                <xsl:sort select="key[2]" data-type="text" order="ascending"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
    
    </xsl:stylesheet>