Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

XML Path Language XML Path Languageの概要

XML Path Language

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2024/06/29 02:58 UTC 版)

XML文書に XPath の式を適用したイメージ
XML変換におけるXPathの位置付け

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つまたは複数のロケーションステップの並びとして記述される。複数のロケーションステップでロケーションパスが記述される場合、各ロケーションステップは/により区切られる。

ロケーションステップ

ロケーションパスを構成する各ロケーションステップは、次の3つの要素から構成される。

ロケーションステップは次の2種類の構文を使って記述することができる。

省略構文
簡潔でXPathの式を読みやすく書きやすく記述することができる。直観的で多くの場合親しみやすい文字列と構文で記述する。
完全な構文
省略構文と比べて記述が冗長ではあるが、省略構文より多くのオプションを指定することができ、またXPath式を注意深く読む際には省略構文より説明的に記述していることがXPath式の正確な理解に役立つ。

省略構文

省略構文は簡潔な構文であり、よく使われる多くの既定値を使い省略してロケーションステップを記述することができる。

省略構文による簡単なロケーションパスの記述例を示す。

/A/B/C

この例では、先頭が/となっている絶対パスであり、0個以上の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]

このように完全な構文で記述されたロケーションパスの各ロケーションステップにおいては、

  • childdescendant-or-selfのように明示的に指定する。
  • 軸の指定に続けて::を記述し、さらにノードテストAnode()*のように記述する。
  • 省略構文と同様に、ノードテストの指定に続けて角括弧[]を後ろにつけて述語を指定することができる。

ロケーションステップの軸の記述は、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要素が選択される。

ノードテスト

ロケーションステップのノードテストは、式もしくは特定のノード名によって記述される。 例えば、名前空間接頭辞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() .. コンテクストノードの親ノード

述語

ロケーションステップでは、ノードテストの後に、角括弧でくくる述語で複雑な式を記述して、ノードテストで指定されたノード集合を絞り込むことができる。 ノード集合を絞り込む必要が無い場合は、述語は記述しない。

簡単な例を示す。

//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 IEEE 754に基づく割り算
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 名前空間の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)
引数として渡されたノード集合の各ノードの文字列値を、仕様で定められた変換規則にしたがって数値に変換し、合計した値を返す。

  1. ^ a b XPath 1.0 仕様 (英語) - W3C (World Wide Web Consortium)
  2. ^ W3C の XPath 1.0 作業部会では、ジェームズ・クラークとスティーヴン・ディローズが共同でエディタを務めた。また XSLT 1.0 作業部会では、ジェームズ・クラークがエディタを務めた。
  3. ^ (株)日本ユニテックほか、2001年、p.66
  4. ^ (株)日本ユニテックほか、2001年、p.67
  5. ^ javax.xml.xpath (Java Platform SE 6)
  6. ^ selectNodes Method
  7. ^ evaluate - Document Object Model XPath
  8. ^ JavaScript-XPath
  9. ^ Google AJAXSLT


「XML Path Language」の続きの解説一覧




固有名詞の分類


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「XML Path Language」の関連用語

XML Path Languageのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



XML Path Languageのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのXML Path Language (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2024 GRAS Group, Inc.RSS