4

apply-templates で xsl:sort を使用して要素を並べ替えましたが、それらにも番号を付けたいのですが、xsl:number を使用しようとすると、並べ替え後の位置ではなく、元の位置が表示されます。変数は変更できないので、変数も使用できないと思いますか?では、リストに正しく番号を付けるにはどうすればよいでしょうか?

4

2 に答える 2

1

OPのコメントから:

ああ、うまくいきました!ありがとうございました!私は for-each ループを使用していませんでしたが、 <xsl:apply-templates select="book"> 代わりに使用していました。しかし、 for-each では機能します

--not を使用した 2 つの例を<xsl:apply-templates>次に示し<xsl:for-each>ます。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
  <xsl:apply-templates>
   <xsl:sort select=". mod 3"/>
  </xsl:apply-templates>
 </xsl:template>

 <xsl:template match="num">
  <xsl:text>&#xA;</xsl:text>
  <xsl:value-of select="position()"/>: <xsl:text/>
  <xsl:copy-of select="."/>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用される場合:

<nums>
  <num>01</num>
  <num>02</num>
  <num>03</num>
  <num>04</num>
  <num>05</num>
  <num>06</num>
  <num>07</num>
  <num>08</num>
  <num>09</num>
  <num>10</num>
</nums>

要素の番号付きリストを生成し、3 で割った余りでソートします。

1: <num>03</num>
2: <num>06</num>
3: <num>09</num>
4: <num>01</num>
5: <num>04</num>
6: <num>07</num>
7: <num>10</num>
8: <num>02</num>
9: <num>05</num>
10: <num>08</num>

2 番目の例は、XSLT 1.0 で広く使用されているプログラミング イディオムです。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/*">
  <numsMax>
   <xsl:apply-templates>
    <xsl:sort data-type="number" order="descending"/>
   </xsl:apply-templates>
  </numsMax>
 </xsl:template>

 <xsl:template match="num">
  <xsl:if test="position()=1">
   <xsl:copy-of select="."/>
  </xsl:if>
 </xsl:template>
</xsl:stylesheet>

この変換が次の XML ドキュメントに適用される場合:

<nums>
  <num>07</num>
  <num>10</num>
  <num>05</num>
  <num>02</num>
  <num>03</num>
  <num>08</num>
  <num>04</num>
  <num>01</num>
  <num>06</num>
  <num>09</num>
</nums>

position()=1ソートされたノードリストを使用して、すべての数値の最大値を生成します。

<numsMax>
   <num>10</num>
</numsMax>
于 2011-03-06T16:12:29.743 に答える
1

を使用<xsl:value-of select="position()" />して、ループ内の現在の位置を取得できます。

xpath 仕様から: position 関数は、式評価 context からのコンテキスト位置に等しい数値を返します

XML:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="test.xsl"?>
<library>
  <book><name>abc</name></book>
  <book><name>def</name></book>
  <book><name>aaa</name></book>
</library>

XSLT (test.xsl):

<?xml version="1.0" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <xsl:for-each select="/library/book">
      <xsl:sort select="name" data-type="text" />
      <xsl:value-of select="position()" />: <xsl:value-of select="name" />, 
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>
于 2011-03-05T23:26:59.090 に答える