XPath

XPath即為XML路徑語言（XML Path Language），它是一種用來確定XML文檔中某部分位置的電腦語言。

XPath基於XML的樹狀結構，提供在數據結構樹中找尋節點的能力。起初XPath的提出的初衷是將其作為一個通用的、介於XPointer與XSL間的語法模型。但是XPath很快的被開發者採用來當作小型查詢語言。

## 表示法

最常見的XPath表達式是路徑表達式（XPath這一名稱的另一來源）。路徑表達式是從一個XML節點（當前的上下文節點）到另一個節點、或一組節點的書面步驟順序。這些步驟以「/」字符分開，每一步有三個構成成分：

- 軸描述（用最直接的方式接近目標節點）
- 節點測試（用於篩選節點位置和名稱）
- 節點描述（用於篩選節點的屬性和子節點特徵）

一般情況下，我們使用簡寫後的語法。雖然完整的軸描述是一種更加貼近人類語言，利用自然語言的單詞和語法來書寫的描述方式，但是相比之下也更加羅嗦。

### 簡略的語法

最簡單的XPath如下：

- `/A/B/C`

在這裡選擇所有符合規矩的C節點：C節點必須是B的子節點（`B/C`），同時B節點必須是A的子節點（`A/B`），而A是這個XML文檔的根節點（`/A`）。此時的這種描述法類似於磁碟中文件的路徑（URI），從盤符開始順著一級一級的目錄最終找到文件。

這裡還有一個複雜一些的例子，包含了全部構成成分（請詳細的看）：

- `A//B/*[1]`

此時選擇的元素是：在B節點下的第一個節點（`B/*[1]`），不論節點的名稱如何（`*`）；而B節點必須出現在A節點內，不論和A節點之間相隔幾層節點（`//B`）；與此同時A節點還必須是當前節點的子節點（`A`，前邊沒有`/`）。

### 擴展的語法

在未縮簡語法裡，兩個上述範例可以寫為：

- `/child::A/child::B/child::C`
- `child::A/descendant-or-self::B/child::node()[1]`

在XPath的每個步驟裡，通過完整的軸描述（例如：`child`或`descendant-or-self`）進行明確的指定，然後使用`::`，它的後面跟著節點測試的內容，例如上面範例所示的`A`以及`node()`。

## 軸描述語法

軸描述元表示XML文件分支樹表達式的瀏覽方向。這些坐標──包括全名及縮寫語法──列舉如下：

坐標｜名稱｜說明｜縮寫語法

child｜子節點｜比自身節點深度大的一層的節點，且被包含在自身之內｜默認，不需要

attribute｜屬性｜`@`

descendant｜子孫節點｜比自身節點深度大的節點，且被包含在自身之內｜不提供

descendant-or-self｜自身引用及子孫節點｜`//`

parent｜父節點｜比自身節點深度小一層的節點，且包含自身｜`..`

ancestor｜祖先節點｜比自身節點深度小的節點，且包含自身｜不提供

ancestor-or-self｜自身引用及祖先節點｜不提供

following｜下文節點｜按縱軸視圖，在此節點後的所有完整節點，即不包含其祖先節點｜不提供

preceding｜前文節點｜按縱軸視圖，在此節點前的所有完整節點，即不包含其子孫節點｜不提供

following-sibling｜下一個同級節點｜不提供

preceding-sibling｜上一個同級節點｜不提供

self｜自己｜`.`

namespace｜名稱空間｜不提供

關於使用attribute坐標簡寫語法的一個範例，`//a/@href`在文件樹里任何地方的元素下選擇了一個叫`href`的屬性。self坐標最通常與述語同用，以參考現行選定節點。例如，`h3[.='See also']`在現行上下文選取了叫`h3`的元素，該元素文字內容是`See also`。

如果需要了解更多，請查看 ZVON.org給出的XPath幫助

## 節點測試

節點測試包括特定節點名或者更一般的表達式。至於XML里命名空間前綴`gs`已定義的文件，`//gs:enquiry`將找到所有在那命名空間裡`enquiry`的節點。

其他節點格式：

comment :尋找XML注釋節點，例如`<!-- 注释 -->`

text :尋找某點的文字型別，例如`hello`於`<k>hello</k>`

processing-instruction :尋找XML處理指令如`<?php echo $a; ?>`。在這個例子裡，將符合`processing-instruction('php')`會傳回值。

node :尋找所有點

## 節點描述

節點描述為一個邏輯真假表達式，任何真假判斷表達式都可在節點後方括號里表示，這條件必須在XPath處理這個節點前先被滿足。在某一步驟可有多少個描述並沒有限制。

範例如下：

`//a[@href='help.php']`，這將檢查元素`a`有沒有`href`屬性，並且該它的值是`help.php`。

複雜一些的範例如下：

- `//a[@href='help.php'][../div/@class='header']/@target`

或

- `//a[@href='help.php'][name(..)='div'][../@class='header']/@target`

此例將會選擇符合條件的元素`a`的`target`屬性。

要求元素`a`：

- 具有屬性`href`且值為`help.php`。
- 並且元素`a`具有父元素`div`。
- 並且父元素（`div`）其自身具備`class`屬性，值為`header`。

## 函數與運算符

XPath 1.0定義四種數據型別：節點型（本身無序的節點組）、字串型、數字型、與布爾型。

有效的運算符有：

- `/`、`//`以及`..`運算符，一般用於軸描述。
- 合集運算符 | 把兩個節點形成聯集。
- 布爾運算符and、or以及not函數
- 數學運算符 +、-、*、div（除）以及mod（取餘數）
- 比較操作子 =、!=（不等於）、=

函數有：

- 文字運算函數

concat, substring, contains, substring-before, substring-after, translate, normalize-space, string-length

- 數學運算函數

sum, round, floor, ceiling

- 節點屬性取得函數

name, local-name, namespace-uri

- 處理上下文數據取得函數

position, last

- 類型轉換函數

string, number, boolean

某些常用的函式詳列如下。完整明細請參照 W3C建議書。

### 節點組函式

position :返回當前節點集合內，該節點的位置。

count(node-set) :返回符合XPath的節點集合的節點總數。

### 字串函式

string(object?) :根據內建法則轉換任何四種XPath數據型別為字串。參數可為XPath，此時符合條件的節點（群）被轉換成字串返回。

concat(string, string, string*) :連結任何數量的字串。

contains(s1, s2) :如果`s1`包含`s2`返回真。

normalize-space(string?) :所有在字串頭和尾的空白字符都被移除，或者將字符間兩個及以上的空白字符置換成單一空格。有些XML因列印關係被美化，但可能讓後來的字串處理結果不可靠，故使用此函式有時能很好地改善情況。

### 布爾函數

not(boolean) :布爾否運算函數。

### 數學運算函數

sum(node-set) :根據內建轉型規則，轉換所有XPath參數定義找到的節點字串值成為數字，然後返回這些數字總合

使用操作子：`=, !=, <=, <, >=`和`>`的表達式可以創造於術語內。布爾表達式可用括號`()`、布爾操作子`and`與`or`、和／或者上述的`not()`函式聯合起來。數值計算使用`*, +, -, div`和`mod`。字串可包含任何Unicode字符。

述語內外，整個節點組可利用"|"字符聯合起來。

`v[x or y] | w[z]`會返回單一節點組，包括現行上下文找到的所有擁有`x`或`y`子元素的`v`元素、有`z`子元素的`w`元素。

`//item[@price > 2*@discount]`會選取price屬性至少兩倍於discount屬性數值的對象

## XPath 2及XPath 3

在W3C建議下，XPath 1.0於1999年11月16日發表。XPath 2.0於2007年1月23日成為W3C推薦標準。XPath 2.0表達了XPath語言在大小與能力上顯著的增加。

最值得大書特書的改變是XPath 2.0有了更豐富的型別系統；XPath 2.0支持不可分割型態，如在XML Schema內建型態定義一樣，並且也可自綱要（schema）導入使用者自定型別。現在每個值都是一個序列（一個單一不可分割值或節點都被視為長度一的序列）。XPath 1.0節點組被節點序列取代，它可以是任何順序。

為了支持更豐富的型別組，XPath 2.0提供相當延展的函式與操作子群。

XPath 2.0實際上是XQuery 1.0的子集合。它提供了一個for表達式。該式是XQuery里「FLWOR」表達式的縮減版。利用列出XQuery省去的部分來描述該語言是可能的。主要範例是查詢前導語（query prolog）、元素和屬性建構式、「FLWOR」語法的餘項式、以及`typeswitch`表達式。

XPath 3.0於2014年4月8日成為W3C推薦標準，而XPath3.1則於2017年3月21日成為W3C推薦標準。

## 參看

- XML
- XSLT，XSL-FO
- XLink，XPointer
- XPointer
- Xquery
- XML Schema
- STXPath

## 基本資料

- 編程范型：查詢語言
- 發行時間：1998年
- 開發者：W3C
- 軟體版本週期：3.1
- 軟體版本週期：2017年3月21日
- 受影響於：XSLT, XPointer
- 施影響於：XML Schema, XForms