0

我想提取叶节点并对其进行排序。

我的 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 会获取所有节点并对它们进行正确排序。如何解决?

4

1 回答 1

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>
于 2013-05-13T15:07:03.420 回答