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>

