XQuery
XPathの基本的な説明が一通り終わりましたので、次はXQueryの説明に入ります。XQueryの最も大きな特徴に、FLWOR式という構文があげられます。本節では、まずCyber LuxeonでサンプルのXQueryを実行し、サンプルのXQueryに従って説明を進めていきます。
サンプルの実行
以下のXMLデータに対し、XQueryで検索を実行する例を説明します。検索対象のサンプルXMLには、XPathで使用したXMLと同じものを使用します。
上記のXMLから、position
要素が「投手」のデータのみ抽出し、XMLとして出力するXQueryを実行してみます。以下の図にXQueryのサンプルを示しました。
前述の「Cyber LuxeonでのXPath/XQuery実行」で説明した方法でクエリーダイアログを開き、クエリー文字列の入力欄にXQuery式を入力して、[クエリータイプ]のラジオボタンで[XQuery]を選択します。
以下の図のXMLがXQueryの実行結果となります。xlnxql:result
要素はCyber Luxeonで実行した場合に、クエリー結果に対して自動的に付与されるルート要素です。
FLWOR式
では、上記のXQueryのサンプルで示された構文について、順に説明していきます。まずは、XQueryで使用するFLWOR式という構文について説明します。FLWORの名前は、For、Let、Where、Orderby、Returnの頭文字をとったものです。読み方は「フラワー式」と呼びます。以下にFLWOR式の構文を示します。
for $変数名 in 抽出対象のXPath式 let $変数名 := 抽出対象のXPath式 where 条件式 order by ソートキー return 出力コンストラクタ
FLWOR式は、1つ以上のfor/let
句、0個または1個のwhere/order by
句、1つのreturn
句から構成されます。
for句
for
句は繰り返し処理を指定します。for
句の書式は次のようになります。
for $変数名 in 抽出対象のXPath式 [, $変数名 in 抽出対象のXPath式, …繰り返し]
抽出対象のXPath式で取得されたシーケンスから、繰り返しごとにノードを順に取り出し、変数に格納したうえで、それ以降の処理を行います。また「$変数名 in
式」を、カンマ区切りで複数回指定することによって複数の$変数にシーケンスを格納することができます。
以下は、上記サンプルXQueryのlet
句を抜き出したものです。「players.xml」のplayers
要素の子要素のplayer
要素を順に取り出して、$p
という変数に格納しています(document
関数については後述します)。
for $p in document("test_xmlstore:/test_dir/players.xml")/players/player
document関数
サンプルのfor
句で使用されているdocument
関数はCyber Luxeonが処理の対象となるdocumentを抽出するために独自で用意している入力関数です。入力関数は製品ごとの実装が許されています。document
関数の書式は次のようになります。
document( "XMLのURL" ) ※XMLのURL := XMLストア名:ディレクトリ名/ファイル名
let句
特定のシーケンスを$変数にセットするために使用します。$変数には、1つのシーケンスしか格納できないので、複数のシーケンスを使用する場合には、複数の$変数を使用する必要があります。let
句の書式は次のようになります。
let $変数名 := 抽出対象のXPath式
以下は、上記サンプルXQueryのlet
句を抜き出したものです。
let $backnum := $p/@backnumber
$p
変数に格納されたシーケンスのbacknumber
属性を$backnum
変数に格納しています。
where句
処理する条件を指定する場合に使用します。where
句の書式は次のようになります。
where 条件式
以下は、上記サンプルXQueryのwhere
句を抜き出したものです。
where contains($p/position/text(),'投手')
$p
変数の子要素のposition
要素のテキスト値に「投手」という文字が含まれているかをcontains
関数で判定しています。関数については後述します。
order by句
処理する順番を指定する場合に使用します。カンマ区切りで、処理の順番の条件を複数指定することができます。また、昇順の場合は「ascending
」、降順の場合は「descending
」を指定します。order by
句の書式は次のようになります。
order by ソートキー [ascendingまたはdescending]
以下のサンプルでは、並び替えの第1キーを$b
変数、第2キーを$c
変数として、降順で処理順を指定しています。
order by $b,$c descending
order by
は定義がなく、FLWR式として定義されていました。Cyber LuxeonのXQuery実装は、草案段階の機能を実装しているため、2007年1月現在ではorder by
句をサポートしていません。return句
戻り値としてのシーケンスを構成します。return
句はfor
句とlet
句で作成された1回の繰り返しに対して1回呼び出されます。
return
句は、以下の書式で構成されます。コンストラクタには、戻り値として戻すXMLを直接記述します。変数、式をコンストラクタ内で評価する場合は"{
"と"}
"で囲んで記述します。
return 出力コンストラクタ
以下がreturn
句のサンプルです。「$p/name/text()
」を"{
"と"}
"で囲んでいます。
return <pitcher><name>{$p/name/text()}</name></pitcher>