2011-10-28 111 views
4

我已經發布了another question作爲其中的一個方面。我被告知要澄清這個問題,但是這個問題已經很長很複雜了,所以我創建了一個新問題。XSLT2:如何在XPath2謂詞中引用有關當前節點的屬性

我想知道是否有在一個又一個的XPath表達式測試引用當前節點的屬性的標準方式。

對於一個例子,考慮下面的XSLT

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/"> 
    <xsl:for-each select="potato/stem[eye]"> 
     In session <xsl:value-of select="@sessionID"/>, the potato had <xsl:value-of select="/potato/stem[@[email protected]][scc]/scc/@leafnumber"/> s.c.c. leaves. 
    </xsl:for-each> 
</xsl:template> 

(在這個問題的底部XML源。) (注意,類型的幹[眼]的換每個引用節點,但請求的第二個值引用類型爲stem [scc]的節點,它們位於源XML樹的不同分支上。)

顯然,「@ sessionID = @ sessoinID」部分基本上沒有意義,因爲XPath認爲這是「T他的節點的sessionID屬性的值應該等於節點的sessionID屬性的值。「

但是我想說的是「測試以確保該節點(XPath表達式中的那個)的seesionID屬性的值與任何/ stem [eye]節點的節點ID相同我現在在。「

我不能用變量來做這件事,因爲你不允許在for-each子句中聲明一個變量。

僅供參考,這是XML源代碼。它的結構不是人們想要的,但是我必須與之合作。

<?xml version="1.0" encoding="utf-8"?> 
<potato> 
<stem sessionID="1"> 
    <eye number = "25"/> 
</stem> 
<stem sessionID="3"> 
    <eye number = "33"/> 
</stem> 

<stem sessionID="1"> 
    <scc leafnumber = "234" /> 
</stem> 
<stem sessionID="2"> 
    <scc leafnumber = "433"/> 
</stem> 
<stem sessionID="3"> 
    <scc leafnumber = "463"/> 
</stem> 

<stem sessionID="1"> 
    <agd leafnumber = "154"/> 
</stem> 
<stem sessionID="2"> 
    <agd leafnumber = "233"/> 
</stem> 
<stem sessionID="3"> 
    <agd leafnumber = "113"/> 
</stem> 
</potato> 

我在尋找的輸出是:

在會話1,馬鈴薯有234 s.c.c.樹葉。

在會議3中,馬鈴薯有463 s.c.c.樹葉。 (當然,這只是沙箱的例子,我意識到可能有簡單的方法來以完全不同的方式完成上述輸出,但我希望這個例子能夠解決我的問題,即如何使用關聯的值與當前節點(例如,在for-each中)作爲XPath的謂詞來搜索另一個節點。)

回答

8

在XSLT中1。0可以使用標準功能current()這指的是由當前模板或最內xsl:for-each匹配節點:

/potato/stem[@sessionID=current()/@sessionID][scc]/scc/@leafnumber 

或通過定義一個鍵(在全局級別):

<xsl:key name="kPotById" match="stem[scc]" use="@sessionID"/> 

和引用此項:

key('kPotById', @sessionID)/scc/@leafnumber 

在XSLT 2.0/XPath 2.0中,您可以使用其他方式表示此(範圍變量):

for $thisSessionID in @sessionId 
return 
    /potato/stem[@sessionID=$thisSessionID][scc]/scc/@leafnumber 
+1

哇,我也不知道「key」。 Shessh!我有一本蹩腳的書。我還需要更多地研究範圍變量。這非常有幫助。 –

+0

@DavidR:不客氣。順便說一句,我在我的答案中糾正了一個錯字 - 錯過了key()例子中的第二個參數。現在可以。 –

+1

太棒了!謝謝!! –

5

使用例如current()/@sessionID訪問當前處理節點的sessionID屬性(例如,由樣本中的for-each處理或者通過具有推送處理的apply-templates處理的屬性)。

+0

謝謝!這正是我想要弄清楚的。爲什麼我的XSLT書籍從來沒有提到這個功能? [XML for Dummies在XSLT上花費了130多頁,從未提及此功能。] –

相關問題