XMLマスターポイントレッスン ~ プロフェッショナル(データベース)編 ~
第4回 XPathの主要な式と演算子

コンテキストノードとフォーカス

本文では、「XPath式の処理における現在の対象ノード」という意味で「コンテキストノード(注A)」という言葉を使用しています。ファイルパスになぞらえるとカレントディレクトリに相当します。ファイルパスでは、カレントディレクトリは常に1つです。XPathでもコンテキストノードは常に1つです。

しかし、XPath式はシーケンスを返しますから、処理中に考慮しなければならないノードは1つには決まりません。例えば、今回のサンプルXMLに対してLIST1のXPath式を使用すると、結果は2つのノードからなるシーケンスになりました。

また「述語」の項で例に挙げたXPath式も、最後に述語を作用させるまではすべてのcustomerノードが対象になっています。このようにXPath式の処理では複数項目が対象になります。この現在考慮の対象になっている項目の集まりを「フォーカス」と呼びます。つまり、フォーカスに含まれている項目が1つずつコンテキスト項目として評価されるわけです。

フォーカスは、次の3種類のデータからなります。

● コンテキスト項目:現在の処理対象項目
● コンテキストポジション:コンテキスト項目のフォーカスの中での順番
● コンテキストサイズ:フォーカスに上がっている項目の数

これらの情報は、XQuery 1.0/XPath 2.0からアクセスできます。表Aを参照してください。フォーカスは動的コンテキストの一部です。

表A:フォーカスとアクセッサ

フォーカス アクセッサ
コンテキスト項目 self::node()
コンテキストポジション fn:position()
コンテキストサイズ fn:last()


論理値として解釈される値

XPath 2.0/XQuery 1.0では、xs:booleanではないのに文脈によってtrueやfalseとして解釈される値があります。
次の式を考えてみましょう。

 let $a := ()
 return
 if ( $a ) then "true" else "false"


この式は「false」を返します。つまり、空のシーケンスは論理値のfalseとして解釈されるのです。このような値には、ほかにも次のようなものがあります。

● 最初の項目がノード値であるようなシーケンスはtrueとして解釈される。最初の項目がノード値以外の場合、falseとして解釈されるわけではなく、型エラーが発生する
● xs:string、xs:anyURI、xs:untypedAtomic、およびこれらから派生した型を持つ値は長さが0ならfalse、1以上ならtrueとして解釈される
● xs:numericおよびnumericから派生した型を持つデータの値が0(あるいは0と等価な値)であればfalse、それ以外はtrueとして解釈される

この性質をうまく使えば効率の良い簡潔なコードを作成できますが、あまり多用するとコードが理解しにくくなりかねません。ほどほどに使ってください。


<掲載> P.205-211 DB Magazine 2007 August

ページトップへ▲

XMLマスターポイントレッスン ~ プロフェッショナル(データベース)編 ~ 記事一覧へ戻る

HOMEへ戻る