2014-02-12 24 views
2

我對XPath有點新,我發現要獲得最大屬性數,我可以使用下面的語句://Book[not(@id > //Book/@id),它工作得很好。需要關於在XPath中獲取最大值的一些解釋

我只是不明白爲什麼它會返回最大ID而不是最小ID,因爲它看起來像我正在檢查節點ID是否大於任何其他節點ids,然後返回一個書,它不是。

我可能是愚蠢的,但是請,有人解釋:)

回答

1

您不是查詢最大值,而是查詢最小值。您的查詢

//Book[not(@id > //Book/@id) 

可以轉換爲自然語言「找到所有書籍,其中沒有一個@id比任何其他書的@id更大」。你可能想使用

//Book[not(@id < //Book/@id) 

對於任意輸入你可能想用<=代替,因此它只返回單個最大值(或根本沒有,如果它是共享的)。由於@id必須是唯一的,這裏沒關係。

請注意,//Book[@id > //Book/@id]不等於上面的查詢,雖然數學會建議如此。 XPath的比較運算符遵循一種集合語義:如果左側的任何值大於右側的任何值,則謂詞將爲真;因此它將包括所有書籍,但價值至少爲@id

+0

非常感謝!這是我正在尋找的解釋。 我不明白的唯一原因是爲什麼'<='會返回一個最大值? 在你的最後一個例子中,我認爲你的意思是'如果左邊的任何值比**右邊的任何值都大**,因爲你有一個大於運算符。 – stee1rat

+0

'<='只返回單個最大值。如果將有兩本書具有相同(最大)ID,則不會返回,因爲有另一本書具有相同的ID。你對最後一句話是對的,我更新了答案。 –

0

除了XPath 1.0中的功能是正確的,XPath 2.0中:

/Books/Book[id = max(../Book/id)] 

math:max函數返回的最大值節點作爲參數傳遞。最大值定義如下。作爲參數傳遞的節點集按降序排序,如xsl:sort,數字類型爲數字。最大值是使用數字函數將此排序列表中第一個節點的字符串值轉換爲數字的結果。

如果節點集爲空,或者將任何節點的字符串值轉換爲數字的結果爲NaN,則返回NaN。

數學:最大模板返回結果樹片段,其字符串值是將函數返回的數字轉換爲字符串的結果。

+0

感謝這個功能,但我仍然想知道爲什麼我的版本返回最大值而不是最小值。 – stee1rat

+0

因爲您使用的不是.. –