2014-11-03 134 views
-1

我最近正在使用xsl。我编写代码以按key元素的值的升序对<valueSet><key>进行排序。使用xsl排序具有相同名称标记的xml

下面是我想按键排序的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> 
+0

提供输入XML(示例文件),XSLT你已经尝试什么,需要放出来... – 2014-11-03 09:49:47

+1

你的问题是,到底是什么? – MartynA 2014-11-03 10:04:08

+0

我已编辑该问题,请再次查看 – 2014-11-03 10:14:16

回答

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

我认为这个为我工作 – 2014-11-04 06:43:37

+0

为优秀的代码。 – 2014-11-04 10:52:12

相关问题