SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Cyber Luxeonで学ぶXMLDB入門

XMLデータの操作(前編) ~ XPath、XQuery

Cyber Luxeonで学ぶXMLDB入門 第2回


  • X ポスト
  • このエントリーをはてなブックマークに追加

XQuery

 XPathの基本的な説明が一通り終わりましたので、次はXQueryの説明に入ります。XQueryの最も大きな特徴に、FLWOR式という構文があげられます。本節では、まずCyber LuxeonでサンプルのXQueryを実行し、サンプルのXQueryに従って説明を進めていきます。

サンプルの実行

 以下のXMLデータに対し、XQueryで検索を実行する例を説明します。検索対象のサンプルXMLには、XPathで使用したXMLと同じものを使用します。

サンプルXML
サンプルXML

 上記のXMLから、position要素が「投手」のデータのみ抽出し、XMLとして出力するXQueryを実行してみます。以下の図にXQueryのサンプルを示しました。

XQueryの例
XQueryの例

 前述の「Cyber LuxeonでのXPath/XQuery実行」で説明した方法でクエリーダイアログを開き、クエリー文字列の入力欄にXQuery式を入力して、[クエリータイプ]のラジオボタンで[XQuery]を選択します。

サンプルXQueryの実行
サンプルXQueryの実行

 以下の図のXMLがXQueryの実行結果となります。xlnxql:result要素はCyber Luxeonで実行した場合に、クエリー結果に対して自動的に付与されるルート要素です。

XQueryサンプル実行結果
XQueryサンプル実行結果

FLWOR式

 では、上記のXQueryのサンプルで示された構文について、順に説明していきます。まずは、XQueryで使用するFLWOR式という構文について説明します。FLWORの名前は、For、Let、Where、Orderby、Returnの頭文字をとったものです。読み方は「フラワー式」と呼びます。以下にFLWOR式の構文を示します。

XQueryの構文
for $変数名 in 抽出対象のXPath式
    let $変数名 := 抽出対象のXPath式
    where 条件式
    order by ソートキー
    return 出力コンストラクタ

 FLWOR式は、1つ以上のfor/let句、0個または1個のwhere/order by句、1つのreturn句から構成されます。

for句

 for句は繰り返し処理を指定します。for句の書式は次のようになります。

for句の書式
for $変数名 in 抽出対象のXPath式 [, $変数名 in 抽出対象のXPath式, …繰り返し]

 抽出対象のXPath式で取得されたシーケンスから、繰り返しごとにノードを順に取り出し、変数に格納したうえで、それ以降の処理を行います。また「$変数名 in 式」を、カンマ区切りで複数回指定することによって複数の$変数にシーケンスを格納することができます。

 以下は、上記サンプルXQueryのlet句を抜き出したものです。「players.xml」のplayers要素の子要素のplayer要素を順に取り出して、$pという変数に格納しています(document関数については後述します)。

XQueryのfor句のサンプル
for $p in document("test_xmlstore:/test_dir/players.xml")/players/player
document関数

 サンプルのfor句で使用されているdocument関数はCyber Luxeonが処理の対象となるdocumentを抽出するために独自で用意している入力関数です。入力関数は製品ごとの実装が許されています。document関数の書式は次のようになります。

document関数の書式
document( "XMLのURL" )

※XMLのURL := XMLストア名:ディレクトリ名/ファイル名

let句

 特定のシーケンスを$変数にセットするために使用します。$変数には、1つのシーケンスしか格納できないので、複数のシーケンスを使用する場合には、複数の$変数を使用する必要があります。let句の書式は次のようになります。

let句の書式
let $変数名 := 抽出対象のXPath式

 以下は、上記サンプルXQueryのlet句を抜き出したものです。

XQueryのlet句のサンプル
let $backnum := $p/@backnumber

 $p変数に格納されたシーケンスのbacknumber属性を$backnum変数に格納しています。

where句

 処理する条件を指定する場合に使用します。where句の書式は次のようになります。

where句の書式
where 条件式

 以下は、上記サンプルXQueryのwhere句を抜き出したものです。

XQueryのwhere句のサンプル
where contains($p/position/text(),'投手')

 $p変数の子要素のposition要素のテキスト値に「投手」という文字が含まれているかをcontains関数で判定しています。関数については後述します。

order by句

 処理する順番を指定する場合に使用します。カンマ区切りで、処理の順番の条件を複数指定することができます。また、昇順の場合は「ascending」、降順の場合は「descending」を指定します。order by句の書式は次のようになります。

order by句の書式
order by ソートキー [ascendingまたはdescending]

 以下のサンプルでは、並び替えの第1キーを$b変数、第2キーを$c変数として、降順で処理順を指定しています。

XQueryのorder by句のサンプル
order by $b,$c descending
著注:Cyber Luxeonのorder by句のサポート
 FLWOR式は草案(ワーキングドラフト)の段階ではorder byは定義がなく、FLWR式として定義されていました。Cyber LuxeonのXQuery実装は、草案段階の機能を実装しているため、2007年1月現在ではorder by句をサポートしていません。

return句

 戻り値としてのシーケンスを構成します。return句はfor句とlet句で作成された1回の繰り返しに対して1回呼び出されます。

 return句は、以下の書式で構成されます。コンストラクタには、戻り値として戻すXMLを直接記述します。変数、式をコンストラクタ内で評価する場合は"{"と"}"で囲んで記述します。

return句の書式
return 出力コンストラクタ

 以下がreturn句のサンプルです。「$p/name/text()」を"{"と"}"で囲んでいます。

XQueryのreturn句のサンプル
return <pitcher><name>{$p/name/text()}</name></pitcher>

次のページ
XQuery/XPath共通関数・演算子(1/2)

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Cyber Luxeonで学ぶXMLDB入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 佐藤 治夫 (株式会社ビープラウド)(サトウ ハルオ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/922 2007/06/13 10:07

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング