XPath

1.XPathの概要

XPathは、XML文書の階層(ツリー)構造にアクセスし、ノードの位置を指定するときに使用する。XML文書中のノードの位置を指定するために使用される規格のことである。
XPathでは、XML文書の要素、属性を含む文書の一部のことをノード(node)と呼ぶ。

2.XPathの階層構造

ノードの種類と関係

 ルートノード(root node):ツリー構造の最上位のノード、XML文書要素の親ノード
 要素ノード(element node):XMLの要素を表すノード
 属性ノード(attribute node):要素内で指定された属性を表すノード
 テキストノード(text node):要素の内容となるデータノード
 処理命令ノード(processing-instruction node):処理命令を表すノード
 コメントノード(comment node):コメントを表すノード
 名前空間ノード(namespace node):名前空間を表すノード

3.XPathの機能

  • 特定のノードを指定する方法としてのロケーションパス
  • 数値を返す、文字列を返す、比較演算子を使用した
  • XPathで用意されている関数

ロケーションパス(location path)

ロケーションパスはXML文書の階層構造の中から特定のノードを指定するための記述方法である。

  • 絶対ロケーションパス:ルートノードから該当ノードまでの経路を指定する。
  • 相対ロケーションパス:コンテキストノードを起点として該当のノードまでの経路を指定する。

ロケーションパスの指定方法

ロケーションパスの最小単位はロケーションステップと呼ばれ、軸、ノードテスト、述語(省略可)から構成される。
ロケーションステップの書式:
 軸::ノードテスト[述語]

軸では、コンテキストノードから次のノードを探す方法を示すためのキーワードを指定する。

ノードテスト

ノードテストは軸で指定された方向の中で特定のノードを選択する。要素名や属性名を指定して特定のノードを選択することもできるが、関数やワイルドカードを指定することもできる。
ノードテストの関数とワイルドカード:

ノードテスト 説明
text() すべてのテキストノード
comment() すべてのコメントノード
processiong-instruction() すべての処理命令ノード(PIノード)
node() すべてのノード
* ワイルドガード。軸で指定されたすべての要素ノード
軸の省略記法
完全表記 省略記法 説明
child:: (何も記述しない) 子ノードを表す
attribute:: @ 対象ノードの属性ノードを表す
self::node() . 自分自身のノードを表す
parent::node() .. 親ノードを表す
/descendant-or-self:: // 対象ノードを含む
述語

ノードテストで選択したノードを更に細かく選択するために使用する。
例:コンテキストノードの子ノード(para要素)のうち、2番目にあるノード:

  • 完全表記: child::para[position()=2]
  • 省略表記:para[2]

述語で使用する式には、数値を直接指定したり、演算子や関数を使用することができる。

  • 数値演算子:「+」、「-」、「div」、「mod」、「*」
  • 論理演算子:「and」、「or」
  • 比較演算子:「=」、「!=」、「<=」、「<」、「>」、「>=」
関数

XPathには、XMLのノードを指定するための関数が多数用意されている。
関数の書式:
 戻り値の型 関数の名前()
 戻り値の型 関数の名前(引数,引数・・・)
 戻り値の型 関数の名前(引数?)   ※引数が省略可能な場合は引数の後ろに「?」で示す。
ノードセット関数:
 number position()
 number last()
 number count(node-set)
 string local-name(node-set?):引数を省略した場合は、コンテキストノードの名前を返す。
 string namespace-uri(node-set?):引数に指定したノードの名前空間接頭辞を返す。引数を省略した場合は、コンテキストノードの名前空間接頭辞を返す。
 string name(node-set?):引数に指定したノードの名前空間接頭辞と名前を「名前空間接頭辞:名前」という書式で返す。
文字列関数:
 string string(object?):引数に指定したオブジェクトによって変換結果の形式が異なる。

引数 戻り値
ノードセット 1番目のノードの文字列値。空の場合は空文字列
数値 数字。数字以外の場合は"NaN"(Not-a-Number)、0の場合は"0"
ブール値 真の場合は"true"、偽の場合は"false"
それ以外 その型の定義に準拠

 string concat(string,string,string*)
 string substring(string,offset,number?)
論理値関数:
 boolean boolean(object)
 boolean not(boolean):真偽を反転する。
数値関数:
 number number(object)

引数 戻り値
ノードセット stringと同じ手順で変換。その後、数字に変換
数値 数字の場合は数字に変換、それ以外の場合は"NaN"に変換
ブール値 真の場合は"true"、偽の場合は"false"
それ以外 その型の定義に準拠

 number sum(node-set)

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License