2014-12-13 80 views
2

我試圖找到具有OR條件的節點的第一個preceding-sibling
例如,我有一個節點A,我試着得到第一個兄弟B,但是如果沒有B,那麼得到第一個兄弟SPANXpath兄弟情況(或)

我不知道該怎麼辦OR條件:
這是我的嘗試:

A//preceding-sibling::B|SPAN[1] 
A//preceding-sibling::B[1]|SPAN[1] 
A//preceding-sibling::B[1]|preceding-sibling::SPAN[1] 
A//(preceding-sibling::B[1]|preceding-sibling::SPAN[1]) // Xpath invalid 
A//preceding-sibling::(B|SPAN)[1] // Xpath invalid 
.... and many more 

總之我在尋找:節點 - >preceding-sibling::NodeType1[1]preceding-sibling::NodeType2[1]

是有一種方法可以通過Xpath來實現,或者我必須嘗試一個,如果沒有結果,請嘗試另一個?

編輯:

好這個問題的答案是,我認爲StuartLC答案(我沒有嘗試)。
如果您正在尋找BSPAN之間的第一個節點,那麼使用har07答案。

回答

1

你可以嘗試,而不是這樣:

A//preceding-sibling::*[name()='B' or name()='SPAN'][1] 
+0

謝謝,這正是我一直在尋找。 – Duffydake 2014-12-13 02:38:01

+2

這可能是你在找的東西,但這不是你要求的。如果在發現B之前發現SPAN,它將返回SPAN,而你說你想要B。 – 2014-12-13 09:50:25

+0

@Michael Kay你是對的,但這是我的錯,我的問題是不正確的。這是我想要的答案。 – Duffydake 2014-12-13 11:27:11

2

按照邁克爾的評論,請注意*[name()='B' or name()='SPAN']將返回第一個preceding-sibling要麼是BSPAN

如果我正確理解你的問題,你想「回退」到SPAN僅IFF沒有Bpreceding-sibling S的A可言。 AFAIK你將需要重複查詢與聯盟:

(A/preceding-sibling::B[1] | A/preceding-sibling::SPAN[1])[1] 
+0

我認爲你的回答很好,正是我所問的,而不是我想要的。我想我的英語不夠好。抱歉。我會更新我的問題,以避免混淆你的答案和 har07答案 – Duffydake 2014-12-13 11:33:47

+0

好吧,明白了:)希望民間絆倒在這篇文章將明白! – StuartLC 2014-12-13 11:48:47