2011-11-19 109 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