XQuery 開発者ガイド

     Previous  Next    Open TOC in new window     
Content starts here

BEA の XQuery 実装

World Wide Web Consortium (W3C) は、XQuery については、言語に関する機能のセットを定義します。 BEA AquaLogic Data Services Platform XQuery エンジンは、1 つの例外 (モジュール) を除き、言語機能を完全にサポートし、関数の強力なサブセットもサポートします。さらに、実装ごとに固有の多くの関数および言語キーワードを追加します。

この章では、XQuery エンジンにおける、関数と言語の実装および拡張について説明します。

この章の内容は以下のとおりです。

 


BEA XQuery 関数の実装

AquaLogic Data Services Platform は、2004 年 7 月 23 日の W3C Working Draft 「XQuery 1.0 and XPath 2.0 Functions and Operators」 (http://www.w3.org/TR/2004/WD-xpath-functions-20040723/ ) をサポートします。 さらに、AquaLogic Data Services Platform は、XQuery 仕様のエンハンスメントであるまた、次の拡張関数プレフィックスにより識別される複数の関数をサポートします。プレフィックスはfn-bea:です。 たとえば、拡張関数の完全な XQuery 表記は、fn-bea:function_name です。

この節では、BEA XQuery の拡張関数について説明します。以下のトピックがあります。

関数の概要

表 2-1 は BEA XQuery の拡張関数の概要を示します。

表 2-1 BEA XQuery の拡張関数
カテゴリ
関数
説明
アクセス制御関数
fn-bea:is-access-allowed
現在の要求コンテキストに関連するユーザが、指定したリソースにアクセスできるか、チェックする。
fn-bea:is-user-in-group
現在のユーザが指定したグループに存在するか、チェックする。
fn-bea:is-user-in-role
現在のユーザが指定したロールに存在するか、チェックする。
fn-bea:userid
保護されたリソースを要求するユーザの識別子を返す。
fn-bea:rename
要素のシーケンス名を変更する。
期間、日付および時間の関数
fn-bea:date-from-dateTime
dateTime 値の日付部分を返す。
fn-bea:date-from-string-with-format
指定したパターンに従い、文字列ソース値から新しい date 値を返す。
fn-bea:date-to-string-with-format
指定したパターンの日付文字列を返す。
fn-bea:dateTime-from-string-with-format
指定したパターンに従い、文字列ソース値から新しい dateTime 値を返す。
fn-bea:dateTime-to-string-with-format
指定したパターンの日時文字列を返す。
fn-bea:time-from-dateTime
dateTime 値の時刻部分を返す。
fn-bea:time-from-string-with-format
指定したパターンに従い、文字列ソース値から新しい時間値を返す。
fn-bea:time-to-string-with-format
指定したパターンの時刻文字列を返す。
実行制御関数
fn-bea:async
XQuery 式を非同期的に評価し、評価結果をバッファーに格納する。
fn-bea:fence
最適化するアイランドにクエリを分割し、最適化の境界の定義を可能にする。
fn-bea:if-then-else
2 つの他の入力パラメータから 1 つを選択するために、ブール パラメータの値を受け取る。
fn-bea:timeout
一次 XQuery 式がタイムアウトされた場合、一次式全体の結果か、代替式全体の結果を返す。
 
fn-bea:timeout-with-label
fn-bea:timeout と同様だが、監査をサポートするラベルが付いている。
 
fn-bea:fail-over
一次 XQuery 式が失敗した場合、一次式全体の結果か代替式全体の結果を返す。
数値関数
fn-bea:decimal-round
指定した精度、または整数に四捨五入した 10 進値を返す。
fn-bea:decimal-truncate
指定した精度、または整数に切り捨てた 10 進値を返す。
その他の関数
fn-bea:get-property
外部からの影響に基づき行動を変更できるデータ サービスの書き込みを可能にする。
fn-bea:inlinedXML
テキスト形式の XML を解析し、XQuery 1.0 データ モデルのインスタンスを返す。
fn-bea:format-number
指定したフォーマット パターンを使用して Double 型を文字列に変換する。
QName 関数
fn-bea:QName-from-string
xs:QName を作成し、指定した引数の値をネームスペースなしのローカル名として使用する。
シーケンス関数
fn-bea:interleave
引数に指定した項目をインターリーブする。
文字列関数
fn-bea:match
入力された文字列のどの文字が入力した正規表現に一致するかを指定する整数のリスト(整数が 0 の空のリストあるいは整数が 2 つ入ったリスト)を返す。
fn-bea:sql-like
SQL LIKE 句構文で指定したパターンを使って文字列を検索する。 この関数を使うと、パターンにおいてワイルドカードをエスケープするオプションが可能になる。
fn-bea:trim
先頭と末尾の空白文字を削除する。
fn-bea:trim-left
先頭の空白文字を削除する。
fn-bea:trim-right
末尾の空白文字を削除する。
 
fn-bea:pad-left
指定した文字列の左に指定の文字数を追加する。 必要に応じて、パディングに利用された文字列を指定することもできる。
 
fn-bea:pad-right
指定した文字列の右に指定の文字数を追加する。 必要に応じて、パディングに利用された文字列を指定することもできる。

アクセス制御関数

AquaLogic Data Services Platform (AquaLogic データ サービス プラットフォーム) は、その基礎となる WebLogic プラットフォームのロール ベース セキュリティ ポリシーを使用し、データ リソースへのアクセスを管理します。 セキュリティ ポリシーは、保護されたリソースにアクセスするために満たさなければならない条件です。 ポリシー、要求されたリソースおよびユーザ コンテキストに従って条件の評価結果が FALSE である場合、当該リソースへのアクセスがブロックされ、関連データは返されません。

AquaLogic Data Services Platform Console を使用していったんセキュリティ ポリシーが構成されると、この節で説明したセキュリティの拡張関数で以下の情報を確認することができます。

この節では、BEA の XQuery 実装における以下の AquaLogic Data Services Platform のアクセス管理拡張関数について説明します。

fn-bea:is-access-allowed

fn-bea:is-access-allowed 関数は、現在の要求コンテキストに関連するユーザが、リソース名とデータ サービス識別子で示される指定リソースにアクセスできるかチェックします。

この関数には以下の署名があります。

fn-bea:is-access-allowed($resource as xs:string, $data_service as xs:string) as xs:boolean

$resource はリソース名で、また $data_service はリソースの識別子です。

この関数は、WebLogic セキュリティ フレームワークにコールし、指定したリソースについてアクセスをチェックします。 以下にその例を示します。

if (fn-bea:is-access-allowed("ssn", "ld:DataServices/CustomerProfile.ds"))
	then fn:true() 

fn-bea:is-user-in-group

fn-bea:is-user-in-group 関数は、現在のユーザが、指定したグループに存在するかチェックします。 この関数は、適切なグループ メンバシップについて、WebLogic で認証された対象を分析します。

この関数には以下の署名があります。

fn-bea:is-user-in-group($group as xs:string) as xs:boolean

$group は現在のユーザに対してテストするグループです。

注意 : この処理は自動的に認証されません。

fn-bea:is-user-in-role

fn-bea:is-user-in-role 関数は、現在のユーザが指定したグローバル ロールに存在するかチェックします。この関数は、WebLogic セキュリティ フレームワークからロールリストを取得します。

この関数には以下の署名があります。

fn-bea:is-user-in-group($group as xs:string) as xs:boolean

$role は現在のユーザに対してテストするロールです。

注意 : この処理は自動的に認証されません。

fn-bea:userid

fn-bea:userid() 関数は、保護されたリソースを要求するユーザの識別子を返します。

この関数には以下の署名があります。

fn-bea:userid() as xs:string

期間、日付および時間の関数

この節では、BEA の XQuery 実装における以下の期間、日付および時刻の拡張関数について説明します。

fn-bea:date-from-dateTime

fn-bea:date-from-dateTime() 関数は、dateTimedate に変換し、dateTime 値の日付部分を返します。

この関数には以下の署名があります。

fn-bea:date-from-dateTime($dateTime as xs:dateTime?) as xs:date?

$dateTime は日時です。

例:

fn-bea:date-from-string-with-format

fn-bea:date-from-string-with-format 関数は、指定したパターンに従い、文字列ソース値から新しい date 値を返します。

この関数には以下の署名があります。

fn-bea:date-from-string-with-format($format as xs:string?, $dateString as xs:string?) as xs:date?

$format はパターン、$dateString は日付です。 パターンの指定の詳細については、日付および時間のパターン 参照してください。

例:

fn-bea:date-to-string-with-format

fn-bea:date-to-string-with-format 関数は、指定したパターンの日付文字列を返します。

この関数には以下の署名があります。

fn-bea:date-from-string-with-format($format as xs:string?, $dateString as xs:string?) as xs:date?

$format はパターン、$date は日付です。 パターンの指定の詳細については、日付および時間のパターン を参照してください。

例:

fn-bea:dateTime-from-string-with-format

fn-bea:dateTime-from-string-with-format 関数は、指定したパターンに従い、文字列ソース値から新しい dateTime 値を返します。

この関数には以下の署名があります。

fn-bea:date-from-string-with-format($format as xs:string?, $dateString as xs:string?) as xs:date?

$format はパターン、$dateTimeString は日時です。 パターンの指定の詳細については、日付および時間のパターン を参照してください。

例:

fn-bea:dateTime-to-string-with-format

fn-bea:dateTime-to-string-with-format 関数は、指定したパターンの日時文字列を返します。

この関数には以下の署名があります。

fn-bea:date-from-string-with-format($format as xs:string?, $dateString as xs:string?) as xs:date?

$format はパターン、$dateTime は日時です。 パターンの指定の詳細については、日付および時間のパターン を参照してください。

例:

fn-bea:time-from-dateTime

fn-bea:time-from-dateTime 関数は、dateTime 値から時刻を返します。

この関数には以下の署名があります。

fn-bea:date-from-dateTime($dateTime as xs:dateTime?) as xs:date?

$dateTime は日時です。

例:

fn-bea:time-from-string-with-format

fn-bea:time-from-string-with-format 関数は指定したパターンに従い、文字列ソース値から新しい時刻値を返します。

この関数には以下の署名があります。

fn-bea:time-from-string-with-format($format as xs:string?, $timeString as xs:string?) as xs:time?

$format はパターン、$timeString は時刻です。 パターンの指定の詳細については、日付および時間のパターン を参照してください。

例:

fn-bea:time-to-string-with-format

fn-bea:time-to-string-with-format 関数は指定したパターンの時刻文字列を返します。

この関数には以下の署名があります。

fn-bea:time-to-string-with-format($format as xs:string?, $time as xs:time?) as xs:string?

$format はパターンで、$time は時刻です。 パターンの指定の詳細については、日付および時間のパターン を参照してください。

例:

日付および時間のパターン

Java クラスの標準記号を使用することにより、日付と時刻のパターンを作成することができます。表 2-2 は使用可能なパターン記号を示しています。

表 2-2 日付および時間のパターン  
記号    
対応データ  
出力結果
G
年代
AD
y
1996
M
7月、07
d
19
h
時 (1-12)
10
H
時 (0-23)
22
m
30
s
55
S
ミリ秒
978
E
曜日
火曜日
D
27
w
週 (年間)
27
W
週 (月間)
2
a
am/pm
AM, PM
k
時間 (1-24)
24
K
時間 (0-11)
0
z
時間帯
太平洋標準時間
太平洋夏時間

実際の値を表すのに必要な最大文字数に一致するまで各記号を繰り返します。. 例えば、4 July 2002 を表すパターンは、d MMMM yyyy です。 12:43 PM を表すパターンは、hh:mm a です。

実行制御関数

この節では、BEA の XQuery 実装における以下の AquaLogic Data Services Platform の実行制御拡張関数について説明します。

fn-bea:async

fn-bea:async 関数は、バッファを使用して実行スレッド間にデータ フローを制御し、XQuery 式を非同期的に評価します。

この関数には以下の署名があります。

fn-bea:async($expression as item()*, $cap as xs:integer) as item()*

$expression は非同期的に評価する XQuery 式、 $cap はバッファサイズです。

fn-bea:async 関数は、Web サービスの非同期的実行を可能にし、サービスの待ち時間により発生する問題を削減します。 この方法を取れば、1 や 2 などのサイズの小さいバッファも有効に使えます。最初のトークンの生成時間が長くても、その後のトークンの生成はもっと速くできるはずだからです。

例:

以下の例では、CUSTOMER はデータベース テーブルで、getCreditScore 関数は 2 つの格付け機関が提供する Web サービスです。

for $cust in db:CUSTOMER()
where $cust/ID eq $param
return
let $score1:= fn-bea:async(exper:getCreditScore($cust/SSN), 2),
    $score2:= fn-bea:async(equi:getCreditScore($cust/SSN), 2)
return
if (fn:abs($score1 - $score2) < $threshold)
then fn:avg(($score1, $score2))
else fn:max(($score1, $score2))

fn-bea:fail-over

fn:bea:fail-over 関数は、$seq の評価に例外が発生しない場合、$seq の評価結果を返します。 例外が発生する場合は、$alt を返します。 どちらも多様関数で、その静的リターン タイプは $seq および $alt の静的タイプの組み合わせです。

この関数には以下の署名があります。

fn-bea:fail-over($seq as item()*,
           $alt as item()*) as item()*
fn-bea:fail-over($seq as item()*,
           $alt as item()*) as item()*

$alt が返される場合、監査レコードに以下が含まれています。

$seq の評価によって例外が発生した場合、同じクエリの評価中、このインスタンスに続くすべての評価が $alt を返します。 $seq の再評価は行いません。

$alt の評価によって例外が発生した場合、報告をするだけです。 エラー処理を行うことはありません。

使用方法における提案事項

fn-bea-fail-over( ) 関数は 2 通りに利用できます。

fn-bea:fence

fn-bea:fence 関数を使用すると、クエリを複数のアイランドに分割し、その中で境界を越えることのないよう最適化を行い、最適化の境界の定義ができます。 クエリを積み重ねる場合にもfn-bea:fence 関数を利用できます。

この関数には以下の署名があります。

fn-bea:async($expression as item()*, $cap as xs:integer) as item()*

$expression は入力式です。

fn-bea:fence 関数は入力ストリームを変更しない pass-through 関数ですが、グローバルな書き換えがその中で起こらないようオプティマイザに指示を出します。 特に、fn-bea:fence 関数は、表示展開 (view unfolding)、ループ展開 (loop unrolling)、定数畳み込み (constant folding) およびブール最適化 (Boolean optimizations) の書き換えを防ぎます。

fn-bea:if-then-else

fn-bea:if-then-else 関数は第 1 パラメータの値を検査します。 条件が true の場合、AquaLogic Data Services Platform は第 2 パラメータ (then) の値を返します。 条件が false の場合、AquaLogic Data Services Platform は第 3 パラメータ (else) の値を返します。 返される条件がブール値でない場合は、AquaLogic Data Services Platform はエラーを返します。

この関数には以下の署名があります。

fn-bea:if-then-else($condition as xs:boolean?, $ifValue as xdt:anyAtomicType, $elseValue as xdt:anyAtomicType)as xdt:anyAtomicType

$condition はテスト条件、 $ifValue は条件が true の場合に返す値、$elseValue は条件が false の場合に返す値です。

例:

fn-bea:timeout and fn-bea:timeout-with-label

Timeout 関数は設定が自由に変更できるよう設計されています。 エラー条件が発生した場合、関数は単一の $alt 式を返すか、$timeout および $failure としてより詳細な情報を返すことができます。. fn-bea-timeout( )fn-bea-timeout-with-label( ) の 2 つの関数の相違は、後者はエラー条件発生時に監査情報に加えて $label を返すことです。

どちらの timeout 関数も以下の結果のどちらかを返します。

fn-bea-timeout Signature

fn-bea:timeout( ) 関数には以下の署名があります。

	fn-bea:timeout($seq as item()*,
$millisec as xs:integer,
$timeout as item()*,
$failure as item()*) as item()*

$seq は評価する XQuery の一次式、$millisec はミリ秒単位でのタイムアウト値、また $timeout$seq の評価が $millis ミリ秒より長くかかる場合に返されます。 $failure$seq の評価にエラーが発生した場合に返されます。

代わりに、$timeout および $failure パラメータを単一の $altパラメータに置換することができます。 $alt の結果はタイムアウトまたはその他のエラーが発生した場合に返されます。

fn-bea-timeout-with-label Signature

fn-bea:timeout-with-label( ) 関数には以下の署名があります。

	      fn-bea:timeout-with-label($seq as item()*,
$millisec as xs:integer,
$timeout as item()*
$failure as item(),
$label as xs:string) as item()*

$label は監査レコードに提供する情報を示します。 代わりに、タイムアウトまたはその他のエラーが発生すると単一の $alt 要素を返すことができます。

操作の詳細

どちらの関数も$seq の評価が以下のような場合、$seq の評価結果を返します。

  1. エラーが発生しない、また
  2. $millis (ミリ秒単位) の値より長い時間がかからない。

それでもエラーが発生した場合、あるいはミリ秒の制限を越えた場合には、監査記録と共に代替式が返されます。

監査レコードには以下が含まれています。

$millis または $alt の評価にエラーが発生した場合は、通常の方法でエラーが報告されます。 つまり、どちらの関数も返されたエラーに対する処理を行いません。

クエリにおいて、これらの関数の中の1 つの関数の特定インスタンスで $seq の評価にエラーが発生した場合、または「タイムアウト」が発生した場合、同じクエリの評価中、このインスタンスの後続の評価はすべて$timeout および $failure (または $alt) を返します。 この場合は、$seq を再評価することはありません。

タイムアウト関数は以下のように使用することができます。

データ ソースにアクセスするときにエラーが発生した場合、タイムアウト関数はただちに代替式を返すことに注意してください。

ここで、$param が外部パラメータである場合の例を示します。

for $cust in db:CUSTOMER()
where $cust/ID eq $param
return
fn-bea:timeout(exper:getCreditScore($cust/SSN), 200,
fn-bea:timeout(equi:getCreditScore($cust/SSN), 200,
fn:error()
)
)

数値関数

この節では、BEA の XQuery 実装における以下の数字拡張関数について説明します。

fn-bea:format-number

fn-bea:format-number 関数は、指定したフォーマット パターンを使用して Double 型を文字列に変換します。

この関数には以下の署名があります。

fn-bea:format-number($number as xs:double, $pattern as xs:string) as xs:string

$number は文字列に変換する Double 型数値、$pattern はパターン文字列を示します。 このパターンのフォーマットは JDK 1.4.2 DecimalFormat クラスにより指定されます。 (DecimalFormat およびその他の JDK 1.4.2 Java クラスに関する情報については、http://java.sun.com/j2se/1.4.2. を参照してください。)

fn-bea:decimal-round

fn-bea:decimal-round 関数は、指定した精度 (スケール)、または最も近い整数に四捨五入した 10 進値を返します。

この関数には以下の署名があります。

fn-bea:decimal-round($value as xs:decimal?, $scale as xs:integer?) as xs:decimal?

fn-bea:decimal-round($value as xs:decimal?, $scale as xs:integer?) as xs:decimal?

$value は四捨五入する 10 進値で、$scale は入力した 10 進値を四捨五入する精度です。 1 のスケール値は入力した値を小数点以下第 1 位に、2 のスケール値は小数点以下第 2 位に四捨五入します。

例:

fn-bea:decimal-truncate

fn-bea:decimal-truncate 関数は、指定した精度 (スケール)、または最も近い整数に切り捨てた 10 進値を返します。

この関数には以下の署名があります。

fn-bea:decimal-round($value as xs:decimal?, $scale as xs:integer?) as xs:decimal?

fn-bea:decimal-round($value as xs:decimal?, $scale as xs:integer?) as xs:decimal?

$value は切り捨てる 10 進値、$scale は入力した 10 進値を切り捨てる精度です。 1 のスケール値は入力した値を小数点以下第 1 位に、2 のスケール値は小数点以下第 2 位に切り捨てます。

例:

その他の関数

この節では、BEA の XQuery 実装における以下の拡張関数について説明します。

fn-bea:get-property

fn-bea:get-property 関数は、外部影響に基づいて振る舞いを変更できるデータ サービスの書き込みを可能にします。 これは関数をパラメータ化するための暗黙の方法です。

この関数は、最初にプロパティの定義に AquaLogic Data Services Console が使用されているかチェックします。 これにあてはまる場合、この値を文字列として返します。 プロパティが定義されていない場合は、関数がデフォルト値を返します。

この関数には以下の署名があります。

fn-bea:get-property($propertyName as xs:string, $defaultValue as xs:string) as xs:string

$propertyName はプロパティ名、$defaultValue は関数が返すデフォルト値です。

fn-bea:inlinedXML

fn-bea:inlinedXML 関数はテキスト形式の XML を解析し、XQuery 1.0 Data Model のインスタンスを返します。

この関数には以下の署名があります。

fn-bea:inlinedXML($text as xs:string) as node()*

$text は解析するテキスト形式の XML です。

例:

fn-bea:rename

fn-bea:rename 関数は要素名、または要素のシーケンス名を変更します。

この関数には以下の署名があります。

fn-bea:rename($oldelements as element()*, $newname as element()) as element()*)

$oldelements は名前を変更する要素のシーケンス、$newname は新しい名前とタイプを抽出する要素です。

元のシーケンスの各要素について、fn-bea:rename 関数は以下を含む新規要素を返します。

例:

for $c in CUSTOMER()
return
<CUSTOMER>
{fn-bea:rename($c/FIRST_NAME, <FNAME/>)}
{fn-bea:rename($c/LAST_NAME, <LNAME/>)}
</CUSTOMER>

上記の例で、 CUSTOMER() が以下の値を返すと、

<CUST><FIRST_NAME>John</FIRST_NAME><LAST_NAME>Jones</LAST_NAME></CUST>

出力値は以下のようになります。

<CUST><FIRST_NAME>John</FIRST_NAME><LAST_NAME>Jones</LAST_NAME></CUST>

QName 関数

この節では、BEA の XQuery 実装における以下の QName 拡張関数について説明します。

fn-bea:QName-from-string

fn-bea:QName-from-string 関数は、xs:QName を作成し、$param の値をネームスペースなしのローカル名として使用します。

この関数には以下の署名があります。

fn-bea:QName-from-string($name as xs:string) as xs:QName

$name はローカル名です。

シーケンス関数

この節では、BEA の XQuery 実装における以下のシーケンス拡張関数について説明します。

fn-bea:interleave

fn-bea:interleave 関数は、指定した引数のインターリーブを行います。 この関数には以下の署名があります。

fn-bea:async($expression as item()*, $cap as xs:integer) as item()*

$item1 および $item2 はインターリーブする項目です。

例えば、fn-bea:interleave((<a/>, <b/>, </c>), " ") は以下のシーケンスを返します。

(<a/>, " ", <b/>, " ", </c>

文字列関数

この節では、BEA の XQuery 実装における以下の文字列拡張関数について説明します。

fn-bea:match

fn-bea:match 関数は、入力された正規表現に一致する文字列に含まれる文字を指定する 2 つの整数のリストを返します (一致する文字が見つからない場合は、空のリスト)。 関数が一致する文字を返すと、第 1 整数は一致するサブ文字列の最初の文字のインデックス (位置) を、第 2 整数は一致する文字数を示します。 この関数には以下の署名があります。

fn-bea:match($source as xs:string?, $regularExp as xs:string?) as xs:int*

$source は入力された文字列で、$regularExp は正規表現の式を使用します。

正規表現の式は標準java.util.regex.Patternクラス パターンを使用します。 現在有効な正規表現式コンストラクトへのリンクを以下に示します。


http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html 

fn-bea:sql-like

fn-bea:sql-like 関数は、文字列に指定したパターンが含まれているかテストします。 通常は、この関数を SQL クエリの述語に使用される SQL LIKE 演算子と同様にクエリの条件として使用することができます。 ソース式にパターンが一致した場合、関数は TRUE を返し、そうでない場合は、FALSE を返します。

この関数には以下の署名があります。

fn-bea:match($source as xs:string?, $regularExp as xs:string?) as xs:int*

fn-bea:match($source as xs:string?, $regularExp as xs:string?) as xs:int*

$source は検索する文字列、$pattern は SQL LIKE 条件の構文を使用して指定されたパターン、$escape はパターン内のワイルドカード文字をエスケープするために使用する文字です。

パターンを指定するために以下のワイルドカード文字を使用することができます。

エスケープ文字を指定してそれをパターン内の「%」または「_」文字の前に置くことにより、「%」または「_」文字をパターンに含めることができます。 関数は、文字をパターン・マッチング用の特殊文字として解釈するのではなく、文字どおりに読み込みます。

$escape 文字は正確に 1 文字の長さで、パーセント文字 (「%」) とアンダースコア文字 (「_」) を用いることはできません。

例:

fn-bea:trim

fn-bea:trim 関数は、先頭と末尾の空白文字を削除します。

この関数には以下の署名があります。

fn-bea:match($source as xs:string?, $regularExp as xs:string?) as xs:int*

$source はトリムする文字列です。 $source が空のシーケンスの場合、関数は空のシーケンスを返します。 パラメータが文字列でない場合、AquaLogic Data Services Platform はエラーを生成します。

例:

fn-bea:trim-left

fn-bea:trim-left 関数は、先頭の空白文字を削除します。

この関数には以下の署名があります。

fn-bea:match($source as xs:string?, $regularExp as xs:string?) as xs:int*

$input はトリムする文字列です。

例:

fn-bea:trim-right

fn-bea:trim-right 関数は、末尾の空白文字を削除します。

この関数には以下の署名があります。

fn-bea:match($source as xs:string?, $regularExp as xs:string?) as xs:int*

$input はトリムする文字列です。

例:

fn-bea:pad-left

fn-bea:pad-left 関数は、固定長文字列を作成するためパディング文字を文字列の左側に追加します。 関数のバリエーションには 2 つの種類があります。

入力文字列が要求された長さを超える場合は、そこに収まる長さの従属文字列のみを返します。

デフォルト文字を使用した Pad Left 関数(ASCII 32)

この関数には以下の署名があります。

fn-bea:pad-left($str as xs:string?, $size as xs:integer?) as xs:string?

指定された数 ($size) の文字 (ASCII 32) からなる文字列 ($str) が返り、先頭に付加されます。 その結果、$size の長さを持つ文字列となります。 この文字列は、$size - fn:length($str) の空白文字が付加された $str から構成されます。

例:

補注 :

特定 Pad 文字列の Pad Left 関数

この関数には以下の署名があります。

fn-bea:pad-left($str as xs:string?, $size as xs:integer?, $pad as xs:string?) as xs:string?

文字列 ($str) をパッド文字列 ($pad) に付加された任意の数の ($size) とともに返します。この文字列は必要に応じて複製されます。

例:

補注 :

fn-bea:pad-right

fn-bea:pad-right 関数は、固定長文字列を作成するためパディング文字を文字列の右側に追加します。 関数の変化は 2 つの種類があります。

入力文字列が要求された長さを超える場合は、そこに収まる長さの従属文字列のみを返します。

デフォルト文字使用した Pad Right 関数(ASCII 32)

この関数には以下の署名があります。

fn-bea:pad-right($str as xs:string?, $size as xs:integer?) as xs:string?

指定された数 ($size) の文字 (ASCII 32) からなる文字列 ($str) が返り、付加されます。 その結果、$size の長さを持つ文字列となります。 この文字列は、$size - fn:length($str) の空白文字が付加された $str から構成されます。

例:

補注 :

特定 Pad 文字列の Pad Right 関数

この関数には以下の署名があります。

fn-bea:pad-left($str as xs:string?, $size as xs:integer?, $pad as xs:string?) as xs:string?

文字列 ($str) をパッド文字列 ($pad) に付加された任意の数の ($size) とともに返します。この文字列は必要に応じて複製されます。

例:

補注 :

サポートしない XQuery 関数

XQuery 1.0 仕様書の以下の関数は、現在の BEA XQuery エンジンの実装においてサポートされていません。

実装固有の関数および演算子

これまでに説明した XQuery 関数と演算子に対するサポート、および BEA 拡張に加えて、2004 年 7 月 23 日の W3C Working Draft 「XQuery 1.0 and XPath 2.0 Functions and Operators」 (http://www.w3.org/TR/2004/WD-xpath-functions-20040723/ ) により、実装者は 表 2-3 に記載された仕様書の様々な側面を、任意に実装することができます:

表 2-3 実装定義値
説明
AquaLogic Data Services Platform XQuery エンジン
6.2—数値に関する演算子 [算術演算におけるオーバーフローとアンダーフロー]
数値演算のオーバーフローまたはアンダーフローについて、エラーの発生あるいはその他のオプションの選択肢。
算術におけるオーバーフローとアンダーフローは、その基礎となるアプリケーション サーバ JVM (Java Virtual Machine) の行動に従う。
6.2—数値に関する演算子 [xs:decimal value digit precision]
xs:decimal results の精度の桁数
18 桁。
7.4.6—fn:normalize-unicodee
必要な正常化の形「NFC」へのサポートの他に、適合する実装は実装定義のセマンティクスをサポートする場合もある。
未対応。
7.5—サブ文字列の一致に基づく関数
文字列を照会単位に分解することができる。
この関数をサポートする照会はない。
10.1.1—制限と精度
XML Schema Part 2: Data Types で指定した価を超える期間、日付および時刻の制限と精度
秒数の端数は 3 桁以上の精度でサポートされるが、連載データ (binXML パッケージ) では 7 桁、計算中は 18 桁となる。
15.5.4—シーケンスに関する関数および演算子 [fn:doc]
処理またはドキュメントの URI、検証用 DTD またはスキーマの使用、非 XML メディア タイプの処理、非 XML リソースからのデータ モデル インスタンス作成およびドキュメント処理用のエラー処理。
fn:doc() 関数は検証を行わない。 AquaLogic Data Services Platform は、外部 XML と非 XML データ ソースにアクセスするために事前定義外部関数を使用します。

 


BEA XQuery 言語の実装

この節では、BEA XQuery 言語の実装を説明します。以下のトピックがあります。

XQuery 言語のサポート (およびサポートしない機能)

The AquaLogic Data Services Platform (Version: 8.1) は、2004 年 7 月 23 日の W3C Working Draft 「XQuery 1.0: An XML Query Language」 (http://www.w3.org/TR/2004/WD-xquery-20040723/), に適合しますが、以下の例外があります。

AquaLogic Data Services Platform XQuery エンジン の XQuery 言語の拡張

BEA AquaLogic Data Services Platform での XQuery 言語の実装 (AquaLogic Data Services Platform XQuery エンジン) は、仕様書に適合するだけでなく、以下を通して XQuery 言語を拡張することができます。

汎用 FLWGOR (group by)

BEA は標準 FLWOR 式に group by 句の拡張子を提供します。 以下の EBNF は一般的な FLWGDOR 構文を示します。

flwgdorExpression := (forClause | letClause) (forClause 
| letClause
| whereClause
| groupbyClause
| orderbyClause)* returnClause
groupbyClause := "group" [variable "as" variable] "by" (expression 
["as" variable]) ("," (expression ["as" variable]))*

EBNF フラグメントに参照される残りの句は、XQuery 仕様書に記載された標準定義に従います。

例として、年属性を持たない本を除外することなく、年単位で本をグループ化したいとします。 標準の XQuery を使用すると、fn:distinct-values() 関数の結果を用いて self-join を行い、self-join の結果を年属性のない本の結果に結びつける必要があります。

以下はこれを実現するために使用する XQuery 式を示します。

let $books := document("bib.xml")/bib/book return (
for $year in fn:distinct-values($books/@year)
return
<g>
<year>{ $year }</year>
<titles>{ $books[@year eq $year]/title }</titles>
</g>,
<g>
<year/>
<titles>{ $books[fn:empty(@year)]/title }
</g>
)

BEA の group by 拡張関数を使用することにより、同じクエリを以下のように表すことができます。

for $book in document("bib.xml")/bib/book
group $book as $partition by $book/@year as $year
return
<g>
<year>{ $year }</year>
<titles>{ $partition/title }</titles>
</g>

以下の表 (表 2-4 および 表 2-5) は、group by 句の適用前後の本のバインディングを示します。

表 2-4 Group By 句を適用する前のバインディング
$book
<book year="1994" ISBN="147...">...</book>
<book year="1994" ISBN="198..."> ...</book>
<book year="2000" ISBN="123..."> ...</book>

表 2-5 Group By 句を適用した後のバインディング
$year
$partition
1994
(<book year="1994" ISBN="147...">...</book>,
 <book year="1994" ISBN="198..."> ...</book>
2000
<book year="2000" ISBN="123..."> ...</book>

FLWGOR 式は、概念的にバインディング タプルのシーケンスを構築します。タプルのサイズは FLWGOR にあるその時点での範囲内変数の数です。 この例では、group by 句でのタプルは単一の変数バインディング $book から構成され、bib.xml ドキュメントにある各本に 1 冊ずつバインドされます (表 1)。

group by はバインディング タプルの新規シーケンスを作成し、各出力タプルには group by 句で定義される変数が含まれます。 group by 句の後、それまで範囲内にあった変数はすべて範囲外に移動します。

この例では、group by 句からの出力タプルのサイズは 2で、その変数バインディングは $year および $partition です(表 2)。

出力タプル数は、固有の group by 値のバインディング数と等しくなります。 上記の例では、これは固有の book/@year 値の数である 2 になります。 group 句で指定した変数 (上記の例では $partition) は、すべての一致する入力値のシーケンスにバインドされます。

直接要素 および属性コンストラクタのオプション インジケータ

この拡張子を使うと、XQuery に生成された XML の外部 コンシューマが特定の空の要素と属性を省略できるようになります。 これは計算コンストラクタ、条件文およびカスタム関数のかわりに、オプション インジケータを使用することで指定できます。

例として、以下のクエリを考えてみましょう。

<a><b>{()}</b><c foo="{()}"/></a>,

拡張子を使って以下の結果を、

<a><c/></a>

以下の代わりに返すことができます。

<a><b/><c foo=""/></a>

拡張子は直接の要素および属性コンストラクタと共にオプション インジケータ '?' を使用します。 これにより、以下においてプロダクション DirElemConstructor を以下のように変更することができます。

[94]    DirElemConstructor    ::=    "<" QName "?"? DirAttributeList
("/>" | (">" DirElemContent* "</" QName S? ">")) /* ws: explicit */

同様に、DirAttributeList を以下のように変更することができます。

[95]    DirAttributeList    ::=    (S (QName "?"? S? "=" S?
DirAttributeValue)?)*

? が存在する場合、子のない要素、および "" の値を持つ属性が省略されます。 この例ではクエリが以下のように書き込まれ、

<a><b>{()}</b><c foo="{()}"/></a>,

以下の結果を生成します。

<a><c/></a>

もう一つの例として、さまざまなタグを使って新規カスタマ要素を作成するケースを考えてみましょう。 要件の一つは、元のカスタマに電話番号が存在しない場合、結果のカスタマには電話要素が必要ないということです。 標準の XQuery を使用して、以下のように書き込みます。

for $cust in CUSTOMER()
return
<customer>
<id>{ fn:data($cust/C_ID) }</id>
{
if (fn:exists($cust/PHONE))
then <phone>{ fn:data($cust/PHONE) }</phone>
else ()
}
...
</customer>

任意選択の要素コンストラクタを使用すると、以下のように書き込むこともできます。

for $cust in CUSTOMER()
return
<customer>
<id>{ fn:data($cust/C_ID) }</id>
<phone?>{ fn:data($cust/PHONE) }</phone>
...
</customer>

同様に、結果カスタマ要素に要素の代わりに属性を使用する場合、以下に示すように、標準の XQuery を使用して計算属性コンストラクタを使用する必要があります。

for $cust in CUSTOMER()
return
<customer>
<id>{ fn:data($cust/C_ID) }</id>
{
if (fn:exists($cust/PHONE))
then <phone>{ fn:data($cust/PHONE) }</phone>
else ()
}
...
</customer>

任意選択の属性コンストラクタを使用すると、クエリは以下のようになります。

for $cust in CUSTOMER()
return
<customer>
<id>{ fn:data($cust/C_ID) }</id>
<phone?>{ fn:data($cust/PHONE) }</phone>
...
</customer>

XQuery 言語処理の実装定義値

さらに、W3C Working Draft ドキュメントは言語処理のいくつかの側面で、実装者が詳細を任意に設定できるようにします。この場合、各実装者はその実装内容を指定して記録する必要があります。 BEA AquaLogic Data Services Platform バージョン 8.1 で実装された XQuery 言語の「実装定義」の全言語機能を、次の 表 2-6 にまとめてあります。

表 2-6 実装定義値
説明
AquaLogic Data Services Platform XQuery エンジン
2.1.2 動的コンテキスト
比較処理 (またはその他の処理) において時間帯のない日付、時刻、または日時値を使用した場合に使う暗黙の時間帯 (xdt:dayTimeDuration タイプの値)。
基本となるアプリケーション サーバの JVM の時間帯。
2.5.1 エラーの種類 — 静的エラー
静的エラーの報告の仕組み (構文エラーなど、分析段階で検出すべきエラー)。
パーサおよびコンパイラ API は Java 例外を生成
2.5.1 エラーの種類 - 警告
静的、動的およびタイプ エラーの他に、XQuery の実装は特定の条件に対応して分析段階または評価段階において(オプションとして)警告を生成できる。
WarningListener API を提供するが、XQuery 言語の主要実装に対する特殊な警告が定義されていない。
2.6.3 Full Axis 機能
Full Axis 機能がサポートされない場合の任意選択の軸セット
なし。
2.6.6.1 Must-Understand 拡張、XQuery flagger
XQuery flagger (`must understand' 拡張子を含むクエリをフラグするもの) を有効にする仕組み (必要がある場合)。 デフォルトでは flagger は無効になっている。
XQuery flagger はサポートされない。
2.6.7.1 静的タイピングの拡張、 XQuery static flagger
XQuery static flagger を提供する仕組み (必要がある場合)。
XQuery static flagger はサポートされない。
3.1.1 リテラル
文字参照に使用する XML 1.0 または XML 1.1 の選択 (em-dash に — を使うなど、Unicode 文字に対する XML スタイルの参照)。
XML 1.0
3.7.1.2 ネームスペース宣言属性
XML Names 1.1 に対するサポート
なし
3.8.3 Order By および Return 句
順序仕様 (orderspec) は、empty least または、empty greatest として実装できる (XQuery の order by 句内の 2 つの orderspec 値にある greater-than 関係を評価するため)。
最も少ないものを空にする。
4.10 モジュールのインポート
at キーワードに続く文字列リテラルは、モジュールのインポート文にある任意選択のロケーションのヒントで、実装者はそれを解釈 (または無視) することができる。
不適用。AquaLogic Data Services Platform XQuery エンジンはモジュールをサポートしないため、実装が行われない。
4.13 関数の宣言
パラメータを外部関数に引き渡して、呼び出しクエリに関数の結果を返すプロトコル。
Java API のセットが含まれている。
A.2 字句の構造
字句に関するルールは XML 1.0 と XML Names、あるいは XML 1.1 と XML Names 1.1 に従う。
XML 1.0 と XML Names


  トップへ       前へ  次へ