2010-08-26 90 views
0

我有一個xpath語句的問題。評估xpath-predicate中的外部xpath表達式

基本上,這個問題可以在下面的代碼解釋:

<xsl:for-each select="/b1im:B1IMessage/b1im:Header/b1im:Z/SortInbound/group"> 
        <!-- Check if entry from duplicate table is found for the current AccountingEntry --> 
        <xsl:variable name="externalId" select="../externalId"></xsl:variable> 
        <xsl:value-of select="/b1im:B1IMessage/b1im:Body/b1im:Payload[@ObjectRole=&apos;CA&apos;]/jdbc:SqlResult/jdbc:ResultSet/jdbc:Row[jdbc:external_id= /../externalId]/jdbc:external_id"></xsl:value-of> 
        <xsl:variable name="group" select="./@id"></xsl:variable>       
        <!-- if it is no dupe => output --> 
        <xsl:choose> 
          <xsl:when test="/b1im:B1IMessage/b1im:Body/b1im:Payload[@ObjectRole=&apos;CA&apos;]/jdbc:SqlResult/jdbc:ResultSet/jdbc:Row[jdbc:external_id = ../externalId]/jdbc:external_id"> 

我想要做的是,用「../externalId」的值(換每個上下文)的測試(最後一行)..它會工作,如果我使用一個變量($ externalId),但該變量只設置一次(第一次循環迭代)... 有沒有辦法如何我可以訪問for-each-context xpath表達式?

在此先感謝! Tobias

+0

添加'xslt'標籤,因爲這XPath表達式是由XSLT – 2010-08-26 19:53:00

回答

2

在XPath評估的每一步中,「.」(即上下文節點)具有不同的含義。在您的XPath表達式
... jdbc:ResultSet/jdbc:Row[jdbc:external_id = ../externalId]謂詞中的上下文節點由您的XPath表達式中的先前步驟確定,因此您實際上正在比較jdbc:ResultSet元素的externalID子元素。要比較for-each上下文節點的值../externalID,您可以嘗試使用XSLT函數current()

... jdbc:ResultSet/jdbc:Row[jdbc:external_id = current()/../externalId]

1

兩個問題。

首先,@ jasso回答說,當評估謂詞時,上下文由上一步決定。從http://www.w3.org/TR/xpath/#predicates

謂詞過濾節點集與 相對於軸以產生新的 節點集。對於在 節點集合的每個節點將被過濾,將 PredicateExpr已與 節點作爲上下文節點評價,隨着 數量的節點的節點設定爲 上下文大小,以及與接近 位置相對於在所述節點的節點集合 於軸線作爲 上下文位置

二。您寫道:

,如果我用一個變量 ($外部ID),它的工作,但該變量是 只設置一次(第一循環 迭代)...

這不是真的。 for-each內容模板爲其選定節點集中的每個節點實例化一次。因此,externalId得到每個這樣的節點一次評估。

所以,從@jasso正確答案:

... jdbc:ResultSet/jdbc:Row[jdbc:external_id = current()/../externalId] 

是一樣的:

... jdbc:ResultSet/jdbc:Row[jdbc:external_id = $externalId] 
+0

@Alejandro,很好的回答託管+1。在實踐中,當你回答一個問題時,我幾乎不必爲yoyr回答添加任何內容。 – 2010-08-26 20:18:30

+0

@Dimitre:Ja!謝謝!我也是一樣。 ;) – 2010-08-26 20:32:52

+0

感謝你們,讓它工作:)變量的方法並沒有爲我工作的第一個地方,因爲我有一個錯誤在我的input-xml ..然而,很高興知道當前( )-功能!謝謝 – mnkypete 2010-08-27 07:19:45