2014-12-13 69 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