[英]XPath query result order
對於另一個問題,我創建了一些與我的開發機器相關的XML相關代碼,但在viper鍵盤上沒有,我在測試之前將其添加到我的答案中。
我可以減少我的問題, DOMXPath::query()
返回的節點順序在我的系統和鍵盤之間有所不同。
XML: <test>This is some <span>text</span>, fine.</test>
當我查詢所有文本節點//child::text()
,結果不同:
#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.