3

如何制定 XPath 表达式以获取以下 HTML的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 属性。

4

1 回答 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就不会选择在同一级别上更远的那个。

于 2012-08-25T22:46:32.017 回答