1

我是 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. 的子元素应按元素名称排序,因此> 位于<vc6> 之前<vc7
  2. 如果两个子元素具有相同的元素名称,则应按其文本值对它们进行排序,因此 'bar' 位于 'foo' 之前。

xsl怎么写?谢谢你。

4

2 回答 2

5

修改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>
于 2012-06-12T16:39:00.930 回答
2

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>
于 2012-06-12T13:50:36.997 回答