获得元素的位置

时间:2012-07-31 12:01:23

标签: xml xslt xslt-1.0

假设我有一个xml

<Root>
<TB>
..
</TB>
<TB>
..

</TB>
<TB>
..
<DIACT>2</DIACT>
</TB>
<TB>
...
<DIACT>3</DIACT>
</TB>
<TB>
----
<DIACT>4</DIACT>
---
</TB>
</Root>

我希望使用xslt映射获得第一个TB节点的位置,其中DIACT不为null或DIACT节点存在。就像在这种情况下,postion应该给我输出为3.因为第三个TB节点是第一个DIACT不为空的节点。

1 个答案:

答案 0 :(得分:1)

使用

count(/*/TB[DIACT][1]/preceding-sibling::TB) +1

当您需要进行进一步处理时,请设置具有上述值的变量:

<xsl:variable name="vPos" 
              select="count(/*/TB[DIACT][1]/preceding-sibling::TB) +1"/>

或者,可以使用xsl:number

  <xsl:variable name="vPos2">
    <xsl:number count="TB"/>
  </xsl:variable>

以下是两种技术的简单演示:

 

 <xsl:template match="/">
    <xsl:variable name="vPos"
        select="count(/*/TB[DIACT][1]/preceding-sibling::TB) +1"/>

    <xsl:value-of select="$vPos"/>
=========== 
    <xsl:for-each select="/*/TB[DIACT][1]">
      <xsl:variable name="vPos2">
        <xsl:number count="TB"/>
      </xsl:variable>
      <xsl:value-of select="$vPos2"/>
    </xsl:for-each>
 </xsl:template>
</xsl:stylesheet>

在提供的XML文档上应用此转换时:

<Root>
    <TB> .. </TB>
    <TB> ..  </TB>
    <TB> .. 
        <DIACT>2</DIACT>
    </TB>
    <TB> ... 
        <DIACT>3</DIACT>
    </TB>
    <TB> ---- 
        <DIACT>4</DIACT> --- 
    </TB>
</Root>

产生了两个正确的结果

3
=========== 
3