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 に答える