整个文件中的元素位置

时间:2012-10-26 17:26:35

标签: xslt

我有以下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>

1 个答案:

答案 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, '&#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

<强> 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('&#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() 就可以