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>
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>