2009年4月29日

XPath運算子與特殊字元

XPath 運算式是使用下列表格所顯示的運算子和特殊字元建構的。
/子運算子;選取左側集合的子系。當這個路徑運算子出現在模式開頭時,就表示應該從根節點選取子系。
//遞迴下降;搜尋任何深度的指定項目。當這個路徑運算子出現在模式開頭時,就表示從根節點遞迴下降。
.指示目前內容。
..目前內容節點的父代。
*萬用字元;選取所有項目,不論項目名稱為何。
@屬性;屬性名稱的前置詞。
@*屬性萬用字元;選取所有屬性,不管名稱為何。
:命名空間分隔符號;分隔命名空間前置詞與項目或屬性名稱。
()用來明確建立優先順序的群組運算。
[]套用篩選條件模式。
[]註標運算子;做為集合內的索引。
+執行加法。
-執行減法。
div根據IEEE754執行浮點數除法。
*執行乘法。
mod傳回捨去除法的餘數。

依下列表格的指示來定義優先順序 (從最高優先順序到最低優先順序)。
優先順序字元內容
1()群組
2[]篩選常式
3///路徑運算

路徑運算子
您可以使用路徑運算子 (/ and //) 來決定特定型別的項目集合。這些運算子會將其引數當做「左側」集合 (執行選取),並當做「右側」集合 (指示要選取的項目)。子系運算子 (/) 會從左側集合的立即子系中選取,子代運算子 (//) 則從左側集合的任意子代中選取。事實上,您可將 // 當做階層的一或多個層級之替代項。
請注意,執行查詢時,路徑運算子會變更內容。使用者可將路徑運算子字串放在一起,以周遊文件樹狀目錄。
範例
運算式表示
author/first-name目前內容節點的<author>項目內部的所有<first-name>項目。
bookstore//title位於<bookstore>項目一或多層深的所有<title>項目(任意子代)。請注意,其不同於下列模式bookstore/*/title。
bookstore/*/title所有當做<bookstore>項目孫代的<title>項目。
bookstore//book/excerpt//emph位於<book>項目的<excerpt>子系之任何位置,以及<bookstore>項目的任何位置之所有<emph>項目:
.//title位於目前內容中一或多層深的所有<title>項目。請注意,唯有在此情況下,才需要使用句點標記法。


萬用字元
藉由替代萬用字元 ( * )集合,即可參考項目而不需使用項目的名稱。不論標籤名稱為何, * 集合都會參考目前內容子系的所有項目。
範例
運算式表示
 author/*  <author> 項目的所有項目子系。
 book/*/last-name 所有當做 <book> 項目孫代的 <last-name> 項目。
 */* 目前內容的所有孫代項目。
 my:book  my 命名空間的 <book> 項目。
 my:*  my 命名空間的所有項目。

請注意,系統不支援模式 *:book 。

屬性
XPath 以 @ 符號表示屬性名稱。系統會平等看待屬性和子項目,並且平等處理兩個類型之間的功能 (可能的話)。
屬性不含子項目,所以將路徑運算子套用到屬性時,就會發生語法錯誤。此外,您無法將索引套用到屬性,因為依照定義,不會定義屬性的順序。
範例
運算式表示
 @style 目前項目內容的 style 屬性。
 price/@exchange 目前內容內部的 <price> 項目之 exchange 屬性。
book/@style所有 <book> 項目的 style 屬性。

請注意,下列範例是無效的,因為屬性不能有任何子系:price/@exchange/total

尋找多個屬性
您可以使用 @* 傳回項目的所有屬性。這對於將屬性看做記錄欄位的應用程式很有用
範例
運算式表示
 @* 目前內容節點的所有屬性。
 @my:*  my 命名空間的所有屬性。其不含 my 命名空間項目的不合格屬性。

請注意,系統不支援模式 @*:title 。

篩選條件子句
藉由將篩選條件子句 [pattern] 新增至集合,可將限制和分支套用至任何集合。篩選條件類似於 SQL WHERE 子句。篩選條件內含模式,稱為「篩選條件模式」。會將篩選條件模式評估為布林值,並且會針對集合的每個項目進行測試。結果集合將略過無法通過篩選條件模式測試的集合之任何項目。
為了方便起見,若將集合放在篩選條件內部,則當集合包含任何成員時,就會產生布林 TRUE;若集合為空,則產生 FALSE。如果存在含子項目 項目,運算式 (例如 author/degree) 就會隱含執行評估為 TRUE 的「集合至布林值」轉換函式。
請注意,運算式的指定層級可出現任意數量的篩選條件。不允許空的篩選條件。
系統必定會根據內容評估篩選條件。換言之,運算式 book[author] 會測試每個找到的 項目是否有 子項目。同樣地,book[author = 'Bob'] 會測試每個找到的 項目是否具有值 Bob 的 子項目。使用句點 (.) 字元也可以檢查內容的值。例如,book[. = 'Trenton'] 會測試在目前內容中找到的每本書籍值是否為 Trenton。
範例
運算式表示
 book[excerpt] 至少包含一個 <excerpt> 項目的所有 <book> 項目。
 book[excerpt]/title 至少包含一個 <excerpt> 項目的 <book> 項目內部的所有 <title> 項目。
 book[excerpt]/author[degree] 至少包含一個 <degree> 項目,並且位於 <book> 項目(至少包含一個 <excerpt> 項目)內部的所有 <author> 項目。
 book[author/degree] 至少包含一個 <author> 項目(內含至少一個 <degree> 子項目)的所有 <book> 項目。
 book[excerpt][title] 至少包含一個 <excerpt> 項目和至少一個 <title> 項目的所有 <book> 項目。