如何在XPath中识别具有相同名称的多个元素?

use*_*129 9 xml xpath

如果我有一个具有相同名称的多个元素的文档怎么办 - 例如,如何检索第二个元素?

<doc>
...
 <element name="same">foo</element>
...
 <element name="same">bar</element>
...
 <element name="same">baz</element>
...
</doc>
Run Code Online (Sandbox Code Playgroud)

我希望像// elem [@ name ='same'] [2]这样的东西可以工作.

另外,我如何从xpath中的最后一个元素中找到具有可变数量的具有相同名称的元素的第二个元素

Dim*_*hev 20

[ ]优先级高于//(而"//"实际上只是一个缩写,而不是运算符).这是如此,因为根据XPath 1.0规范,

"//是/ descendant-or-self :: node()/"的缩写

然后:

" 注意:位置路径//第1段并不意味着与位置路径/后代::第1段相同.后者选择第一个后代para元素;前者选择所有后代para元素,它们是他们的第一个para子元素父母."

因此,XPath表达式:

     //element[@name='same'][2]

手段:

选择文档中名为"element"的任何元素,其属性"name"的值为"same",此元素是其父元素的第二个子元素.

你想要的是:

     (//element[@name='same'])[2]

注意括号,它覆盖[]的较高优先级.

同样,最后一个这样的节点由以下XPath表达式选择:

     (//element[@name='same'])[last()-1]

最后,一个必要的警告:使用"//"缩写非常昂贵,因为它会导致遍历整个(子)树.每当知道文档的结构时,建议使用更具体的结构(位置路径).

  • +1,感谢有用的解释为什么`// para [1]`,即`/ descendant-or-self :: node()/ para [1]`与`/ descendant :: para [1]不同`.回复:"使用"//"缩写是非常昂贵的" - 我会说"*可能*非常昂贵,但它在很大程度上取决于处理器." 例如,Saxon非常聪明地进行优化,而AFAIU通常会自动构建密钥,以便快速制作"//"表达式. (2认同)