【问题标题】:XPATH: select nodes of given name which are immediately following some specific nodesXPATH:选择紧跟在某些特定节点之后的给定名称的节点
【发布时间】:2011-06-16 10:20:43
【问题描述】:

最好通过一个简化的例子来展示:

<?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>

我希望所有&lt;B&gt; 节点立即 跟随&lt;A&gt; 节点,name 属性等于"right"

我尝试了什么:

//A[@name="right"]/following-sibling::*[1]

选择紧跟“右”&lt;A&gt;(即包括&lt;C&gt;)之后的任何节点。我不知道如何使它只有&lt;B&gt;。这不起作用:

//A[@name="right"]/following-sibling::*[1 and B]

这个:

//A[@name="right"]/following-sibling::B[1]

会选择“右”&lt;A&gt; 之后的第一个 &lt;B&gt;,但不一定是紧随其后的

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

    你快到了:

    //A[@name='right']/following-sibling::*[position()=1 and self::B]
    

    在您的样本上只给出一个节点。

    要在条件中引用元素name,您需要self。简单的[B] 意味着一个元素的text 完全等于B

    【讨论】:

    • 我通常会写//A[@name='right']/following-sibling::*[1][self::B] - 部分是为了简洁,部分是因为self::B 是在存在命名空间的情况下更准确的测试。
    【解决方案2】:

    只是要指出,您的问题中显示的第一个 XPath 到目前为止还没有:

      //A[@name='right']/following-sibling::*[1][local-name()='B']
    

    position()在这里不是必不可少的。

    【讨论】:

    • 不客气。这不是真正的“链接”。您只是将谓词应用于所有选定节点中的 first 紧随其后的节点。这是选择相邻的跟随兄弟的常用方法。
    【解决方案3】:

    你可以试试这个//B[preceding-sibling::A[1][@name='right']] 这将返回您感兴趣的节点。

    希望对你有帮助

    【讨论】:

    • 不强制前面的元素是A,只是它具有适当的属性。在我阅读时,您的回答不符合简报。
    • 这应该符合要求!
    • //B[preceding-sibling::A[1][@name='right']] 查找前面的第一个 A 元素,而不是前面的第一个元素是 A
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多