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