XPath 查询获取元素的 nth 实例

有一个 HTML 文件(其内容我不控制) ,它有几个 input元素,所有这些元素都具有相同的 "search_query"的固定 id属性。文件的内容可以更改,但是我知道我总是希望获得第二个具有 id 属性 "search_query"input元素。

我需要一个 XPath 表达式来完成此操作。我试过 //input[@id="search_query"][2],但没有工作。下面是查询失败的 XML 字符串示例:

<div>
<form>
<input id="search_query" />
</form>
</div>


<div>
<form>
<input id="search_query" />
</form>
</div>


<div>
<form>
<input id="search_query" />
</form>
</div>

请记住,上面只是一个例子,其他 HTML 代码可能有很大的不同,input元素可以出现在任何地方,没有一致的文档结构(除了我保证总是至少有两个 input元素的 id 属性为 "search_query")。

正确的 XPath 表达式是什么?

192371 次浏览

这似乎行得通:

/descendant::input[@id="search_query"][2]

我从 Michael Kay 的“ XSLT 2.0和 XPath 2.0程序员参考资料,第4版”中学到了这一点。

在 XPath 规范 abc0的“缩写语法”部分也有一个提示,提供了一个线索。

这是一个常见问题 :

//somexpression[$N]

表示“查找由 //somexpression选择的作为其父节点的 $N子节点的每个节点”。

你想要的是:

(//input[@id="search_query"])[2]

记住 : []操作符的优先级(优先级)高于 //缩写。