XPath查询获取元素的第n个实例

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

我需要一个XPathexpression式来做到这一点。 我试过/ / //input[@id="search_query"][2]但这不起作用。 以下是查询失败的示例XMLstring:

 <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元素可以出现在任何地方,没有一致的文档结构(除了我保证总是会有至less两个input元素的id "search_query"属性)。

什么是正确的XPathexpression式?

这是一个常见问题

//somexpression[$N]

的意思是“find每个节点select//somexpression是其父母的第$N个孩子”。

你想要的是

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

请记住[]运算符的优先级高于//缩写的优先级。

这似乎工作:

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

我从Michael Kay的“XSLT 2.0和XPath 2.0程序员参考,第4版”

XMLpath语言规范http://www.w3.org/TR/xpath/#path-abbrev中的“缩写语法”部分也提供了一个提示。;