2011-11-19 4 views
8

another question에 대해 필자는 개발 컴퓨터에서 작동하는 XML 관련 코드를 만들었지 만 바이 패스 코드 패드에서는 내 대답에 추가하기 전에 테스트했습니다.XPath 쿼리 결과 순서

DOMXPath::query()에 의해 반환 된 노드 순서가 내 시스템과 코드 패드간에 다른 점까지 내 문제를 줄일 수 있습니다.

XML : 나는 모든 textnodes를 조회 할 때 <test>This is some <span>text</span>, fine.</test>

//child::text() 결과는 다릅니다

Viper Codepad:

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

내 기계 :

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

PHP가 구현 된 이유를 이해하고 PHP 반환 순서에 영향을 미치는 방법을 이해할 수있는 xpath 경험이 없습니다.

편집 :

또한 테스트 LIBXML_VERSION이 두 시스템 사이에 차이가 있음을 밝혔다

:

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

답변

2

그것은 20626 버전의 버그 같습니다

그것은 먼저 모든 자식 텍스트를 처리 문서 순서의 노드, 자식 요소 노드의 내용 귀하의 컴퓨터에서 결과가 있어야합니다

+1

이것이 Occam에 따르면 가장 가능성있는 설명이지만 libxml changelog에 버그 보고서 또는 표시기가 있어야 그 것을 확인할 수 있습니다. – 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 Codepad는 선택된 노드를 깊이있는 첫 번째 문서 순서로 반환하지만 첫 번째로 광범위한 평가를 수행하는 것으로 보입니다.

깊이 우선 탐색입니다.

Saxon, 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

@Michael Kay : 술어를 사용하는 순서는 어떻습니까? XPath 1.0이 노드 집합을 문서 순서로 지정하지 않습니까? http://www.w3.org/TR/xpath/#predicates – hakre