2015-01-07 36 views
0

如何讓XPath(1)單線程優先級在Firefox中工作?爲什麼|在Firefox中「失敗」,但在Chrome中「起作用」?在Firefox中對XPath進行排序

哪一個是正確的(如果在規範中定義了這種行爲)以及如何讓它在全局中工作?

<a>b</a> 
<a id="b"></a> 

鉻39.0.2171.95

> $x("//a[@id='b'] | //a[text()='b']") 
< [<a id=​"b">​</a>​, <a>​b​</a>​] 

火狐34.0.5

> $x("//a[@id='b'] | //a[text()='b']") 
< Array [ <a>, <a#b> ] 

編輯:除去or選擇例如作爲問題是在Firefox而不是有關約|行爲兩者的區別。

+0

Firefox以何種方式「失敗」?也許[這](http://stackoverflow.com/questions/25407504/what-is-the-difference-between-or-and-when-programming-in-xslt/25407704#25407704)也可以幫助你瞭解區別? –

+0

@MathiasMüller謝謝,似乎Chrome在這裏是錯誤的,因爲規範明確指出文檔順序。需要爲「懶惰」選擇器找到另一種方式。 –

+0

1)node-set是一個無序的節點列表 - 決定如何對所選節點進行排序需要執行,通常它們保留DOM順序; 2)規範沒有定義由|生成的節點集的順序運營商,所以它再次實施來處理。 Chrome和FF都遵循規範,雖然 – comeGetSome

回答

1

我只能引用博士Michael Kay,saying

XPath 1.0 s pecification定義了一個路徑表達式(或者一個聯合表達式)返回一個節點集,也就是無序的一組節點。 某些主機語言(例如XSLT 1.0)指定按文檔順序處理的節點集總是 。但是你看起來(據我所知)是 從一些微軟的API調用XPath,我不知道這個API說 關於處理順序:它取決於XPath主機語言來定義它, 或它可以選擇不定義它。

而且,如果主要的瀏覽器都不應採取的XPath 2.0:

這改變了XPath 2。0,它指定路徑表達式和union表達式以文檔順序返回一系列不同節點。

在你的情況,這僅僅意味着:如果設置結果的順序和重複怎麼了你,請不要使用|union運營商。如果這樣的表達式以相同的順序返回Firefox和Chrome的結果,請使用包含or(您現在編輯的路徑表達式不包含在您的問題中)的謂詞。

但在一般情況下,文檔順序不能保證對於節點集,因爲unorderedness是集的屬性:

的第二個重要點是,爲了在其中一組中的元素列是不相關的(與序列或元組不同)(來自:Set(mathematics))。

不過,XPath 1.0中的許多實現在返回「項目」節點集合中文檔順序 - 不是因爲他們都有義務規範這樣做,而是因爲在許多情況下,返回的文檔結果順序真的很有意義。


有幾個非常類似的問題已經,例如this questionthis one

1

the |運算符不是或,它是一個聯合,因此節點集將包含由左側xpath(管道左側)和右側xpath選擇的元素的子集。

選擇

"//a[@id='b' or text()='b']" 

讀取:遍歷順序的所有「a」元素它們出現在DOM和評估謂詞[..],如果謂詞計算結果爲「真」,則遍歷元件是加入導致節點集合

選擇

"//a[@id='b'] | //a[text()='b']" 

讀取:應用一個// [@ ID = 'b'](如上所述),然後應用一個// [文本()=」 b']並最終將結果一起加入r設計一個包含兩個結果的節點集。

結果中元素的順序與顛倒相同,即它保留了文檔中的順序,但聯合不包含重複項(因爲一個節點集可能不包含重複項),即// a | //一個結果在同一節點集

但是,它沒有定義工會組織如何(|)應該處理順序,因此其高達實施,因此,你在Chrome中看到不同的結果VS FF