首页 文章

如何制定此XPath表达式以选择兄弟姐妹?

提问于
浏览
3

如何为以下HTML制定XPath表达式以获取 a 节点( value A )之后的第一个输入节点的属性值:

<a href="http://www.link.com">link</a>
<input value="value A" />
<input value="value B" />

我试过了:

//input[(preceding-sibling::a[1])]/@value

但是当我只想要 a 节点是最近的兄弟节点的节点的属性时,这将获得两个输入节点的value属性 .

1 回答

  • 3

    您在错误的节点上使用 [1] 谓词 . 您希望第一个输入具有 preciding-sibling::a ,而不是在给定级别的第一个 a 元素之后的所有输入 .

    这应该会产生正确的结果: //a/following-sibling::input[1]/@value

    这意味着:对于在文档中任何级别找到的每个元素 a ,选择其后面的第一个 input 元素,同时作为它的兄弟 . 然后读取它的 value 属性 .

    对于此输入:

    <xml>
      <p>
        <input value="value A" />
        <a href="http://www.link.com">link</a>
        <input value="value B" />
        <input value="value C" />
      </p>
      <p> 
        <a href="http://www.link.com">link</a>
        <input value="value D" />
        <input value="value E" />
        <a href="http://www.link.com">link</a>
        <input value="value F" />
      </p>
    </xml>
    

    它返回:

    • 值B

    • 值D.

    • 值F.

    编辑

    这是有效的,前提是 a 与其后的第一个 input 之间没有元素 .

    例如,输入如下:

    <a href="http://www.link.com">link</a>
        <strong>OMG NOEZ!</strong>
        <input value="value A" />
    

    值A仍然被选中

    如果没关系,请保留上面的表达式 . 如果不是,请像这样修改它以过滤其他元素:

    //a/following-sibling::*[1][self::input]/@value

    这将选择 a 的第一个以下兄弟,无论标签是什么,只有在它被选中之后才检查实际标签 . 这样,未选择进一步处于同一级别的 input .

相关问题