|
World Wide Web Consortium (W3C) は、XQuery については、言語に関する機能のセットを定義します。 BEA AquaLogic Data Services Platform XQuery エンジンは、1 つの例外 (モジュール) を除き、言語機能を完全にサポートし、関数の強力なサブセットもサポートします。さらに、実装ごとに固有の多くの関数および言語キーワードを追加します。
この章では、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 の拡張関数の概要を示します。
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($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 関数は、現在のユーザが、指定したグループに存在するかチェックします。 この関数は、適切なグループ メンバシップについて、WebLogic で認証された対象を分析します。
fn-bea:is-user-in-group($group as xs:string) as xs:boolean
$group は現在のユーザに対してテストするグループです。
| 注意 : | この処理は自動的に認証されません。 |
fn-bea:is-user-in-role 関数は、現在のユーザが指定したグローバル ロールに存在するかチェックします。この関数は、WebLogic セキュリティ フレームワークからロールリストを取得します。
fn-bea:is-user-in-group($group as xs:string) as xs:boolean
| 注意 : | この処理は自動的に認証されません。 |
fn-bea:userid() 関数は、保護されたリソースを要求するユーザの識別子を返します。
この節では、BEA の XQuery 実装における以下の期間、日付および時刻の拡張関数について説明します。
fn-bea:date-from-dateTime() 関数は、dateTime を date に変換し、dateTime 値の日付部分を返します。
fn-bea:date-from-dateTime($dateTime as xs:dateTime?) as xs:date?
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-from-string-with-format($format as xs:string?, $dateString as xs:string?) as xs:date?
$format はパターン、$date は日付です。 パターンの指定の詳細については、日付および時間のパターン を参照してください。
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-from-string-with-format("yyyy-MM-dd G", "2005-06-22 AD") は現在の時間帯で指定した日付、12:00:00AM に対応する価を返します。fn-bea:dateTime-from-string-with-format("yyyy-MM-dd 'at' hh:mm", "2005-06-22 at 11:04") は現在の時間帯で指定した日付、11:04:00AM に対応する価を返します。fn-bea:dateTime-from-string-with-format("yyyy-MM-dd", "2005-July-22") では、データ文字列が指定したフォーマットに一致しないため、エラーが発生します。fn-bea:dateTime-from-string-with-format("yyyy-MMM-dd", "2005-JUL-22") は現在の時間帯で 12:00:00AM に対応する価を返します。
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 関数は、dateTime 値から時刻を返します。
fn-bea:date-from-dateTime($dateTime as xs:dateTime?) as xs:date?
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($format as xs:string?, $time as xs:time?) as xs:string?
$format はパターンで、$time は時刻です。 パターンの指定の詳細については、日付および時間のパターン を参照してください。
Java クラスの標準記号を使用することにより、日付と時刻のパターンを作成することができます。表 2-2 は使用可能なパターン記号を示しています。
実際の値を表すのに必要な最大文字数に一致するまで各記号を繰り返します。. 例えば、4 July 2002 を表すパターンは、d MMMM yyyy です。 12:43 PM を表すパターンは、hh:mm a です。
この節では、BEA の XQuery 実装における以下の AquaLogic Data Services Platform の実行制御拡張関数について説明します。
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 関数は、$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:async($expression as item()*, $cap as xs:integer) as item()*
fn-bea:fence 関数は入力ストリームを変更しない pass-through 関数ですが、グローバルな書き換えがその中で起こらないようオプティマイザに指示を出します。 特に、fn-bea:fence 関数は、表示展開 (view unfolding)、ループ展開 (loop unrolling)、定数畳み込み (constant folding) およびブール最適化 (Boolean optimizations) の書き換えを防ぎます。
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 の場合に返す値です。
Timeout 関数は設定が自由に変更できるよう設計されています。 エラー条件が発生した場合、関数は単一の $alt 式を返すか、$timeout および $failure としてより詳細な情報を返すことができます。. fn-bea-timeout( ) と fn-bea-timeout-with-label( ) の 2 つの関数の相違は、後者はエラー条件発生時に監査情報に加えて $label を返すことです。
どちらの timeout 関数も以下の結果のどちらかを返します。
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( ) 関数には以下の署名があります。
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 の評価結果を返します。
それでもエラーが発生した場合、あるいはミリ秒の制限を越えた場合には、監査記録と共に代替式が返されます。
$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 関数は、指定したフォーマット パターンを使用して 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 関数は、指定した精度 (スケール)、または最も近い整数に四捨五入した 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 関数は、指定した精度 (スケール)、または最も近い整数に切り捨てた 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 関数は、外部影響に基づいて振る舞いを変更できるデータ サービスの書き込みを可能にします。 これは関数をパラメータ化するための暗黙の方法です。
この関数は、最初にプロパティの定義に AquaLogic Data Services Console が使用されているかチェックします。 これにあてはまる場合、この値を文字列として返します。 プロパティが定義されていない場合は、関数がデフォルト値を返します。
fn-bea:get-property($propertyName as xs:string, $defaultValue as xs:string) as xs:string
$propertyName はプロパティ名、$defaultValue は関数が返すデフォルト値です。
fn-bea:inlinedXML 関数はテキスト形式の XML を解析し、XQuery 1.0 Data Model のインスタンスを返します。
fn-bea:inlinedXML($text as xs:string) as node()*
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>
<CUST><FIRST_NAME>John</FIRST_NAME><LAST_NAME>Jones</LAST_NAME></CUST>
<CUST><FIRST_NAME>John</FIRST_NAME><LAST_NAME>Jones</LAST_NAME></CUST>
この節では、BEA の XQuery 実装における以下の QName 拡張関数について説明します。
fn-bea:QName-from-string 関数は、xs:QName を作成し、$param の値をネームスペースなしのローカル名として使用します。
fn-bea:QName-from-string($name as xs:string) as xs:QName
この節では、BEA の XQuery 実装における以下のシーケンス拡張関数について説明します。
fn-bea:interleave 関数は、指定した引数のインターリーブを行います。 この関数には以下の署名があります。
fn-bea:async($expression as item()*, $cap as xs:integer) as item()*
$item1 および $item2 はインターリーブする項目です。
例えば、fn-bea:interleave((<a/>, <b/>, </c>), " ") は以下のシーケンスを返します。
この節では、BEA の XQuery 実装における以下の文字列拡張関数について説明します。
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クラス パターンを使用します。 現在有効な正規表現式コンストラクトへのリンクを以下に示します。
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:sql-like($RTL_CUSTOMER.ADDRESS_1/FIRST_NAME,"H%","\") は、$RTL_CUSTOMER.ADDRESS 内にある、文字 H から始まるすべての FIRST_NAME の要素に TRUE を返します。fn-bea:sql-like($RTL_CUSTOMER.ADDRESS_1/FIRST_NAME,"H%","\") は、$RTL_CUSTOMER.ADDRESS 内にある、任意の文字で始まり、2 番目の文字が a の すべての FIRST_NAME の要素に TRUE を返します。fn-bea:sql-like($RTL_CUSTOMER.ADDRESS_1/FIRST_NAME,"H%","\") は、$RTL_CUSTOMER.ADDRESS 内にある、文字 H% から始まるすべての FIRST_NAME の要素に TRUE を返します。
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:match($source as xs:string?, $regularExp as xs:string?) as xs:int*
fn-bea:trim-right 関数は、末尾の空白文字を削除します。
fn-bea:match($source as xs:string?, $regularExp as xs:string?) as xs:int*
fn-bea:pad-left 関数は、固定長文字列を作成するためパディング文字を文字列の左側に追加します。 関数のバリエーションには 2 つの種類があります。
入力文字列が要求された長さを超える場合は、そこに収まる長さの従属文字列のみを返します。
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 から構成されます。
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 関数は、固定長文字列を作成するためパディング文字を文字列の右側に追加します。 関数の変化は 2 つの種類があります。
入力文字列が要求された長さを超える場合は、そこに収まる長さの従属文字列のみを返します。
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 から構成されます。
fn-bea:pad-left($str as xs:string?, $size as xs:integer?, $pad as xs:string?) as xs:string?
文字列 ($str) をパッド文字列 ($pad) に付加された任意の数の ($size) とともに返します。この文字列は必要に応じて複製されます。
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 に記載された仕様書の様々な側面を、任意に実装することができます:
この節では、BEA 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/), に適合しますが、以下の例外があります。
BEA AquaLogic Data Services Platform での XQuery 言語の実装 (AquaLogic Data Services Platform XQuery エンジン) は、仕様書に適合するだけでなく、以下を通して XQuery 言語を拡張することができます。
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 句の適用前後の本のバインディングを示します。
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>
さらに、W3C Working Draft ドキュメントは言語処理のいくつかの側面で、実装者が詳細を任意に設定できるようにします。この場合、各実装者はその実装内容を指定して記録する必要があります。 BEA AquaLogic Data Services Platform バージョン 8.1 で実装された XQuery 言語の「実装定義」の全言語機能を、次の 表 2-6 にまとめてあります。
|