xslt按名称提取和排序叶节点 - 意外结果

时间:2013-05-13 14:24:32

标签: xslt

我想提取叶子节点并对它们进行排序。

我的XSL给出了意想不到的结果。我该如何解决这个问题?

输入

<root>
  <b>
    <b33 zzz="2" fff="3"></b33>
    <b11></b11>
    <b22></b22>
  </b>
  <a>
    <a27></a27>
    <a65 fff="0" eee="2" zzz="10"></a65>
    <a11></a11>
  </a>
</root>

XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>
  <xsl:template match="/">
    <root>
      <xsl:call-template name="leafnodes"/>
    </root>
  </xsl:template>

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

      <xsl:apply-templates select="@*">
        <xsl:sort select="name()"/>
      </xsl:apply-templates>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

输出(我希望它被排序,但不是)

<root>
  <b33 fff="3" zzz="2" />
  <b11 />
  <b22 />
  <a27 />
  <a65 eee="2" fff="0" zzz="10" />
  <a11 />
</root>

我希望节点的顺序为a11,a27,a65,b11,b22,b33。

如果我省略'[not(*)]',xsl将获取所有节点并对其进行正确排序。 怎么解决这个问题?

1 个答案:

答案 0 :(得分:1)

输出所有没有按名称排序的子元素的元素,以及按名称排序的属性。试试这个;

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
    <xsl:strip-space elements="*"/>
    <xsl:template match="/">
        <root>
            <xsl:apply-templates select="//*[not(*)]">
                <xsl:sort select="name()"/>
            </xsl:apply-templates>
        </root>
    </xsl:template>
    <xsl:template match="*|@*">
        <xsl:copy>
            <xsl:apply-templates select="@*" >
                <xsl:sort select="name()"/>
            </xsl:apply-templates>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

将生成以下输出:

<root>
  <a11/>
  <a27/>
  <a65 eee="2" fff="0" zzz="10"/>
  <b11/>
  <b22/>
  <b33 fff="3" zzz="2"/>
</root>