XSLT,如何按元素名称排序

时间:2012-06-12 13:46:52

标签: xml xslt

我是XSLT的新手。我想出了一个问题,希望有人可以提供帮助。

假设我有一个源xml,

<?xml version="1.0"?>
<docroot>
    <vc6>foo</vc6>
    <vc7>bar7</vc7>
    <vc8 arch="x64">amd64demo</vc8>
    <vc7>foo7</vc7>
    <vc6>bar</vc6>
</docroot> 

我想把它变成:

<?xml version="1.0"?>
<docroot>
    <vc6>bar</vc6>
    <vc6>foo</vc6>
    <vc7>bar7</vc7>
    <vc7>foo7</vc7>
    <vc8 arch="x64">amd64demo</vc8>
</docroot> 

即, 1.子元素应按元素名称排序,所以之前是。 2.如果两个孩子具有相同的元素名称,则应按文本值排序,因此“bar”位于“foo”之前。

如何编写xsl?谢谢。

2 个答案:

答案 0 :(得分:3)

修改legoscia的答案:

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

答案 1 :(得分:1)

有一些如何在this answer中使用xsl:sort的示例。这样的事情对你有用:

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