【问题标题】:How can you identify multiple elements with the same name in XPath?如何在 XPath 中识别多个具有相同名称的元素?
【发布时间】:2008-11-26 19:11:16
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: xml xpath


    【解决方案1】:

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

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

    及以后:

    "注意:位置路径//para[1]与位置路径/descendant::para[1]的含义不同。后者选择第一个后代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 经常自动构建键以使“//”表达式快速。
    • @LarsH:是的,您对 Saxon 的优化是正确的,但即使这些优化也取决于文档的大小——我不认为保留自动键索引是通过大型文档完成的。无论如何,人们最好根据经验知道这一点,而不是依赖任何优化器。
    • 我同意,当可以使用更具体的模式或表达式时,避免不必要的“//”是一个很好的经验法则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多