2012-12-30 50 views
1

如何找到包含另一個節點名稱的節點?查找其文本值與另一個節點匹配的節點

例如,如果<a>存在,<b>包含文本「一」那麼我希望選擇<b>但如果給出的名稱不存在。

<root> 
    <a /> <!-- Do not care what is in this for now --> 
    <b>a</b> <!-- Find this node only --> 
    <b>c</b> <!-- This node is unwanted --> 
</root> 

我知道我可以有效地比較name()text()值,下面發現其自身引用節點,並排除他人:

*[name() = text()] 

我試圖找到其他的引用失敗,因爲text()在此查詢是錯誤的背景:

b[../*[name() = text()]] 

以上只是返回所有<b>至少有一個包含它自己的名字的兄弟姐妹,如果有<a>a</a>

我需要一個節點的文本比較a collection of names。我相信這應該是我所期待的,但*/name()拋出一個語法錯誤:

b[text() = ../*/name()] 

回答

0

我不認爲這是可能的XPath 1.0中,因爲XPath 1.0中不提供用於定義表達式/條款範圍變量。此外,XPath 1.0不允許將函數調用作爲位置步驟。

一個XPath 2.0解決方案易於

b[. = ../*//name()] 
+0

這就解釋了爲什麼PHP提供了一個語法錯誤,它還不支持2.0。我別無選擇,只能遍歷每個參考並明確檢查它們。 – clockworkgeek

+0

@clockworkgeek,是的,是不是可以使用其他XSLT處理器,如Saxon,Altova或XQSharp? –

+0

與我正在開發的應用程序不同,它已經在使用SimpleXML。 – clockworkgeek

相關問題