2012-07-31 133 views
0

的位置假设我有一个XML获取元素

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

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

我想第一TB节点的位置其中DIACT不为空或DIACT节点存在,则使用XSLT映射。就像在这种情况下,位置应该让我输出为3.由于第三TB节点是第一个与DIACT不为空。

+0

你能解释为什么你想要该节点的位置? – Tomalak 2012-07-31 12:03:05

+0

其实我需要根据这个位置做一些进一步的处理。对不起,但我无法解释整个场景。但是有什么办法可以让我得到这个。 – 2012-07-31 12:06:23

+0

根据我的经验:您几乎从不需要节点的位置来进行进一步处理。很可能你试图完全错误地做某件事,所以解释这种情况可能是有益的。 – Tomalak 2012-07-31 12:08:02

回答

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 
+0

我认为@Tomalak就在这里。 [1]谓词是必需的。 – 2012-07-31 12:46:01

+0

@ SeanB.Durkin,当然,我注意到并修复了很久以前,很抱歉,现在只能看到您的评论。 – 2012-07-31 12:58:32