我有以下xml示例,我想为每本书输出“book #n name is xxx”,其中n = 1到5. 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>
答案 0 :(得分:2)
使用强>:
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, '
')"/>
</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
<强> II。使用<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 ', ., ' = ')"/>
<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('
book ', ., ' = ', position())"/>
</xsl:template>
</xsl:stylesheet>
<强>解释强>:
position()
的值是<xsl:apply-templates>
生成的节点列表中当前节点的位置,该节点列表导致选择此模板以供执行。如果我们使用正确的<xsl:apply-templates>
,那么使用position()
就可以。