[ ]
比 // 具有更高的优先级(并且“//”实际上只是一个缩写,而不是一个运算符)。之所以如此,是因为根据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]
最后,一个必要的警告:使用“//”缩写非常昂贵,因为它会导致整个(子)树被遍历。只要文档的结构已知,建议使用更具体的结构(位置路径)。