如何为以下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属性。
答案 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>
它返回:
如果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
。