SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

Cyber Luxeonで学ぶXMLDB入門

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

Cyber Luxeonで学ぶXMLDB入門 第2回


XQuery/XPath共通関数・演算子(2/2)

日付/時間 関連関数

 日付、時間関連の関数として、Cyber Luxeonでは、date関数、get-month-from-date関数、get-year-from-date関数をサポートしています。

 検索対象となるサンプルのXMLを以下の図に示します。

サンプルXML
サンプルXML

 サンプルのXMLに対し、以下のdate関数を使用したXQuery文を実行します。

date()関数の実行例
for $p in document("test_xmlstore:/test_dir/players.xml")/players/player
  where contains($p/position/text(),'投手')
  return
       <pitcher>
          <name>{$p/name/text()}</name>
          <current_date>{date()}</current_date>
       </pitcher>

 CyberLuxeonで実行した結果は次のとおりになります。

date関数実行結果
date関数実行結果

 現在日付が、<current_date>要素の値として出力されているのが分かります。

シーケンス操作関数

 シーケンスを操作するための関数として、Cyber Luxeonでは、existsindex-ofremovedeep-equaldistinct-valuesinserなどの関数をサポートしています。以下ではexists関数を使用例として説明します。

exists関数

書式
exists($arg)

 引数が空のシーケンスではない場合、trueを返します。

 検索対象となるサンプルのXMLを以下の図に示します。

サンプルXML
サンプルXML

 サンプルのXMLに対し、以下のexists関数を使用したXQuery文を実行します。name要素が「イチロー」にマッチした場合のみ$name変数にシーケンスが格納されるので、その次の文のexist関数はtrueを返します。

exists()関数の例
for $n in document("test_xmlstore:/test_dir/players.xml")/players/player/name

  let $name := $n/text()[.='イチロー']
  where exists($name)
  return
       <PlayerName>{$name}</PlayerName>

 CyberLuxeonで実行した結果は次のとおりになります。

exists関数実行結果
exists関数実行結果

Cyber Luxeon2.0でサポートされている関数

 最後にCyber Luxeonでサポートされている関数についてまとめました。

アクセッサー関数
関数説明
string($arg)引数で渡されたアイテムの文字列表現を返します。引数が省略された場合は、コンテキストアイテムがデフォルトの引数として扱われます。
数値関数
関数説明
ceiling($arg)$argの小数部分を切り上げて整数を返します。$argが10.5の場合、11を返します。$argが-10.5の場合、-10を返します。
floor($arg)$argの小数部分を切り捨て、小さい方の整数を返します。$argが10.5の場合、10を返します。$argが-10.5の場合、-11を返します。
round($arg)$argの整数の丸め処理を行います。$argが2.5の場合、3を返します。$argが-2.499の場合、-2を返します。
文字列関数
関数説明
starts-with($arg1,$arg2)$arg1$arg2の文字列で始まるか判定します。
ends-with($arg1,$arg2)$arg1$arg2の文字列で終了するか判定します。
日付/時間 関連関数
関数説明
date()現在日付を返します。
get-month-from-date()現在月を返します。
get-year-from-date()現在年を返します。
シーケンス操作関数
関数説明
deep-equal($arg1,$arg2)$arg1$arg2のシーケンスが、要素の階層や、型、値などすべて等しいかを判定します。
distinct-values($arg)$argのシーケンスから重複する値を削除します。
distinct-nodes($arg)$argのシーケンスから重複するノードを削除します。
remove($arg1,$arg2)$arg1から$arg2を削除します。
exists($arg1)$arg1にシーケンスが格納されているか判定します。
index-of($arg1,$arg2)$arg1の文字列上で$arg2が現れる位置を返します。
insert($arg1,$arg2,$arg3)$1の$arg2で指定された位置に、$arg3を挿入します。
sequence-node-equal()$arg1$arg2のシーケンスが、実際に同じノード自体を含んでいるかを判定します(ノード同等性)。
sequence-deep-equal
($arg1,$arg2)
$arg1$arg2のシーケンスの実際の値を検証して等しいかを判定します(値同等性)。
node-equal($arg1,$arg2)$arg1$arg2のノードが同じノードかを判定します(ノード同等性)。
データモデル
 XQuery1.0とXPath 2.0では、XMLデータをテキストとして、そのまま扱うのではなく『XQuery 1.0 and XPath 2.0 Data Model (XDM)』というデータモデルとして扱います。XDMとは、XQuery、XPathなどで扱う値のデータ型をモデルとして定義したものです。例えば、文字列(string)、整数(int)、長精度(double)などです。XPath、XQueryでは、処理の入力と出力はこのXDMとして定義されています。以下の図にXQueryとXDMの関係に関する概念図を示しました。
XQueryとXDM
XQueryとXDM
 XDMの詳細については、W3Cの仕様書『XQuery 1.0 and XPath 2.0 Data Model (XDM)』や参考文献などを参照してください。

まとめ

 本稿では、XMLデータベースの検索用言語の標準であるXQueryとXPathの基本について説明しました。2007年1月22日にはXMLDBのプロフェッショナルを認定するXMLマスターの新資格が発表されるなど、XMLDB関連の動きが、業界全体で活発化してきています。Cyber LuxeonはDeveloper Editionが無償で提供されていますので、本格的なXMLDB時代が到来する前に、XQueryなどXMLDBの機能を実際に試して体感しておくのはいかがでしょうか。次回は、Cyber LuxeonがXMLデータ更新用機能として用意しているXML updategram(XUG)を紹介します。

参考資料

  1. Cyber Luxeon ハンドブック』 サイバーテック社
  2. XMLデータベース入門』 山田祥寛 著、翔泳社、2006年4月
  3. XQuery+XMLデータベース入門』 菅原香代子・米持幸寿 著、日経BP社、2006年11月
  4. @IT 『一気に分かる“XQuery”ハンズオン演習』 米持幸寿 著、2006年7月
  5. IBM developerWork 『実用的なXML:XSLT 2.0とXQueryの比較』 Benoit Marchal 著、2006年4月
  6. IBM developerWork 『XQuery入門』 Howard Katz 著、2006年1月
  7. IBM developerWork 『実用的なXML: XPath 2.0を使い始める』 Benoit Marchal 著、2006年5月
修正履歴

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

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
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本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/922 2007/06/13 10:07

イベント

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

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

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

メールバックナンバー