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

时间:2012-08-25 22:24:23

标签: xpath

如何为以下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 个答案:

答案 0 :(得分: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