【问题标题】:XPath: select text nodeXPath:选择文本节点
【发布时间】:2011-06-29 08:52:58
【问题描述】:

具有以下 XML:

<node>Text1<subnode/>text2</node>

如何通过 XPath 选择第一个或第二个文本节点?

类似这样的:

/node/text()[2]

当然不行,因为它是节点内每个文本的合并结果。

【问题讨论】:

  • 你写道:/node/text()[2] [...] 不起作用,因为它是节点内每个文本的合并结果 错了:它意味着 node 根元素的文本节点子节点字符串值(后代文本节点的串联)将为string(/node)
  • 您的意思是 Xpath 查询应该可以工作?好吧,我想我在其他地方还有另一个问题。 ;) 谢谢!

标签: xml xpath selection


【解决方案1】:

您的 xpath 应该可以工作。我已经在 MarkLogic 和 Zorba Xquery/ Xpath 实现中测试了你和我的 xpath。

两者都应该工作。

/node/child::text()[1] - should return Text1
/node/child::text()[2] - should return text2


/node/text()[1] - should return Text1
/node/text()[2] - should return text2

【讨论】:

    【解决方案2】:

    具有以下 XML:

    <node>Text1<subnode/>text2</node> 
    

    如何选择第一个或 通过 XPath 的第二个文本节点?

    使用

    /node/text()
    

    这将选择 XML 文档顶部元素(名为“节点”)的所有文本节点子节点。

    /node/text()[1]
    

    这将选择 XML 文档顶部元素(名为“节点”)的第一个文本节点子节点。

    /node/text()[2]
    

    这将选择 XML 文档顶部元素(名为“节点”)的第二个文本节点子节点。

    /node/text()[someInteger]
    

    这将选择 XML 文档顶部元素(名为“节点”)的第 someInteger 文本节点子节点。它等价于以下 XPath 表达式:

    /node/text()[position() = someInteger]
    

    【讨论】:

    • 这在 PHP 中有效吗?我试图只遍历文本节点,即使是一组标签之间的节点。问题在于将多个文本节点的内容粉碎在一起,而不管标签如何。无论如何使用//*[text()]/html/text() 不起作用。
    • @AaronGillion,是的,AFAIK PHP 具有正确工作的 XPath 1.0 评估。请注意/html/text() 不会选择文档中的所有文本节点——只选择顶部html 元素的子节点(不是后代)的文本节点。您可能想要 /html//text() 。为了构建 XPath 表达式,通常需要一些 XPath 知识和理解。
    • 谢谢。我之前想出了双斜线的把戏!
    • @AaronGillion,不客气。您可以在本在线培训课程的模块 2 中学习 XPath 1.0 和 2.0 的基础知识:pluralsight.com/courses/xslt-foundations-part1
    猜你喜欢
    • 1970-01-01
    • 2018-03-15
    • 2011-05-30
    • 1970-01-01
    • 2016-09-06
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-01-23
    相关资源
    最近更新 更多