2008-11-26 101 views
9

如果我有一个具有多个元素的文档具有相同的名称会怎么样?例如,我将如何检索第二个元素?如何识别XPath中具有相同名称的多个元素?

​​

我期望像// elem [@ name ='same'] [2]这样的工作。

此外,我将如何找到最后一个元素XPath中的第二位元素的可变数量的同名

回答

17

[ ]具有更高的优先级比//(和“//”,其实只是一个缩写,不是运营商)。之所以如此,是因为根据XPath 1.0 Spec

“//是短期的/后代或自身::节点()/”

后来:

:该位置路径//第1不等同于位置路径/后代:第1。后者选择第一个后代para元素;前者选择所有后代para元素,它们是父母的第一个para孩子。

因此,XPath表达式:

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

指:

选择文档中的任何元件,其被命名为 “元件”,具有属性 “名称” 与价值“相同”,这个元素是其父母的第二个这样的孩子。

你想要的是

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

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

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

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

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

+2

+1,谢谢你为什么`/ para [1]`,也就是`/ descendant-or-self :: node()/ para [1]`和/ descendant :: para [1]`。回复:“使用”//“的缩写非常昂贵” - 我会说“*可能*非常昂贵,但它很大程度上取决于处理器。”例如,撒克逊人对于优化非常聪明,AFAIU通常会自动构建密钥,以便快速制作“//”表达式。 – LarsH 2010-10-19 02:41:50

相关问题