XQuery/XPath共通関数・演算子(2/2)
日付/時間 関連関数
日付、時間関連の関数として、Cyber Luxeonでは、date関数、get-month-from-date関数、get-year-from-date関数をサポートしています。
検索対象となるサンプルのXMLを以下の図に示します。

サンプルのXMLに対し、以下のdate関数を使用したXQuery文を実行します。
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で実行した結果は次のとおりになります。
現在日付が、<current_date>要素の値として出力されているのが分かります。
シーケンス操作関数
シーケンスを操作するための関数として、Cyber Luxeonでは、exists、index-of、remove、deep-equal、distinct-values、inserなどの関数をサポートしています。以下ではexists関数を使用例として説明します。
exists関数
exists($arg)
引数が空のシーケンスではない場合、trueを返します。
検索対象となるサンプルのXMLを以下の図に示します。

サンプルのXMLに対し、以下のexists関数を使用したXQuery文を実行します。name要素が「イチロー」にマッチした場合のみ$name変数にシーケンスが格納されるので、その次の文のexist関数はtrueを返します。
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で実行した結果は次のとおりになります。
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のノードが同じノードかを判定します(ノード同等性)。 |
string)、整数(int)、長精度(double)などです。XPath、XQueryでは、処理の入力と出力はこのXDMとして定義されています。以下の図にXQueryとXDMの関係に関する概念図を示しました。
まとめ
本稿では、XMLデータベースの検索用言語の標準であるXQueryとXPathの基本について説明しました。2007年1月22日にはXMLDBのプロフェッショナルを認定するXMLマスターの新資格が発表されるなど、XMLDB関連の動きが、業界全体で活発化してきています。Cyber LuxeonはDeveloper Editionが無償で提供されていますので、本格的なXMLDB時代が到来する前に、XQueryなどXMLDBの機能を実際に試して体感しておくのはいかがでしょうか。次回は、Cyber LuxeonがXMLデータ更新用機能として用意しているXML updategram(XUG)を紹介します。
参考資料
- 『Cyber Luxeon ハンドブック』 サイバーテック社
- 『XMLデータベース入門』 山田祥寛 著、翔泳社、2006年4月
- 『XQuery+XMLデータベース入門』 菅原香代子・米持幸寿 著、日経BP社、2006年11月
- @IT 『一気に分かる“XQuery”ハンズオン演習』 米持幸寿 著、2006年7月
- IBM developerWork 『実用的なXML:XSLT 2.0とXQueryの比較』 Benoit Marchal 著、2006年4月
- IBM developerWork 『XQuery入門』 Howard Katz 著、2006年1月
- IBM developerWork 『実用的なXML: XPath 2.0を使い始める』 Benoit Marchal 著、2006年5月


