XPath查询结果顺序

hak*_*kre 8 php xpath libxml2 domdocument

对于另一个问题,我创建了一些与我的开发机器相关的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
Run Code Online (Sandbox Code Playgroud)

我的机器:

#0: This is some 
#1: text
#2: , fine.
Run Code Online (Sandbox Code Playgroud)

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

编辑:

进一步测试显示LIBXML_VERSION两个系统之间存在差异:

Viper Codepad: 20626 (2.6.26; 6 Jun 2006)
My Machine...: 20707 (2.7.7; 15 Mar 2010)
Run Code Online (Sandbox Code Playgroud)

Mic*_*Kay 7

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

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

  • @Michael Kay:谓词的顺序怎么样?XPath 1.0 不是指定节点集按文档顺序排列吗?http://www.w3.org/TR/xpath/#predicates (2认同)

hak*_*kre 4

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

这应该已在 libxml2 2.6.27 中修复。