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

rla*_*ter 123 xml xpath

有一个HTML文件(我不控制其内容)有几个input元素都具有相同的固定id属性"search_query".文件的内容可以更改,但我知道我总是希望获得input带有id属性的第二个元素"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>
Run Code Online (Sandbox Code Playgroud)

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

什么是正确的XPath表达式?

Dim*_*hev 214

这是一个FAQ:

//somexpression[$N]

表示"查找由其选择的每个节点//somexpression$N其父节点的子节点".

你想要的是:

(//input[@id="search_query"])[2]
Run Code Online (Sandbox Code Playgroud)

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

  • @rlandster:"优先"一词可能令人困惑.//输入的`非缩写形式[@ ID = 'SEARCH_QUERY'] [2]`是:`/ descendat或自身::节点()/子::输入[属性:: ID = 'SEARCH_QUERY'] [位置()= 2]` (10认同)
  • 对于那些从谷歌来到这里的人 - 编号从1开始 - [1]是第一个元素,依此类推 (10认同)
  • 我喜欢这个答案.我没有考虑过优先级问题(我只假设简单的从左到右的优先级). (5认同)

rla*_*ter 16

这似乎有效:

/descendant::input[@id="search_query"][2]
Run Code Online (Sandbox Code Playgroud)

我从迈克尔凯的"XSLT 2.0和XPath 2.0程序员参考,第4版"中得到了这一点.

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