Xpath使用簡介
XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進行遍歷。
XPath 是 W3C XSLT 標準的主要元素,並且 XQuery 和 XPointer 都構建於 XPath 表達之上。
因此,對 XPath 的理解是很多高級 XML 應用的基礎。
下面的示例顯示一些基本的 XPath 表達式。通過將這些簡單的表達式組合在一起,並使用各種 XPath 運算符和特殊字符,可以生成更復雜的表達式。
- 當前上下文
-
以句點和正斜槓 (./) 作爲前綴的表達式明確使用當前上下文作爲上下文。例如,以下表達式引用當前上下文中的所有 <author> 元素:
./author
注意,此表達式等效於以下表達式:
- 文檔根
-
以正斜槓 (/) 爲前綴的表達式使用文檔樹的根作爲上下文。例如,以下表達式引用此文檔根的 <bookstore> 元素:
/bookstore
- 根元素
-
使用正斜槓後接星號 (/*) 的表達式將使用根元素作爲上下文。例如,以下表達式查找文檔的根元素:
複製代碼/*
- 遞歸下降
-
使用雙正斜槓 (//) 的表達式指示可以包括零個或多個層次結構級別的搜索。如果此運算符出現在模式的開頭,上下文相對於文檔的根。例如,以下表達式引用當前文檔中任意位置的所有 <author> 元素:
複製代碼//author
.// 前綴指示上下文從層次結構中當前上下文所指示的級別開始。
- 特定元素
-
以元素名開頭的表達式引用特定元素的查詢,從當前上下文節點開始。例如,以下表達式引用當前上下文節點中 <images> 元素內的 <background.jpg> 元素:
images/background.jpg
以下表達式引用當前上下文節點中 <bookstore> 元素內的 <book> 元素的集合:
以下表達式引用當前上下文節點中的所有 <first.name> 元素:
注意 元素名可以包括句點字符 (.)。這些名稱的用法與任何其他名稱一樣。
運算符和特殊字符
XPath 表達式是使用下表中所示的運算符和特殊字符構造的。
/ |
子運算符;選擇左側集合的直接子級。此路徑運算符出現在模式開頭時,表示應從根節點選擇該子級。 |
// |
遞歸下降;在任意深度搜索指定元素。此路徑運算符出現在模式開頭時,表示應從根節點遞歸下降。 |
. |
指示當前上下文。 |
.. |
當前上下文節點的父級。 |
* |
通配符;選擇所有元素,與元素名無關。 |
@ |
屬性;屬性名的前綴。 |
@* |
屬性通配符;選擇所有屬性,與名稱無關。 |
: |
命名空間分隔符;將命名空間前綴與元素名或屬性名分隔。 |
( ) |
爲運算分組,明確設置優先級。 |
[ ] |
應用篩選模式。 |
[ ] |
下標運算符;用於在集合中編制索引。 |
+ |
執行加法。 |
- |
執行減法。 |
div |
根據 IEEE 754 執行浮點除法。 |
* |
執行乘法。 |
mod |
從截斷除法返回餘數。 |
此表不包括布爾運算符和集運算符,這兩個運算符在布爾、比較和集表達式或集運算中列出。
優先級順序(從最高優先級到最低優先級)的定義如下表所示。
優先級 | 字符 | 用途 |
---|---|---|
1 |
( ) |
分組 |
2 |
[ ] |
篩選器 |
3 |
/ // |
路徑運算 |
分組運算符 () 僅適用於頂級路徑表達式。例如,(//author/degree | //author/name) 是有效的分組運算,但 //author/(degree | name) 不是。
篩選模式運算符 ([]) 的優先級高於路徑運算符(/ 和 //)。例如,表達式 //comment()[3] 選擇相對於文檔中任意位置備註的父級索引等於 3 的所有備註。此表達式與表達式 (//comment())[3] 不同,後者選擇相對於父級的所有備註集中的第三個備註。前一個表達式可以返回多個備註,後一個表達式只能返回一個備註。
這些運算符和特殊字符在本參考文檔中詳細說明。
特定類型的元素集合可以使用路徑運算符(/ 和 //)確定。這些運算符根據其參數的“左側”集合進行選擇,“右側”集合表示要選擇的元素。子運算符 (/) 從左側集合的直接子級中選擇,而子代運算符 (//) 從左側集合的任意子代中選擇。因此,// 可以作爲一個或多個層次級別的替代。
注意,路徑運算符在執行查詢時更改上下文。通過將路徑運算符連接在一起,用戶可以遍歷文檔樹。
表達式 | 引用 |
---|---|
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。
使用 @* 可以返回某個元素的所有屬性。對於將屬性作爲記錄中的字段的應用程序,此表達式可能非常有用。
示例
表達式 | 引用 |
---|---|
@* |
當前上下文節點的所有屬性。 |
@my:* |
my 命名空間中的所有屬性。不包括 my 命名空間中的元素的未限定屬性。 |
注意,不支持模式 @*:title。
XPath 查詢返回的集合在定義的範圍內保留文檔順序、層次結構和標識。也就是說,按照文檔順序返回元素集合,沒有重複的元素。因爲根據定義,屬性不排序,所以,爲特定元素返回的屬性不進行明確地排序。
具有特定標記名的所有元素的集合使用標記名本身表示。限定方法可以通過使用句點和正斜槓 (./) 表明元素是從當前上下文中選擇,但是默認情況下將使用當前上下文,不必明確說明。
使用 XPath 表達式可以很容易在節點集中查詢特定的節點。只需爲索引序號加上方括號。序號從 1 開始(第一個元素是編號 1)。
方括號字符 ([]) 的優先級高於斜槓字符(/ 和 //)。有關更多信息,請參見運算符和特殊字符。
示例
表達式 | 引用 |
---|---|
author[1] |
第一個 <author> 元素。 |
author[first-name][3] |
具有 <first-name> 子元素的第三個 <author> 元素。 |
注意,索引相對於篩選的節點集。例如,請考慮以下數據。
下表顯示如何選擇特定的 <x> 和 <y> 元素。
表達式 | 引用 |
---|---|
x/y[1] |
每個 <x> 中的第一個 <y>。 |
(x/y)[1] |
<x> 元素中整個 <y> 元素集的第一個 <y>。 |
x[1]/y[1] |
第一個 <x> 中的第一個 <y>。 |
上面的示例簡單地引用使用暗示默認值(例如 child:: 軸)的 XPath 集合。對於此軸,子節點集合按照前向文檔順序編制索引。
對於其他軸(例如 ancestor::),在 XPath 表達式中明確使用軸名。對於此軸,上級集合按照後向文檔順序編制索引。從上表中考慮此示例:
x/y[1]
此表達式等效於以下表達式:
x/child::y[1]
兩個表達式均意味着“對每個 <x> 元素選擇第一個名爲 <y> 的子元素”。
下面的示例使用了相同的語法。
x/ancestor::y[1]
此示例意味着“對每個 <x> 元素選擇第一個名爲 <y> 的祖先元素(按照後向文檔順序)”。語法相同但是順序相反。
last() 函數對集合中的最後一個元素返回 True。注意,last 相對於父節點。
示例
表達式 | 引用 |
---|---|
book[last()] |
最後一個 <book> 元素。 |
book/author[last()] |
每個 <book> 元素中的最後一個 <author> 元素。 |
(book/author)[last()] |
<book> 元素中整個 <author> 元素集的最後一個 <author> 元素。 |
爲了清楚起見,或正常的優先級不足以表達某個運算,可以使用括號爲集合運算符分組。分組運算符可以在任何篩選表達式(謂詞)中使用,例如 author[(degree or award)and publication]。也可以在頂級步長表達式中使用,例如 (book|magazine) 或 (author/degree | book/award)。不能應用於低級步長表達式。例如,author/(degree | award)無效。
示例
表達式 | 引用 |
---|---|
(book/author) |
屬於當前上下文節點中任何 <book> 元素的子元素的所有 <author> 元素。 |
author[(degree or award) and publication] |
至少包含一個 <degree> 或 <award> 元素以及至少包含一個 <publication> 元素的所有 <author> 元素。 |
通過將篩選子句 [pattern] 添加到集合中,可以對任何集合應用約束和分支。篩選器類似於 SQL WHERE 子句。篩選器中包含的模式稱爲“篩選模式”。篩選模式計算爲布爾值,對集合中的每個元素進行測試。集合中所有未通過篩選模式測試的元素將從結果集合中省略。
爲了方便起見,如果集合在篩選器內,若集合包含任何成員,則生成布爾值 TRUE,若集合爲空,則生成 FALSE。author/degree 之類的表達式意味着,如果存在包含名爲 <degree> 的子元素的 <author> 元素,集合到布爾值的轉換函數將計算爲 TRUE。
注意,在表達式的給定級別可以出現任意數目的篩選器。不允許使用空篩選器。
篩選器總是針對上下文進行計算。也就是說,表達式 book[author] 意味着,對每個找到的 <book> 元素測試是否包含 <author> 子元素。同樣,book[author = 'Bob'] 意味着,對每個找到的 <book> 元素測試是否包含值爲 Bob 的 <author> 子元素。還可以使用句點 (.) 字符檢查上下文的值。例如,book[. = 'Trenton'] 意味着,對當前上下文中找到的每一本書,測試值是否爲 Trenton。
表達式 | 引用 |
---|---|
book[excerpt] |
至少包含一個 <excerpt> 元素的所有 <book> 元素。 |
book[excerpt]/title |
至少包含一個 <excerpt> 元素的 <book> 元素內的所有 <title> 元素。 |
book[excerpt]/author[degree] |
至少包含一個 <degree> 元素並且在至少包含一個 <excerpt> 元素的 <book> 元素內的所有 <author> 元素。 |
book[author/degree] |
至少包含一個 <author> 元素並且該元素至少包含一個 <degree> 子元素的 <book> 所有元素。 |
book[excerpt][title] |
至少包含一個 <excerpt> 元素以及至少包含一個 <title> 元素的 <book> 所有元素。 |
篩選模式可以包含布爾表達式、比較表達式和集表達式。下表中列出的快捷方式表示此 XSL 轉換 (XSLT) 實現中提供的備選符號。本文檔討論這些表達式運算符。
運算符 | 說明 |
---|---|
and |
邏輯與 |
or |
邏輯或 |
not() |
非 |
= |
相等 |
!= |
不相等 |
< * |
小於 |
<= * |
小於或等於 |
> * |
大於 |
<= * |
大於或等於 |
| |
集運算;返回兩個節點集的聯合 |
* 擴展的 XPath 方法
萬維網聯合會 (W3C) 的運算符關鍵字語法使用空白和其他分隔符,不使用版本 2.5 中使用的美元字符 ($)。在 W3C 語法中,$xxx$ 格式的二進制關鍵字可以表示爲 wsxxxws,其中 ws 是指標記終止符,可以是空白、單引號 (') 或雙引號 (")。not() 等一元運算符使用函數表示法。儘管 Microsoft 實現支持這兩種語法,但是,爲了以後的兼容性,建議使用 W3C 語法。
比較運算符和布爾運算符的優先級順序(從最高優先級到最低優先級)如下表所示。
1 |
( ) |
分組 |
2 |
[ ] |
篩選 |
3 |
/ // |
路徑運算 |
4 |
< 或者 < <= 或者 <= > 或者 > >= 或者 >= |
比較 |
5 |
= != |
比較 |
6 |
| |
聯合 |
7 |
not() |
布爾值非 |
8 |
And |
布爾值與 |
9 |
Or |
布爾值或 |
在 XML 文檔(例如 XSLT 樣式表)中使用運算符時,< 和 > 標記必須分別轉義爲 < 和 >。例如,以下 XSLT 指令在所有 <price> 元素的數值小於或等於 10 的 <book> 元素上調用 XSLT 模板規則。
XPath 表達式與 DOM 一起使用時,< 和 > 運算符不需要轉義。例如,以下 JScript 語句選擇所有 <price> 元素的數值小於或等於 10 的 <book> 元素。
布爾表達式可以匹配特定值的所有節點或包含特定範圍的節點的所有節點。以下是返回 false 的布爾表達式的示例
1 >= 2
運算符區分大小寫。
邏輯與和邏輯或
布爾運算符 and 和 or 分別執行邏輯與和邏輯或運算。這些運算符與分組括號組合使用時,可以用於構建複雜的邏輯表達式。
示例
表達式 | 引用 |
---|---|
author[degree and award] |
至少包含一個 <degree> 元素以及至少包含一個 <award> 元素的所有 <author> 元素。 |
author[(degree or award) and publication] |
至少包含一個 <degree> 或 <award> 元素以及至少包含一個 <publication> 元素的所有 <author> 元素。 |
布爾值非
not 布爾運算符在篩選模式中對表達式的值求非。
示例
表達式 | 引用 |
---|---|
author[degree and not(publication)] |
至少包含一個 <degree> 元素但是不包含 <publication> 元素的所有 <author> 元素 |
author[not(degree or award) and publication] |
至少包含一個 <publication> 元素但是不包含任何 <degree> 元素或 <award> 元素的所有 <author> 元素。 |
示例
XML 文件 (test.xml)
<?xml version="1.0"?> <test> <x a="1"> <x a="2" b="B"> <x> <y>y31</y> <y>y32</y> </x> </x> </x> <x a="2"> <y>y2</y> </x> <x a="3"> <y>y3</y> </x> </test>