2010-04-21 65 views
0

任何人都可以幫助解決以下XPath問題嗎?給定節點集:XPath匹配元素的屬性和內容

<table> 
    <rows> 
    <row> 
     <value column="Product">Coal</value> 
     <value column="Quantity">10000</value> 
    </row> 
    <row> 
     <value column="Product">Iron</value> 
     <value column="Quantity">5000</value> 
    </row> 
    <row> 
     <value column="Product">Ore</value> 
     <value column="Quantity">4000</value> 
    </row> 
    </rows> 
</table>

我想查詢查找具有給定產品名稱的節點子集。請注意,產品名稱由正在處理的當前節點的屬性(即「@name」)提供。所以當@name屬性有「煤」的值,我希望它可以退貨:

<row> 
    <value column="Product">Coal</value> 
    <value column="Quantity">10000</value> 
</row>

這是我想出;我知道這是錯誤的,因爲我沒有得到任何回報。

$table/rows/row[value[@column='Product'][text()[email protected]]]

< /代碼>

+0

如果您只突出顯示XML行,然後按下編輯器工具欄上的「代碼」按鈕(101 010),則可以使用尖括號將實際的XML過帳。無需手動更換所有尖括號<和> ..... – 2010-04-21 15:30:37

+0

哦,謝謝你的提示。我知道應該有一個更簡單的方法:-) – gerrod 2010-04-21 16:40:53

回答

2

您正在明顯缺少current()功能

 
$table/rows/row[value[@column='Product'] = current()/@name] 

在一個XPath謂詞(即方括號內)的上下文節點是謂詞被施加到節點。

在你的情況下,當你說$table/rows/row[[email protected]],那麼@name是指@name屬性row。其中沒有@name屬性,所以對於所有節點,謂詞始終評估爲false

current()返回當前的XSLT上下文節點,以幫助完成這種情況。

+0

完美,感謝Tomalak。我想出了一個解決方法,首先將@name屬性複製到一個變量中,但是你的更好。 – gerrod 2010-04-21 16:39:28

+0

我不認爲你需要current(),也許我錯了,但不是current()和'。'一樣嗎? – 2010-04-21 23:59:52

+2

@vtd:是的,你錯了。如果'current()'與'.'相同,那麼'current()'不存在。 ;) – Tomalak 2010-04-22 00:05:05

相關問題