1

次の xml サンプルがあり、n=1 から 5 までの書籍ごとに「book #n name is xxx」を出力したいと考えています。position() は 1,2,1,2,3 に評価されるため、使用できません関数。ありがとう。

<books>
  <cat>
    <book>a</book>
    <book>b</book>
  </cat>
  <cat>
    <book>c</book>
    <book>d</book>
    <book>e</book>
  </cat>
</books>
...
...
<xsl:template match="book">
<!-- I need expression to evaluate as:
book a = 1
book b = 2
book c = 3
book d = 4
book e = 5
-->
    <xls:variable name="idx" select="postition()"/>
    name of book #<xsl:value-of select="$idx"/> is <xsl:value-of select"."/>
</xsl:template>
4

1 に答える 1

3

使用:

 count(preceding::book) +1

bookただし、ネストされた要素を持つことができる場合、使用する正しい式は次のようになることに注意してください。

 count(ancestor::book | preceding::book) +1

または、次を使用できます<xsl:number>

完全なコード:

<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="book">
   <xsl:value-of select=
   "concat('book ', ., ' = ', count(preceding::book) +1, '&#xA;')"/>
 </xsl:template>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<books>
  <cat>
    <book>a</book>
    <book>b</book>
  </cat>
  <cat>
    <book>c</book>
    <book>d</book>
    <book>e</book>
  </cat>
</books>

必要な正しい結果が生成されます。

book a = 1
book b = 2
book c = 3
book d = 4
book e = 5

Ⅱ.使用<xsl:number>:

<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="book">
   <xsl:value-of select="concat('&#xA;book ', ., ' = ')"/>
   <xsl:number level="any" count="book"/>
 </xsl:template>
</xsl:stylesheet>

III. position()適切な使用<xsl:apply-templates>

<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="/">
  <xsl:apply-templates select="/*/*/book"/>
 </xsl:template>

 <xsl:template match="book">
   <xsl:value-of select="concat('&#xA;book ', ., ' = ', position())"/>
 </xsl:template>
</xsl:stylesheet>

説明:

の値は、実行のためにこのテンプレートを選択する原因となった でposition()作成されたノード リスト内の現在のノードの位置です。<xsl:apply-templates>適切なものを使用すれば、使用<xsl:apply-templates>してposition() 問題ありません。

于 2012-10-26T17:39:04.680 に答える