2011-11-19 112 views
8

对于another question我已经创造了一些XML相关的代码,我的开发机器上,但不是在那里我将它添加到我的回答之前,测试它的毒蛇键盘的工作原理。XPath查询结果为了

我能减少我的问题,通过DOMXPath::query()返回节点的顺序我的系统和键盘之间的不同点。

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

当我查询所有textnodes //child::text()结果不同:

Viper Codepad:

#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) 

回答

2

它看起来像在20626版本的BUG:

IT流程首先子文本按照文档顺序的节点,然后是子元素节点的内容。应该是你的机器上的结果

+1

虽然这是根据Occam最有可能的解释,但应该在libxml更改日志中有一个错误报告或指示符,然后验证。 – Gordon

+0

你从哪里获得这些信息?如果可以,请添加一些链接到一些官方资源。 – hakre

+0

这只是我的假设,这是一个问题 - 因为xpath导致不正确的节点顺序。目前我只找到[this](http://mail.gnome.org/archives/xml/2008-November/msg00112.html),但它不相关。并且可能[this](http://mail.gnome.org/archives/xml/2005-May/msg00035.html)也是 – Vitaliy

1

看来,Viper键盘并没有返回所选的text()节点的深度优先文件顺序,而是进行了广度优先评估。

它应该是深度优先遍历。

撒克逊,MSXML,Altova的XML每个返回以深度优先的顺序的结果。

2

XPath是一种查询语言,因此它应该只读取的.xml文件的结构是,从来没有修改它。这包括节点顺序。但在你的第一个例子中,这是不正确的。所以这绝对是根据this的错误。

+0

是的,这就是我的想法,或者至少我如何理解xpath定义中的术语* Document Order *。 – hakre

7

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

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

+0

+1,以获得正确和翔实的答案。 –

+0

libxml2按照设计惯例总是按文档顺序返回。即使对于不需要订购的示例属性也是如此。 – hakre

+1

@迈克尔凯:谓词顺序怎么样? XPath 1.0不指定节点集是否按文档顺序? http://www.w3.org/TR/xpath/#predicates – hakre