XML Path Language
出典: フリー百科事典『ウィキペディア(Wikipedia)』
XML Path Language (XPath; XMLパス言語) は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文である。 XPath自体は簡潔な構文 (式言語) であり、XMLに準拠したマークアップ言語ではない。 標準化団体 W3C (World Wide Web Consortium) で開発され、1999年11月16日に XML Path Language (XPath) 1.0 が XSL Transformations (XSLT) 1.0 と同時に勧告として公表された[1][2]。 XPathは、XSLT と XSL-FO とともにスタイルシート技術 XSL の構成要素と位置づけられている。 2007年1月23日、W3C で XPath 1.0 の次期バージョンが制定され、XPath 2.0 が XSLT 2.0 と同時に勧告された。 また W3C は XPath 2.0 を拡張した技術として XQuery 1.0 を開発し、2007年1月23日の XPath 2.0 / XSLT 2.0 の勧告と同時に XQuery 1.0 が勧告された。
XPath 1.0 が公表されると、XML文書に対する簡単な問い合わせ言語として、急速にXMLを扱うソフトウェア開発者 (プログラマ) たちに受け入れられていった。 もともとはXPathの開発は、XSL (XSLT) と XPointer に共通する構文と振る舞いのモデルを開発することを目標としていた。 実際にXSLTでは、XML文書の特定の部分を指定するパターンを、XPathを基にした構文で指定する。 一般にXSLT処理系の実装は、XPath処理系の実装を含んでいる。
目次 |
[編集] データモデル
XPathのデータモデルでは、XML文書はルートノードを頂点とするノードの木構造であり、以下の7種類のノードから構成される (参考: XML) 。
- ルートノード
- 要素ノード
- テキストノード
- 属性ノード
- 名前空間ノード
- 処理命令ノード
- コメントノード
[編集] ロケーションパス
XPathで最も一般的な式は、ロケーションパスである。 ロケーションパスにより、XML文書のあるノード (現在のコンテクストノード) を基準として、別のノードもしくは複数のノード (ノード集合) が指定される (指定されるノードが0個すなわち1個も存在しない場合もある) 。
ロケーションパスは、1つのロケーションステップまたは複数のロケーションステップの並びとして記述される。 複数のロケーションステップでロケーションパスが記述される場合、各ロケーションステップは /
により区切られる。
[編集] ロケーションステップ
ロケーションパスを構成する各ロケーションステップは、次の3つの要素から構成される。
ロケーションステップは次の2種類の構文を使って記述することができる。
- 1つは#省略構文であり、簡潔でXPathの式を読みやすく書きやすく記述することができる。直観的で多くの場合親しみやすい文字列と構文で記述する。
- もう1つは省略しない#完全な構文であり、省略構文と比べて記述が冗長ではあるが、省略構文より多くのオプションを指定することができ、またXPath式を注意深く読む際には省略構文より説明的に記述していることがXPath式の正確な理解に役立つ。
[編集] 省略構文
省略構文は、簡潔な構文であり、よく使われる多くの既定値を使い省略してロケーションステップを記述することができる。
省略構文による、簡単なロケーションパスの記述例を示す。
/A/B/C
この例では、先頭が /
となっている絶対パスであり、0個もしくは1個もしくは複数個のC
要素を選択する。 選択されたC
要素はB
要素の子要素 (child element) であり、そのB
要素はA
要素の子要素であり、A
要素はそのXML文書のルート要素である。
XPathの構文は、URI (Uniform Resource Identifier) の構文やファイルパスの構文に似せて、設計されている。
省略構文では、先の例より複雑な式を記述することもできる。 ただし完全な構文と比べると記述能力は制限される。
- 既定の
child
軸以外にもいくつかの軸 (attribute
軸、descendant-or-self
軸、self
軸、parent
軸) を指定することができる。 - 簡明なノード名による指定以外のノードテストを指定することができる。
- どのロケーションステップにも角括弧 [ と ] を後ろにつけて述語を指定することができる。
少し複雑なロケーションパスの例を示す。
A//B/*[1]
この例は、先頭が /
となっていない相対パスであり、任意の名前の (*
) 最初の要素 ([1]
) を選択する。 選択された「最初の要素」はB
要素の子要素 (/
) であり、そのB
要素はA
要素の直接的または間接的な子要素 (子孫要素、//
) であり、そのA
要素は現在のコンテクストノードの子要素である。
省略構文の一覧と正式な定義については後の#完全な構文と省略構文の対応関係の節で示す。
[編集] 完全な構文
先の#省略構文の節で示した2つの例を、省略しない完全な構文によって書き直すと次のようになる。
/child::A/child::B/child::C
child::A/descendant-or-self::node()/child::B/child::*[1]
このように完全な構文で記述されたロケーションパスの各ロケーションステップにおいては、
- 軸を
child
やdescendant-or-self
のように明示的に指定する。 - 軸の指定に続けて
::
を記述し、さらにノードテストをA
やnode()
、*
のように記述する。 - 省略構文と同様に、ノードテストの指定に続けて角括弧 [ と ] を後ろにつけて述語を指定することができる。
[編集] 軸
ロケーションステップの軸 (axis) の記述は、XML文書の木構造において、方向を指定する。 XPath仕様で定義されている13種類の軸 (#完全な構文) を示す。
- child
- コンテクストノードの子ノード
- descendant
- コンテクストノードの子孫ノード
- parent
- コンテクストノードの親ノード
- ancestor
- コンテクストノードの祖先ノード
- following-sibling
- コンテクストノードの兄弟ノードのうち後方のノード
- preceding-sibling
- コンテクストノードの兄弟ノードのうち前方のノード
- following
- XML文書の文書順でコンテクストノードより後方にある全てのノード
- preceding
- XML文書の文書順でコンテクストノードより前方にある全てのノード
- attribute
- コンテクストノードが要素の場合、その属性ノード
- namespace
- コンテクストノードが要素の場合、その名前空間ノード
- self
- コンテクストノード自身
- descendant-or-self
- コンテクストノード自身とコンテクストノードの子孫ノード
- ancestor-or-self
- コンテクストノード自身とコンテクストノードの祖先ノード
省略構文で attribute
軸を使う例を示す。
//a/@href
この例では、href
属性ノードの集合を選択する。 選択された href
属性ノードは、XML文書内のいずれかの a
要素ノードに属している。
self
軸は、後述する述語の中でその述語の直前のノードテストで選択されたノードを記述するためによく使われる。 例を示す。
h3[.='関連項目']
この例では、カレントノードの子ノードであり、且つ内容のテキスト '関連項目'
をもつ h3
要素が選択される。
[編集] ノードテスト
ロケーションステップのノードテスト (node test) は、式もしくは特定のノード名によって記述される。 例えば、名前空間接頭辞 gs
が定義されているXML文書で、//gs:enquiry
とノードテストが記述された場合、 gs
名前空間下の enquiry
をノード名とする全てのノードの集合が、このノードテストの指定の対象となる。
ノードテストの書式を示す[3]。
- 名前
- 「名前空間接頭辞:名前」という書式でもよく、attribute軸とnamespace軸以外の軸の場合は、その名前をもつ全ての要素ノードを指定する。attribute軸の場合はその名前の全ての属性ノードを指定し、namespace軸の場合は名前空間ノードを指定する。
- text()
- 全てのテキスト (文字列) ノードを指定する。例:
<k>こんにちは</k>
の中の'こんにちは'
- comment()
- 全てのXMLコメントノードを指定する。例:
<!-- コメント -->
- processing-instruction()
- 全てのXML処理命令ノードを指定する。例:
<?xsl-stylesheet href="article.css" ?>
processing-instruction(処理命令ターゲット) という書式での記述も可能であり、この例の場合はprocessing-instruction('xsl-stylesheet')
と記述すると指定対象となる。 - node()
- 全てのノードを指定する。
- *
- 主ノード型の全てのノードを指定する。ここで主ノード型とは、attribute軸とnamespace軸以外の軸の場合は要素ノードを意味し、attribute軸の場合は属性ノードを、namespace軸の場合は名前空間ノードを、それぞれ意味する。
- 名前空間接頭辞:*
- 名前空間接頭辞が示す名前空間に属する全ての主ノード型のノードを指定する。
[編集] 完全な構文と省略構文の対応関係
ロケーションステップの#完全な構文と#省略構文の対応関係を次に示す[1][4]。
完全な構文 | 省略構文 | 説明 |
---|---|---|
child:: |
(省略して何も書かない) | コンテクストノードの子ノード |
attribute:: |
@ |
コンテクストノードが要素の場合、その属性ノード |
/descendant-or-self::node()/ |
// |
コンテクストノード自身とコンテクストノードの子孫ノード |
self::node() |
. |
コンテクストノード自身 |
parent::node() |
.. |
コンテクストノードの親ノード |
[編集] 述語
ロケーションステップでは、ノードテストの後に、角括弧でくくる述語 (predicate) で複雑な式を記述して、ノードテストで指定されたノード集合を絞り込むことができる。 ノード集合を絞り込む必要が無い場合は、述語は記述しない。
簡単な例を示す。
//a[@href='help.php']
この例では、[@href='help.php']
の部分が述語である。 このXPath式は、href
属性をもち且つその属性値が 'help.php'
である、全ての a
要素ノードを指定する。
先の例では述語の数は1つであったが、ロケーションパスを構成するロケーションステップごとに、複数の述語を指定することができる。 すなわち、絞り込み条件を複数重ねて指定することができる。 指定できる述語の数に制限は無い。
述語は、その述語を含むロケーションステップのコンテクストを変更することは無い。 その直前のノードテストで指定されたノード集合がそのロケーションステップのコンテクストであり、述語が指定されることでコンテクストが変更されることは無い。
複雑な例を示す。
//a[@href='help.php'][name(..)='div'][../@class='header']/@target
この例は、a
要素の target
属性の値を指定する。 ただしこのXPath式の最初のロケーションステップには3つの述語が記述されており、a
要素のうち
a
要素のhref
属性の値が'help.php'
であり、- 且つ、
a
要素の親要素の要素名がdiv
であり、 - 且つ、親要素 (
div
) のclass
属性の値が'header'
である、
a
要素のみが、最初のロケーションステップの指定対象となる。 最終的には、最初のロケーションステップで絞り込まれて指定対象となった a
要素の target
属性が指定されることになる。
[編集] データ型と演算子、関数
XPath 1.0 で規定されているデータ型と演算子、関数を説明する。
データ型は次の4種類が定義されている。
- ノード集合 (node-set; 順序づけられていないノードの集合)
- 文字列 (string)
- 数値 (number; 浮動小数点数)
- 論理型 (boolean)
演算子は次のとおり。
- "/" 演算子と "//" 演算子 (先述)
- "|" 演算子: 2つのノード集合の和集合のノード集合を返す
- 論理演算子: "and" "or" - 論理値を返す
- 算術演算子: "+" "-" "*" "div" (IEEE754に基づく割り算) "mod" (剰余) - 数値 (浮動小数点数) を返す
- 比較演算子: "=", "!=", "<", ">", "<=", ">=" - 論理値を返す
関数には次のようなものがある。
- 文字列を扱う関数: concat(), substring(), contains(), starts-with(), ends-with(), substring-before(), substring-after(), translate(), normalize-space(), string-length()
- 数値を扱う関数: sum(), round(), floor(), ceiling()
- ノードの情報を取得する関数: name(), local-name(), namespace-uri()
- 処理中のコンテクストに関する情報を取得する関数: position(), last()
- 型を変換する関数: string(), number(), boolean()
比較的よく使われる関数については、次の節以降で少し詳しく述べる。 完全な定義は、W3Cの勧告(日本語訳)を参照。
XPathの式は、丸括弧の ( と ) で括りグループ化して評価順序を明記することができる。
述語には演算子を使った式を含めることができる。 論理式 (論理値を返す式) は、 and
演算子や or
演算子でつなげることや、not()
関数の引数にすることができる。 文字列 (string) にはUnicodeの文字を含めることができる。 述語で演算子を使う例を示す。
//item[@price >= 2*@discount]
この例では、price
属性の数値が discount
属性の数値の2倍以上である item
要素の集合を選択する。
演算子 | は、述語の内部でも、述語の外部でも、ノード集合の和を求めるために使うことができる。 述語の外部で | 演算子を使う例を示す。
v[x or y] | w[z]
この例では、一つのノード集合を返す。返されるノード集合は、処理中のコンテクストにおいて、子要素として x
要素もしくは y
要素をもつ v
要素の集合と、子要素として z
要素をもつ w
要素の集合の、和集合である。
[編集] ノード集合関数
- number position()
- 評価中のコンテクストノードの位置を数値で返す (兄弟ノードにおける位置) 。
- number count(node-set)
- 引数のノード集合 (もしくはノード集合を返す式) のノードの数を返す。
- node-set id(object)
- 引数のオブジェクトの文字列値をID型の属性値としてもつノードの集合を返す。
- string name(node-set?)
- 引数として渡されたノード集合の最初のノードの名前を返す (ノードが要素の場合は要素名、属性の場合は属性名) 。
[編集] 文字列関数
- string string(object?)
- XPathで規定されている4種類のデータ型を引数としてとることができ、仕様で定められた変換規則によって文字列に変換する。引数としてXPath式も渡すことができる。
- number string-length(string?)
- 引数として渡す文字列の長さ (文字の数) を返す。
- string substring(string, number, number?)
- 引数として渡す文字列の部分文字列を返す。
- string concat(string, string, string*)
- 引数として渡す複数の文字列を連結して返す。
- boolean contains(string1, string2)
- 引数の文字列
string1
に文字列string2
が含まれていた場合、trueを返す。含まれていなかった場合はfalseを返す。 - string normalize-space(string?)
- 引数の文字列を正規化して返す。すなわち、文字列の前後の空白文字を除去し、さらに除去後の文字列中に連続して現れる空白文字を一つの空白で置き換えた文字列を、返す。
[編集] 論理関数
- boolean not(boolean)
- 引数の論理値の逆の値を返す。
[編集] 数値関数
- number sum(node-set)
- 引数として渡されたノード集合の各ノードの文字列値を、仕様で定められた変換規則にしたがって数値に変換し、合計した値を返す。
[編集] 例
次の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>
/document
: ルート要素document
を選択する。/*
: 名前を限定せずにルート要素を選択する。この場合は同じくdocument
が選択される。(XML文書は必ず一つのルート要素をもつ)/document/chapter
:document
要素の子要素である全てのchapter
要素を選択する。/document/chapter[1]
:document
要素の子要素のうち1番目のchapter
要素を選択する。//paragraph
: 文書内の全てのparagraph
要素を選択する。//chapter[@title="第1章"]/paragraph
:title
属性の値が "第1章" であるchapter
要素の子要素である全てのparagraph
要素を選択する。
[編集] XPath 2.0
冒頭で述べたとおり、XPathの2007年3月現在の最新バージョン XPath 2.0 は2007年1月23日に標準化団体 W3C で勧告された。 なお XPath 1.0 は1999年11月16日に勧告された。 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 と呼ばれる式においては、for
句の構成要素となる。
[編集] 関連項目
- XML
- XSL
- XSLT (XSL Transformations)
- XQuery
- XML Schema
[編集] 脚注
- ^ a b XPath 1.0 仕様 (英語) - W3C (World Wide Web Consortium)
- ^ W3C の XPath 1.0 作業部会では、ジェームズ・クラークとスティーヴン・ディローズが共同でエディタを務めた。 また XSLT 1.0 作業部会では、ジェームズ・クラークがエディタを務めた。
- ^ (株)日本ユニテックほか、2001年、p.66
- ^ (株)日本ユニテックほか、2001年、p.67
[編集] 参考文献
- (株)日本ユニテック、中山幹敏、奥井康弘 ほか『改訂版 標準XML完全解説 (下)』技術評論社、2001年、ISBN 4-7741-1302-6
- XPath 1.0 仕様 (英語) - W3C (World Wide Web Consortium)
- XPath 1.0 仕様 (日本語訳) - インフォテリア株式会社
- XPath 1.0 仕様 (日本語訳) - どら猫本舗
[編集] 外部リンク
- XPath 1.0 仕様 (英語) - W3C (World Wide Web Consortium)
- XPath 2.0 (W3C 勧告候補) - W3C
- XPathの書き方の基本 (日本語) - @IT (アットマーク・アイティ)
- XPath tutorial (英語)
- Another tutorial (英語)
- Practice XPath queries (英語)