使用xsl对具有相邻同名标记的xml进行排序

时间:2014-11-03 09:42:14

标签: xml xslt msxml

我最近在研究xsl。我编写了代码来按<valueSet><key>元素的值的升序排序key

下面是我想根据键排序的xml。我希望所有出现的valueSet按第二个<key>的值排序,然后按第一个key的值排序。以下是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>

1 个答案:

答案 0 :(得分:2)

如何以简单的方式做到这一点?

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>