XPath:选择文本节点


150

具有以下XML:

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

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

像这样:

/node/text()[2]

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


11
您写道:/node/text()[2][...]不起作用,因为它是节点内每个文本的合并结果。这是错误的:它表示root元素的第二个文本节点子级node。该字符串值(下级文本节点的连接)将是string(/node)

您的意思是Xpath查询应该工作吗?好吧,我想我那时在其他地方还有另一个问题。;) 谢谢!
内核

好问题,+ 1。请参阅我的答案以获取解释以及一些XPath表达式,这些表达式选择top元素的全部或特定的text-node子元素。
Dimitre Novatchev 2011年

Answers:


183

具有以下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]

@NaftuliTzviKay:这意味着Chrome已损坏。/node[2]如果源XML文档格式正确,则不能选择任何节点。根据定义,在格式正确的XML文档中,只有一个(单个)顶部元素-也称为document-element
Dimitre Novatchev

1
这在PHP中有效吗?我试图仅遍历文本节点,甚至是一组标记之间的文本节点。问题在于,无论标签如何,都将多个文本节点的内容粉碎在一起。//*[text()]无论如何使用。/html/text()不起作用。
亚伦·吉利恩

2
@AaronGillion,是的,AFAIK PHP具有正确运行的XPath 1.0评估。请注意,/html/text()并不会选择文档中的所有文本节点,而只会选择顶部html元素的子级(而非后代)的文本节点。你可能想要/html//text() 。为了构造XPath表达式,通常需要对XPath有所了解。
Dimitre Novatchev

谢谢。我有点想出了双斜杠的把戏!
亚伦·吉利恩

@AaronGillion,不客气。您可以在此在线培训课程的模块2中学习XPath 1.0和2.0的基础知识:duplexsight.com/courses/xslt-foundations-part1
Dimitre Novatchev

29

您的xpath应该工作。我已经在MarkLogic和Zorba Xquery / Xpath实现中测试了您的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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.