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

时间:2010-10-24 07:29:53

标签: xml xpath

有一个HTML文件(我无法控制其内容),其中有多个input个元素都具有id的固定"search_query"属性。该文件的内容可能会更改,但我知道我总是想要获取id属性为input的第二个"search_query"元素。

我需要一个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元素可以出现在任何地方,没有一致的文档结构(除了我保证总会有至少两个{id}属性为input的{​​{1}}元素。

什么是正确的XPath表达式?

2 个答案:

答案 0 :(得分:197)

这是常见问题解答

//somexpression[$N]

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

你想要的是

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

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

答案 1 :(得分:14)

这似乎有效:

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

我从迈克尔凯的“XSLT 2.0和XPath 2.0程序员参考,第4版”中了解到这一点。

XML路径语言规范http://www.w3.org/TR/xpath/#path-abbrev的“缩写语法”部分中还有一个注释提供了线索。