0

ここでの私の質問は、人々にとって少し圧倒されるかもしれないと思うので、チャンクで解決しようとしています.

<xsl:apply-templates mode="sort">
    <xsl:sort select="name()"/>
    <xsl:sort select="./*"/>
    <xsl:sort data-type="text" select="./*[text()]"/>
</xsl:apply-templates>

最初のsortステートメント<xsl:sort select="name()"/>は機能し、理解しています。

2 番目のsortステートメントは、私が望んでいることをほぼ正確に実行しているように見えますが、子ノードの を考慮し<xsl:sort select="./*"/>ていません。なぜこのステートメントが何をしているのかtext()、私にはよくわかりません。sortそれを追加することは、私の問題を解決するための多くの試みの 1 つに過ぎませんでした。

3 番目のsortステートメント<xsl:sort data-type="text" select="./*[text()]"/>は、2 番目のステートメントが中断したところから取り上げようとする私の試みsortです。Saxon-HE 9.4を使用すると機能せず、エラーが発生します。

キャッチ: net.sf.saxon.trans.XPathException: 複数のアイテムのシーケンスは、xsl:sort の @select 属性として許可されていません

ここでやろうとしているのは、子要素のテキストに基づいて、兄弟間で親要素を正しく並べ替えることです。

XSLT の重さが私を押しつぶしているので、助けていただければ幸いです。

4

1 に答える 1

1
<xsl:apply-templates select="*">
  <xsl:sort select="."/>
</xsl:apply-templates>

上記のコードは、現在のノードのすべての子要素ノードを取得し、それらをテキスト値で並べ替え、テンプレート ルールでテキストの並べ替え順にプッシュします。

あなたのスニペットで読んだことから、本当に子を要素名で並べ替えますか?

ノードに対処する必要はほとんどないはずtext()です...要素の値は、そのすべての子孫text()ノードの連結です。

于 2013-09-19T20:54:11.190 に答える