2012-07-31 132 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