XML Path Language

XML Path Language （XPath（エックスパス）） は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文である。XPath自体は簡潔な構文 （式言語） であり、（XML関係にありがちな）XMLベースのマークアップ言語ではない。標準化団体 W3C (World Wide Web Consortium) で開発され、1999年11月16日に XML Path Language (XPath) 1.0 が XSL Transformations (XSLT) 1.0 と同時に勧告として公表された。XPathは、XSLT と XSL-FO とともに XSL の構成要素である。2007年1月23日、W3C で XPath 1.0 の次期バージョンが制定され、XPath 2.0 が XSLT 2.0 と同時に勧告された。2014年4月8日に XPath 3.0、2017年3月21日に XPath 3.1 が勧告された。他に、XPathを拡張したようなものとして XQuery がある。
XPathは、XML文書中から必要な要素群（サブセット）を取り出す、などといった用途に使うものとして、急速に受け入れられていった。なお、もともとはXPathは、XSL (XSLT) と XPointer に共通する構文と振る舞いのモデルを目標としていた。
XSLTでは、XML文書内の処理対象などの指定に、XPathを使用する。一般に、XSLT処理系を実装するには、XPath処理系のライブラリなどを利用してXPathを取り扱う必要がある。
日本では日本工業規格（JIS）に、JIS X 4160 として XPath 1.0 の翻訳版がある。
データモデル.
XPathのデータモデルでは、XML文書はルートノードを頂点とするノードの木構造であり、以下の7種類のノードから構成される （参考: XML） 。
ロケーションパス.
XPathで最も一般的な式は、ロケーションパスである。ロケーションパスにより、XML文書のあるノード（現在のコンテクストノード）を基準として、別のノードもしくは複数のノード（ノード集合）が指定される（指定されるノードが0個すなわち1個も存在しない場合もある）。
ロケーションパスは、1つまたは複数のロケーションステップの並びとして記述される。複数のロケーションステップでロケーションパスが記述される場合、各ロケーションステップはcodice_1により区切られる。
ロケーションステップ.
ロケーションパスを構成する各ロケーションステップは、次の3つの要素から構成される。
ロケーションステップは次の2種類の構文を使って記述することができる。
省略構文.
省略構文は簡潔な構文であり、よく使われる多くの既定値を使い省略してロケーションステップを記述することができる。
省略構文による簡単なロケーションパスの記述例を示す。
この例では、先頭がcodice_1となっている絶対パスであり、0個以上のcodice_4要素を選択する。
選択されたcodice_4要素はcodice_6要素の子要素()であり、そのcodice_6要素はcodice_8要素の子要素であり、codice_8要素はそのXML文書のルート要素である。
XPathの構文は、URI()の構文やファイルパスの構文に似せて、設計されている。
省略構文では、先の例より複雑な式を記述することもできる。ただし完全な構文と比べると記述能力は制限される。
少し複雑なロケーションパスの例を示す。
この例は、先頭がcodice_1となっていない相対パスであり、任意の名前の(codice_19)最初の要素(codice_20)を選択する。
選択された「最初の要素」はcodice_6要素の子要素(codice_1)であり、そのcodice_6要素はcodice_8要素の直接的または間接的な子要素（子孫要素、codice_25）であり、そのcodice_8要素は現在のコンテクストノードの子要素である。
省略構文の一覧と正式な定義については後の#完全な構文と省略構文の対応関係の節で示す。
完全な構文.
完全な構文の一般式は以下の形となる。
先の#省略構文の節で示した2つの例を、省略しない完全な構文によって書き直すと次のようになる。
このように完全な構文で記述されたロケーションパスの各ロケーションステップにおいては、
軸.
ロケーションステップの軸の記述は、XML文書の木構造において、方向を指定する。XPath仕様で定義されている13種類の軸（#完全な構文）を示す。
省略構文でcodice_11軸を使う例を示す。
この例では、codice_53属性ノードの集合を選択する。
選択された codice_53属性ノードは、XML文書内のいずれかのcodice_55要素ノードに属している。
codice_13軸は、後述する述語の中でその述語の直前のノードテストで選択されたノードを記述するためによく使われる。
例を示す。
この例では、カレントノードの子ノードであり、かつ内容のテキストcodice_58をもつcodice_59要素が選択される。
ノードテスト.
ロケーションステップのノードテストは、式もしくは特定のノード名によって記述される。
例えば、名前空間接頭辞codice_60が定義されているXML文書で、codice_61とノードテストが記述された場合、codice_60名前空間下のcodice_63をノード名とする全てのノードの集合が、このノードテストの指定の対象となる。
ノードテストの書式を示す。
完全な構文と省略構文の対応関係.
ロケーションステップの完全な構文と省略構文の対応関係を次に示す。
述語.
ロケーションステップでは、ノードテストの後に、角括弧でくくる述語で複雑な式を記述して、ノードテストで指定されたノード集合を絞り込むことができる。
ノード集合を絞り込む必要が無い場合は、述語は記述しない。
簡単な例を示す。
この例では、codice_84の部分が述語である。
このXPath式は、codice_53属性をもち、かつその属性値がcodice_86である、全てのcodice_55要素ノードを指定する。
先の例では述語の数は1つであったが、ロケーションパスを構成するロケーションステップごとに、複数の述語を指定することができる。
すなわち、絞り込み条件を複数重ねて指定することができる。
指定できる述語の数に制限は無い。
述語は、その述語を含むロケーションステップのコンテクストを変更することは無い。
その直前のノードテストで指定されたノード集合がそのロケーションステップのコンテクストであり、述語が指定されることでコンテクストが変更されることは無い。
複雑な例を示す。
この例は、codice_55要素のcodice_90属性の値を指定する。
ただし、このXPath式の最初のロケーションステップには3つの述語が記述されており、codice_55要素のうち
codice_55要素のみが、最初のロケーションステップの指定対象となる。
最終的には、最初のロケーションステップで絞り込まれて指定対象となったcodice_55要素のcodice_90属性が指定されることになる。
データ型と演算子、関数.
XPath 1.0 で規定されているデータ型と演算子、関数を説明する。
データ型は次の4種類が定義されている。
関数.
データ型を変換する関数.
比較的よく使われる関数については、次の節以降で少し詳しく述べる。
完全な定義は、W3Cの勧告(日本語訳)を参照。
XPathの式は、丸括弧のcodice_103とcodice_104で括りグループ化して評価順序を明記することができる。
述語には演算子を使った式を含めることができる。論理式 (論理値を返す式) は、 codice_105 演算子や codice_106 演算子でつなげることや、codice_107関数の引数にすることができる。
文字列 (string) にはUnicodeの文字を含めることができる。
述語で演算子を使う例を示す。
この例では、codice_109 属性の数値が codice_110 属性の数値の2倍以上である codice_111 要素の集合を選択する。
演算子codice_112は、述語の内部でも、述語の外部でも、ノード集合の和を求めるために使うことができる。述語の外部でcodice_112演算子を使う例を示す。
この例では、一つのノード集合を返す。返されるノード集合は、処理中のコンテクストにおいて、子要素として codice_115 要素もしくは codice_116 要素をもつ codice_117 要素の集合と、子要素として codice_118 要素をもつ codice_119 要素の集合の、和集合である。
例.
次のXML文書でXPathを例示して説明する。
<?xml version="1.0" encoding="utf-8"?>
<document>
 <!-- XML文書 -->
 <chapter title="第1章">
 <paragraph>段落</paragraph>
 <paragraph>次の段落</paragraph>
 <paragraph>さらに次の段落</paragraph>
 <paragraph>最後の段落</paragraph>
 </chapter>
 <chapter title="第2章">
 <paragraph>段落</paragraph>
 </chapter>
</document>
XPath 2.0.
XPath 2.0 は2007年1月23日に標準化団体 W3C で勧告された。
XQuery 1.0 は XPath 2.0 の拡張である。
また XPath 2.0 は XSLT 2.0 でも採用されている。
XPath 2.0 仕様は、1.0 と比べて大規模になっており非常に多くの機能が規定されている。
そのうち特に重要な変更は、多様なデータ型を扱えるようになったことである。
XPath 2.0 では、スキーマ言語 XML Schema で規定されている組み込みのアトミックデータ型と、スキーマで定義されたユーザ定義型を、扱うことができる。
あらゆる値は、シーケンスとして扱われる。
一つの文字列値やノードは、シーケンスに含まれる要素の一つと位置づけられる。
XPath 1.0 のノード集合は、XPath 2.0 では何らかの順序をもつシーケンスに、置き換わる。
多様な型を扱うために、XPath 2.0 では関数と演算子が大幅に拡張される。
XPath 2.0 は XQuery 1.0 のサブセットとなっている。
XPath 2.0 は XQuery 1.0 の構文のパス式を構成する。
XQuery 1.0 の FLWOR と呼ばれる式においては、codice_168 句の構成要素となる。
XPath 3.0.
2014年4月8日に XPath 3.0 が勧告された。XQuery 3.0 は XPath 3.0 の拡張である。
実装.
Java.
codice_169 パッケージがあり、XPath 1.0 が実装されている。codice_170 にて、XPath のインスタンスを作ることができ、codice_171 にて XPath を評価できる。
JavaScript.
HTML ではなく、一般の XML に関しては、XMLHttpRequest を使うと DOM木を作ることができ、どちらに対しても XPath が使える。Internet Explorer の場合は、codice_172 にて XPath が使える。Internet Explorer 以外のブラウザでは、DOM Level 3 XPath の仕様通り、codice_173 にて、XPath が扱える。
現在では、ブラウザ標準で XPath が使えるが、2007年くらいまでは、JavaScript で実装した XPath が作られていて、 JavaScript-XPathやGoogle AJAXSLTなどが XPath を実装している。
XSLT処理系.
XSLTでもノードの指定に XPath を用いる。XSLT処理系には以下のようなものがある。