XPATH:选择紧跟在某些特定节点之后的给定名称的节点

时间:2011-06-16 10:20:43

标签: xml xpath

以简化示例最佳显示:

<?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>,但不一定会选择紧跟之后的

3 个答案:

答案 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']] 这将返回您感兴趣的节点。

希望这有帮助