以简化示例最佳显示:
<?xml version="1.0" encoding="utf-8"?>
<root>
<A name="wrong"></A>
<B>not this</B>
<A name="right">
<subA></subA>
</A>
<B>yes, this</B> <!-- I want only this one -->
<A name="right">
<subA></subA>
</A>
<C>dont want this</C>
<B>not this either</B> <!-- not immediately following -->
</root>
我希望所有<B>
个节点立即跟随<A>
个name
属性等于"right"
的节点。
我尝试了什么:
//A[@name="right"]/following-sibling::*[1]
选择紧跟在“右”<A>
之后的任何节点(即包括<C>
)。我不知道如何只使它<B>
。这不起作用:
//A[@name="right"]/following-sibling::*[1 and B]
这一个:
//A[@name="right"]/following-sibling::B[1]
会在“右侧”<B>
之后选择第一个 <A>
,但不一定会选择紧跟之后的。
答案 0 :(得分:9)
你快到了那里:
//A[@name='right']/following-sibling::*[position()=1 and self::B]
在样本上只提供一个节点。
要在条件中引用元素 name ,您需要self
。简单[B]
表示 text 的元素完全等于B
。
答案 1 :(得分:2)
只是要指出你在问题中显示的第一个XPath并不是那么远:
//A[@name='right']/following-sibling::*[1][local-name()='B']
position()
在这里不是必不可少的。
答案 2 :(得分:0)
你可以尝试这个//B[preceding-sibling::A[1][@name='right']]
这将返回您感兴趣的节点。
希望这有帮助