Xpath同级条件(or)

Xpath同级条件(or),xpath,Xpath,我正在尝试查找具有或条件的节点的第一个前面的同级节点。 例如,我有一个节点a,我尝试获取前面的第一个同级B,但如果没有B,则获取前面的第一个同级SPAN 我不知道如何执行或条件: 这就是我所尝试的: 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]|p

我正在尝试查找具有或条件的节点的第一个
前面的同级节点。
例如,我有一个节点
a
,我尝试获取前面的第一个同级
B
,但如果没有
B
,则获取前面的第一个同级
SPAN

我不知道如何执行或条件:
这就是我所尝试的:

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
简言之,我正在寻找:Node->
前面的同级节点::NodeType1[1]
前面的同级节点::NodeType2[1]

有没有办法用Xpath实现这一点,或者我必须尝试其中一种,如果没有结果,就尝试另一种

编辑:

这个问题的好答案是我认为StuartLC的答案(我没有尝试过)。

如果要查找
B
SPAN
之间的第一个节点,请使用har07 answer。

您可以尝试以下方法:

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

根据Michael的评论,请注意,
*[name()='B'或name()='SPAN']
将返回前面的第一个
兄弟姐妹,即
B
SPAN

如果我正确理解了您的问题,您只想在没有
B
之前的兄弟姐妹
A
时“回退”到
SPAN
。好的,您需要使用union重复查询:

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

谢谢,这正是我想要的。它可能是你想要的,但不是你想要的。如果它在找到B之前找到了一个SPAN,它将返回SPAN,而你说你想要B。@Michael Kay你是对的,但那是我的错,我的问题是不正确的。这就是我想要的答案。我认为你的答案很好,完全符合我的要求,但不是我想要的。我想我的英语不够好。很抱歉我将更新我的问题,以避免混淆您的答案和har07答案好的,明白了:)希望绊倒在这篇文章上的人能理解!