自定义XML排序顺序?

时间:2013-03-20 15:42:30

标签: xml sorting xslt

我有一个像

这样的xml文件
<tests>
     <test>
       <categoryname>A</categoryname>
       <region>EU</region>
     </test>

     <test>
       <categoryname>B</categoryname>
       <region>EU</region>
     </test>

     <test>
       <categoryname>C</categoryname>
       <region>USA</region>
     </test>
     <test>
       <categoryname>C</categoryname>
       <region>EU</region>
     </test>
</tests>

按字母顺序排序,显示如下:

A
B
C

但我希望通过我的自定义排序来看待它:

C
A
B

我已经看到了类似的问题,并为我应用了给定的答案(xsl代码),但遗憾的是没有帮助,如果你能帮助我,我会很高兴的! 我可以添加额外的属性/标签/值等。

1 个答案:

答案 0 :(得分:1)

这是怎么回事:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>

  <xsl:template match="@* | node()">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="/*">
    <xsl:copy>
      <xsl:apply-templates select="test">
        <xsl:sort select="string-length(substring-before('|C|A|B|', 
                                                         concat('|', categoryname, '|')
                                                        ))"
                  data-type="number"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

应用于样本输入时,结果为:

<tests>
  <test>
    <categoryname>C</categoryname>
    <region>USA</region>
  </test>
  <test>
    <categoryname>C</categoryname>
    <region>EU</region>
  </test>
  <test>
    <categoryname>A</categoryname>
    <region>EU</region>
  </test>
  <test>
    <categoryname>B</categoryname>
    <region>EU</region>
  </test>
</tests>