2014-09-04 39 views
1

我正在嘗試爲下面的xml文件(顯然縮寫)創建一個xpath表達式。Xpath:比較小數類型的節點屬性

<estimate> 
    <heights id="4.1"> 
    <year>1985</year> 
    </heights> 
    <heights id="4.2"> 
    <year>1986</year> 
    </heights> 
    <heights id="4.3"> 
    <year>1987</year> 
    </heights> 
    . 
    . 
    . 
    <heights id="x.x"> 
    <year>XXXX</year> 
    </heights> 
</estimate> 

我使用XPath表達式是:

/estimate/heights[@id>4.2] 

所以我基本上是在尋找與節點比IDS在這種情況下,更大的4.2。雖然這似乎工作時,我玩它,我擔心,我實際上並沒有比較浮動浮動或雙倍。如果我讀XPATH 2.0正確的維基百科條目,好像它會施放屬性爲適當的類型:

如果沒有模式是在使用中,該節點將是無類型,以及 類型所原子值將是untypedAtomic。鍵入的原子值是 檢查以確保它們具有使用上下文 的適當類型:例如,不可能將 日期乘以數字。相比之下,非類型化的原子值會遵循一個弱的 輸入規則:它們會自動轉換爲適用於它們的操作的 類型:例如,使用 算術運算,將無類型原子值轉換爲類型 double。

我已經做了很多的搜索,並沒有發現任何明確的,但(我並不清楚,如果上面引述的語句適用於我的情況。)

+1

我覺得你很好。如果你想要一些明確的,正確的地方是規格,例如在http://www.w3.org/TR/xquery-operators/#comp.numeric – LarsH 2014-09-05 02:33:29

回答

1

首先,你真的需要清除這是XPath 1.0還是XPath 2.0(或XPath 2.0以向後兼容模式運行)。對於這個特定的例子,這些規則可能具有相同的效果,但它們表達的方式非常不同。

在XPath 1.0中,您將節點集與數字(= double)進行比較,如果節點集中的任何節點在轉換爲數字(= double)之後的結果大於4.2,則結果爲true。如果節點集爲空(即如果@id不存在),或者轉換產生NaN(即如果@id不是數字),則結果爲false。

在XPath 2.0中,假設數據是無類型的(即它不是模式感知處理器),您將比較節點序列和xs:decimal。節點被霧化,產生一系列xs:untypedAtomic值,爲了比較的目的,這些節點被轉換爲xs:double(因爲另一個操作數是數字)。再次,如果任何值大於4.2,答案是正確的。與XPath 1.0規則唯一有效的區別是,如果@id不是數字,則會失敗,並且會出現動態錯誤,而XPath 1.0會給出「false」。

在啓用了向後兼容性的XPath 2.0中,轉換爲double使用number()函數而不是轉換,因此非數字@id值會轉換爲NaN,並且結果爲false,因爲它在XPath 1.0中。

+0

因此,如果我理解正確,我沒有在我的例子中出現錯誤的事實表明我正在使用XPath 2.0。不幸的是,找到我正在使用的XPath版本(Visual Studio 2010,.NET 4)被證明比想象的更困難。 – stackbacker 2014-09-06 17:53:08

+0

我不明白你如何從我的帖子中得出推論。請再讀一遍。我描述了XPath 1.0將產生結果的情況(不存在於源數據中),XPath 2.0將產生錯誤。由於您使用的是沒有第三方庫的Microsoft軟件,因此您正在使用XPath 1.0。 – 2014-09-06 22:11:58

+0

對不起,我誤解了你使用我的例子中的數字。我對XML/XPath很陌生。我想我的主要問題是,如果我的上面的例子是有效的,尤其是因爲,正如你所指出的,我使用的是XPath 1.0。 – stackbacker 2014-09-07 00:44:59