簡體   English   中英

XPath查詢結果順序

[英]XPath query result order

對於另一個問題,我創建了一些與我的開發機器相關的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

我的機器:

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM