繁体   English   中英

XPath查询结果顺序

[英]XPath query result order

对于另一个问题,我创建了一些与我的开发机器相关的XML相关代码,但在viper键盘上没有,我在测试之前将其添加到我的答案中。

我可以减少我的问题, DOMXPath::query()返回的节点顺序在我的系统和键盘之间有所不同。

XML: <test>This is some <span>text</span>, fine.</test>

当我查询所有文本节点//child::text() ,结果不同:

Viper键盘:

#0: This is some 
#1: , fine.
#2: text

我的机器:

#0: This is some 
#1: text
#2: , fine.

我不熟悉xpath,我确实理解为什么会发生这种情况以及如何使用PHP实现来影响返回顺序。

编辑:

进一步的测试表明, LIBXML_VERSION在两个系统之间有所不同:

Viper Codepad: 20626 (2.6.26; 6 Jun 2006)
My Machine...: 20707 (2.7.7; 15 Mar 2010)

从技术上讲,XPath 1.0返回节点集而不是节点序列。 在XPath 1.0规范中,没有关于这些节点集的顺序的陈述 - 事实上,作为集合,它们没有内在的顺序。

但是,XSLT 1.0始终按文档顺序处理XPath 1.0返回的节点集,并且由于该先例,人们普遍期望当从XSLT以外的语言调用XPath时,XPath结果将按文档顺序排列。 但是,规范中没有任何内容可以保证这一点。 在XPath 2.0中,用户期望成为规范的一部分,路径表达式的结果必须按文档顺序排列。

我可以找到以下错误报告看起来像这个问题: 错误363252 - libxml2的xmlXPathEvalExpression()中的接近位置报告于2006年10月18日,并确认自2006年5月以来回溯到2.6.26版本之前。

这应该在libxml2 2.6.27中修复。

它看起来像是20626版本中的一个错误:

它首先按文档顺序处理所有子文本节点,然后处理子元素节点的内容。 应该是你的机器上的结果

XPath是一种查询语言,因此它应该只读取.xml文档的结构,而不是修改它。 这包括节点顺序。 在你的第一个例子中,这不是真的。 所以这肯定是根据错误

Viper Codepad似乎没有按照第一个文档顺序返回所选的text()节点,而是进行广度优先评估。

它应该是深度优先遍历。

Saxon,MSXML,Altova XML均以深度优先顺序返回结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM