如何构造这个XPath表达式来选择同级?

如何构造这个XPath表达式来选择同级?,xpath,Xpath,如何为以下HTML的a节点(value a)后面的第一个输入节点获取属性值,制定XPath表达式: <a href="http://www.link.com">link</a> <input value="value A" /> <input value="value B" /> 但是当我只需要a节点是最近的前一个同级节点的节点的属性时,这会获取两个输入节点的value属性。您在错误的节点上使用了[1]谓词。您希望第一个输入具有精确同级::a,而

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

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

但是当我只需要
a
节点是最近的前一个同级节点的节点的属性时,这会获取两个输入节点的value属性。

您在错误的节点上使用了
[1]
谓词。您希望第一个输入具有
精确同级::a
,而不是在给定级别上跟随第一个
a
元素的所有输入

这将产生正确的结果:
//a/以下同级::输入[1]/@value

这意味着:对于文档中任何级别上找到的每个元素
a
,选择紧随其后的第一个
input
元素,同时选择其同级元素。然后读取其
属性

对于此输入:

<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>
值仍然被选中

如果可以,保留上面的表达式。如果不是,则按如下方式修改以过滤其他元素:

//a/以下同级::*[1][self::input]/@value

这将选择
a
的第一个后续同级,无论标记是什么,只有在选择后才会检查实际标记。这样就不会选择同一级别的
输入

<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>
    <a href="http://www.link.com">link</a>
    <strong>OMG NOEZ!</strong>
    <input value="value A" />