XPath获取子集的第一个元素。

25

我有这样的XML:

<AAA>
    <BBB aaa="111" bbb="222">
        <CCC/>
        <CCC xxx="555" yyy="666" zzz="777"/>
    </BBB>
    <BBB aaa="999">
        <CCC xxx="qq"/>
        <DDD xxx="ww"/>
        <EEE xxx="oo"/>
    </BBB>
    <BBB>
        <DDD xxx="oo"/>
    </BBB>
</AAA>

我想获取第一个<CCC>元素。但使用XPath表达式//*/CCC[1],我得到了两个<CCC>元素。它们中的每一个都是<BBB></BBB>上下文中的第一个元素。如何获取子集中的第一个元素?


1
好问题,+1。请看我的答案,其中包含一个完整、简短、易于理解的一行XPath表达式,可以精确选择所需的元素。 :) - Dimitre Novatchev
可能是重复的问题:使用XPath只选择第一个实例? - user357812
很好的问题。实际上,我最近在博客文章中讨论了这个问题! - General Redneck
2个回答

44

这个应该适用于你:

(//*/CCC)[1]

15

我想获取第一个元素。但是使用XPath表达式//*/CCC[1],我得到了两个元素。它们各自是<BBB></BBB>上下文中的第一个元素。如何在子集中获取第一个元素?

这是一个FAQ:

[]运算符的优先级(绑定强度)高于//缩写。

使用方法:

(//CCC)[1]

这个选择器会选中 XML 文档中第一个出现(按文档顺序)的 CCC 元素。


那么,是什么导致了这个问题? - Dimitre Novatchev
@Priti,这是一个规则,它说CDATA只是文本节点值的(一部分)词汇表示。这与当前问题/答案无关。如果你有任何有用的XPath书籍,你就不会问这样基础的问题了。或者如果你把这个问题作为一个合适的SO问题来问,那么很多人会迅速回答。 - Dimitre Novatchev
@Priti,我在这里解释了:https://dev59.com/Om865IYBdhLWcg3wEKSZ#4008925 - Dimitre Novatchev
1
@Priti,当您指定<xsl:output method="xml/>(这是默认输出方法)时,就会发生这种情况。如果您指定<xsl:output method="text"/>,则字符将不被转义。 - Dimitre Novatchev
这是我的问题 - Arup Rakshit
谢谢...我一直在等你,希望你能再补充点什么。既然你批准了,我就把它标记为已接受的答案。 - Arup Rakshit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接