「XML Path Language」の版間の差分

m
 
XPathで最も一般的な式は、ロケーションパスである。
ロケーションパスにより、[[Extensible Markup Language|XML]]文書のあるノード (現在のコンテクストノード) を基準として、別のノードもしくは複数のノード (ノード集合) が指定される (指定されるノードが0個すなわち1個も存在しない場合もある)
 
ロケーションパスは、1つまたは複数のロケーションステップの並びとして記述される。
複数のロケーションステップでロケーションパスが記述される場合、各ロケーションステップは <code>/</code> により区切られる。
 
=== ロケーションステップ ===
 
ロケーションパスを構成する各ロケーションステップは、次の3つの要素から構成される。
* [[#軸|軸]] ({{lang|en|axis}})
* [[#ノードテスト|ノードテスト]] ({{lang|en|node test}})
* [[#述語|述語]] ({{lang|en|predicate}})
 
ロケーションステップは次の2種類の構文を使って記述することができる。
; [[#省略構文|省略構文]]
*: 1つは[[#省略構文]]であり、簡潔でXPathの式を読みやすく書きやすく記述することができる。直観的で多くの場合親しみやすい文字列と構文で記述する。
* もう1つは省略しない[[#完全な構文]]であり、省略構文と比べて記述が冗長ではあるが、省略構文より多くのオプションを指定することができ、またXPath式を注意深く読む際には省略構文より説明的に記述していることがXPath式の正確な理解に役立つ。
; [[#完全な構文|完全な構文]]
*: もう1つは省略しない[[#完全な構文]]であり、省略構文と比べて記述が冗長ではあるが、省略構文より多くのオプションを指定することができ、またXPath式を注意深く読む際には省略構文より説明的に記述していることがXPath式の正確な理解に役立つ。
 
=== 省略構文 ===
 
省略構文は簡潔な構文であり、よく使われる多くの既定値を使い省略してロケーションステップを記述することができる。
 
省略構文による簡単なロケーションパスの記述例を示す。
*: <code>/A/B/C</code>
この例では、先頭が <code>/</code> となっている絶対パスであり、0個もしくは1個もしくは複数個以上の<code>C</code>要素を選択する。
選択された<code>C</code>要素は<code>B</code>要素の子要素 ({{lang|en|child element}}) であり、その<code>B</code>要素は<code>A</code>要素の子要素であり、<code>A</code>要素はそのXML文書のルート要素である。
 
XPathの構文は、[[Uniform Resource Identifier|URI]] ({{lang|en|Uniform Resource Identifier}}) の構文や[[ファイル (コンピュータ)|ファイル]]パスの構文に似せて、設計されている。
 
省略構文では、先の例より複雑な式を記述することもできる。
ただし完全な構文と比べると記述能力は制限される。
* 既定の <code>child</code> 軸以外にもいくつかの'''[[#軸|軸]]''' (<code>attribute</code>軸、<code>descendant-or-self</code>軸、<code>self</code>軸、<code>parent</code>軸) を指定することができる。
* 簡明なノード名による指定以外の'''[[#ノードテスト|ノードテスト]]'''を指定することができる。
* どのロケーションステップにも角括弧 <code><nowiki> [ </nowiki></code> <code><nowiki>] </nowiki> </code>を後ろにつけて'''[[#述語|述語]]'''を指定することができる。
<code>
 
少し複雑なロケーションパスの例を示す。
*: <code>A//B/*[1]</code>
この例は、先頭が <code>/</code> となっていない相対パスであり、任意の名前の (<code>*</code>) 最初の要素 (<code>[1]</code>) を選択する。
選択された「最初の要素」は<code>B</code>要素の子要素 (<code>/</code>) であり、その<code>B</code>要素は<code>A</code>要素の直接的または間接的な子要素 (子孫要素、<code>//</code>) であり、その<code>A</code>要素は現在のコンテクストノードの子要素である。
 
省略構文の一覧と正式な定義については後の[[#完全な構文と省略構文の対応関係]]の節で示す。
完全な構文の一般式は以下の形となる
 
*: <code>/軸方向::名前空間:ノードテスト[述語]/~~</code>
 
先の[[#省略構文]]の節で示した2つの例を、省略しない完全な構文によって書き直すと次のようになる。
*: <code>/child::A/child::B/child::C</code>
*: <code>child::A/descendant-or-self::node()/child::B/child::*[1]</code>
 
このように完全な構文で記述されたロケーションパスの各ロケーションステップにおいては、
* [[#軸|軸]]を <code>child</code> <code>descendant-or-self</code> のように明示的に指定する。
* 軸の指定に続けて <code>::</code> を記述し、さらに[[#ノードテスト|ノードテスト]]を <code>A</code> <code>node()</code> 、<code>*</code> のように記述する。
* 省略構文と同様に、ノードテストの指定に続けて角括弧<code><nowiki> [ </nowiki></code> <code><nowiki>] </nowiki></code>を後ろにつけて[[#述語|述語]]を指定することができる。
 
=== 軸 ===
 
[[#ロケーションステップ|ロケーションステップ]]の軸 (axis) の記述は、[[Extensible Markup Language|XML]]文書の[[木構造 (データ構造)|木構造]]において、方向を指定する。
XPath仕様で定義されている13種類の軸 ([[#完全な構文]]) を示す。
 
; <code>child</code>
: コンテクストノードの子ノード
; <code>descendant</code>
: コンテクストノードの子孫ノード
; <code>parent</code>
: コンテクストノードの親ノード
; <code>ancestor</code>
: コンテクストノードの祖先ノード
; <code>following-sibling</code>
: コンテクストノードの兄弟ノードのうち後方のノード
; <code>preceding-sibling</code>
: コンテクストノードの兄弟ノードのうち前方のノード
; <code>following</code>
: XML文書の文書順でコンテクストノードより後方にある全てのノード
; <code>preceding</code>
: XML文書の文書順でコンテクストノードより前方にある全てのノード
; <code>attribute</code>
: コンテクストノードが要素の場合、その属性ノード
; <code>namespace</code>
: コンテクストノードが要素の場合、その名前空間ノード
; <code>self</code>
: コンテクストノード自身
; <code>descendant-or-self</code>
: コンテクストノード自身とコンテクストノードの子孫ノード
; <code>ancestor-or-self</code>
: コンテクストノード自身とコンテクストノードの祖先ノード
 
[[#省略構文|省略構文]]で <code>attribute</code> 軸を使う例を示す。
*: <code>//a/@href</code>
この例では、<code>href</code> 属性ノードの集合を選択する。
選択された <code>href</code> 属性ノードは、XML文書内のいずれかの <code>a</code> 要素ノードに属している。
 
<code>self</code> 軸は、後述する[[#述語|述語]]の中でその述語の直前のノードテストで選択されたノードを記述するためによく使われる。
例を示す。
*: <code>h3[.='関連項目']</code>
この例では、カレントノードの子ノードであり、かつ内容のテキスト <code>'関連項目'</code> をもつ <code>h3</code> 要素が選択される。
 
=== ノードテスト ===
 
[[#ロケーションステップ|ロケーションステップ]]のノードテスト (node test) は、式もしくは特定のノード名によって記述される。
例えば、名前空間接頭辞 <code>gs</code> が定義されている[[Extensible Markup Language|XML]]文書で、<code>//gs:enquiry</code> とノードテストが記述された場合、 <code>gs</code> 名前空間下の <code>enquiry</code> をノード名とする全てのノードの集合が、このノードテストの指定の対象となる。
 
ノードテストの書式を示す<ref>(株)日本ユニテックほか、2001年、p.66</ref>。
 
; 名前
: 「名前空間接頭辞:名前」という書式でもよく、<code>attribute</code>軸と<code>namespace</code>軸以外の軸の場合は、その名前をもつ全ての要素ノードを指定する。<code>attribute軸</code>の場合はその名前の全ての属性ノードを指定し、<code>namespace軸</code>の場合は名前空間ノードを指定する。
; <code>text()</code>
: 全てのテキスト (文字列) ノードを指定する。例: <code><k>こんにちは</k></code> の中の <code>'こんにちは'</code>
; <code>comment()</code>
: 全てのXML[[コメント (コンピュータ)|コメント]]ノードを指定する。例: <code><nowiki><!-- コメント --></nowiki></code>
; <code>processing-instruction()</code>
: 全てのXML処理命令ノードを指定する。例: <code><?xsl-stylesheet href="article.css" ?></code> processing-instruction(処理命令ターゲット) という書式での記述も可能であり、この例の場合は <code>processing-instruction('xsl-stylesheet')</code> と記述すると指定対象となる。
: <code>processing-instruction(処理命令ターゲット)</code>という書式での記述も可能であり、この例の場合は<code>processing-instruction('xsl-stylesheet')</code>と記述すると指定対象となる。
; node()
; <code>node()</code>
: 全てのノードを指定する。
; <code>*</code>
; *
: 主ノード型の全てのノードを指定する。ここで主ノード型とは、<code>attribute</code>軸と<code>namespace</code>軸以外の軸の場合は要素ノードを意味し、<code>attribute</code>軸の場合は属性ノードを、<code>namespace</code>軸の場合は名前空間ノードを、それぞれ意味する。
; 名前空間接頭辞<nowiki>:</nowiki>*
: 名前空間接頭辞が示す名前空間に属する全ての主ノード型のノードを指定する。
=== 完全な構文と省略構文の対応関係 ===
 
[[#ロケーションステップ|ロケーションステップ]]の[[#完全な構文|完全な構文]]と[[#省略構文|省略構文]]の対応関係を次に示す<ref name="spec"/><ref>(株)日本ユニテックほか、2001年、p.67</ref>。
 
{| class="prettytable"
=== 述語 ===
 
[[#ロケーションステップ|ロケーションステップ]]では、[[#ノードテスト|ノードテスト]]の後に、角括弧でくくる述語 (predicate) で複雑な式を記述して、ノードテストで指定されたノード集合を絞り込むことができる。
ノード集合を絞り込む必要が無い場合は、述語は記述しない。
 
簡単な例を示す。
*: <code>//a[@href='help.php']</code>
この例では、<code>[@href='help.php']</code> の部分が述語である。
このXPath式は、<code>href</code> 属性をもち、かつその属性値が <code>'help.php'</code> である、全ての <code>a</code> 要素ノードを指定する。
 
先の例では述語の数は1つであったが、ロケーションパスを構成するロケーションステップごとに、複数の述語を指定することができる。
 
複雑な例を示す。
*: <code>//a[@href='help.php'][name(..)='div'][../@class='header']/@target</code>
この例は、<code>a</code> 要素の <code>target</code> 属性の値を指定する。
ただし、このXPath式の最初のロケーションステップには3つの述語が記述されており、<code>a</code> 要素のうち
* <code>a</code> 要素の <code>href</code> 属性の値が <code>'help.php'</code> であり、
* また、<code>a</code> 要素の親要素の要素名が <code>div</code> であり、
* また、親要素 (<code>div</code>) <code>class</code> 属性の値が <code>'header'</code> である、
<code>a</code> 要素のみが、最初のロケーションステップの指定対象となる。
最終的には、最初のロケーションステップで絞り込まれて指定対象となった <code>a</code> 要素の <code>target</code> 属性が指定されることになる。
 
== データ型と演算子、関数 ==
106

回編集