12

如果我有一个包含多个同名元素的文档怎么办——例如,我将如何检索第二个元素?

<doc>
...
 <element name="same">foo</element>
...
 <element name="same">bar</element>
...
 <element name="same">baz</element>
...
</doc>

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

此外,我如何在 xpath 中找到倒数第二个元素,其中具有可变数量的同名元素

4

1 回答 1

28

[ ]比 // 具有更高的优先级(并且“//”实际上只是一个缩写,而不是一个运算符)。之所以如此,是因为根据XPath 1.0 Spec

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

然后:

注意:位置路径与位置路径//para[1]的含义不同/descendant::para[1]。后者选择第一个后代 para 元素;前者选择所有后代 para 元素,它们是其父母的第一个 para 子元素。”

因此,XPath 表达式:

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

方法:

选择文档中名为“element”的任何元素,该元素具有属性“name”,值为“same”,并且该元素是其父元素的第二个此类子元素。

你想要的是

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

注意括号,它覆盖了 [] 的更高优先级。

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

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

最后,一个必要的警告:使用“//”缩写非常昂贵,因为它会导致整个(子)树被遍历。只要文档的结构已知,建议使用更具体的结构(位置路径)。

于 2008-11-26T20:23:12.440 回答