XQuery Mapper を使用したデータの変換
例 : XQuery を使用したデータの操作と制約
この節では、BEA XQuery Mapper インストールに含まれるサンプル プロジェクトを使用したサンプル シナリオを示します。サンプル プロジェクトを開く方法については、「XQuery Mapper サンプル プロジェクト」を参照してください。
この節の内容は以下のとおりです。
異なるスキーマのデータの結合
XQuery Mapper を使用して、2 つの異なるスキーマのコンテンツを結合できます。次の図 3-1 を参照してください。
この例では、顧客データ (CustInfo.xsd
スキーマで記述されたデータ) が反復する要素 (PO.xsd
スキーマで記述された line-items
) と結合されて、POCustInfo.xsd
スキーマに対して有効な単一の XML ドキュメントになります。
図 3-1 異なるスキーマのデータの結合
異なるスキーマのデータを結合するには
Eclipse を起動してサンプル プロジェクトに移動します。
XQueryTransformations フォルダを右クリックします。
[New|XQuery トランスフォーメーション] を選択します。
この例では、親フォルダは Samples/XQueryTransformations です。
[ファイル名] パスに、combineData
と入力します。
CustInfo.xsd\customer
PO.xsd\purchase-order
POCustInfo.xsd\purchase-order
ソース データとターゲット データを選択すると、combineData.xq
ファイルが作成されます。
以下の表に示されたソース要素を選択し、[対象] ペインにドラッグします。
ソース
|
リンクの種類
|
対象
|
customer
|
|
purchase-order\customer
|
customer\customer-id
|
|
purchase-order\customer\customer-id
|
customer\customer-name
|
|
purchase-order\customer\customer-name
|
customer\customer-address
|
|
purchase-order\customer\customer-address
|
purchase-order\line-item
|
|
purchase-order\line-items\line-item
|
purchase-order\line-items\line-item\part-no
|
|
purchase-order\line-items\line-item\part-no
|
purchase-order\line-items\line-item\quantity
|
|
purchase-order\line-items\line-item\quantity
|
次の図の破線は構造リンクを表します。この種類のリンクは、データを直接マップしない 2 つの親構造間で作成されます。
次の図の実線はデータ リンクを表します。この種類のリンクは、ソース ノードの値をターゲット ノードの値に直接変換します。
リンクの詳細については、「デザイン ビューのグラフィカルな表現について」を参照してください。
ソース要素とターゲット要素間のマップは次の図のように示されます。
図 3-2 デザイン ビューでのデータ トランスフォーメーション
XQuery トランスフォーメーションのテストについては、「XQuery ファイルのテスト」を参照してください。
反復する要素のマップと結合の作成
この節では、PriceQuote.xsd
、AvailableQuote.xsd
、および taxrate.xsd
を結合して、単一の Quote.xsd
ファイルを作成します。
この例では、以下の手順を示します。
手順 1. 新しい XQuery ファイルの作成
この節では、AvailQuote.xsd
、PriceQuote.xsd
、および taxrate.xsd
ファイルを使用して XQuery トランスフォーメーションを作成します。作成後は、複数の priceQuote
ソース要素と availRequest
ソース要素を、対応するターゲット要素に対してマップします。
Eclipse を起動してサンプル プロジェクトに移動します。
XQueryTransformations フォルダを右クリックします。
[New|XQuery トランスフォーメーション] を選択します。
親フォルダが Samples/XQueryTransformations であることを確認します。
以下のソース スキーマ ファイルと要素を選択します。
PriceQuote.xsd\priceQuote
PriceQuote.xsd\taxRate
AvailQuote.xsd\availRequest
Quote.xsd\quote
ソース データとターゲット データを選択すると、Samples/XQueryTransformations フォルダに Join.xq
ファイルが作成されます。
以下の表に示されたソース要素をクリックし、示されたターゲット要素にドラッグ アンド ドロップして要素間にリンクを作成します。
ソース要素
|
リンクの種類
|
ターゲット要素
|
priceQuote\customerName
|
|
quote\name
|
priceQuote\shipAddress
|
|
quote\address
|
priceQuote\priceRequests\priceRequest
|
|
quote\quoteResponse
|
availRequest
|
|
quote\quoteResponse
|
以下の図に示すように、[デザイン] タブに作成したマップが表示されます。
図 3-3 結合の例
手順 2. 条件的制約の追加
ソース ドキュメント priceQuote
と availRequest
には、共通の要素 widgetId
があります。このサブセクションでは、availRequest
要素の widgetId
が priceRequest
要素の widgetId
と一致する場合に、結合された反復要素 quoteResponse
を返す条件的制約を追加します。
制約を追加するには
[ソース] ペインで、以下の要素をクリックします。
priceRequests/priceRequest/widgetId
[ソース] ペインで、priceRequests/priceRequest/widgetId を以下の要素にドラッグ アンド ドロップします。
availRequest/widgetId
以下の図のように 2 つの widgetId ノード間に線が示されます (要素を結合したことを示します)。
図 3-4 結合に条件的制約を追加する
[ソース] タブをクリックして変更内容を確認します。
widgetId ノード間のリンクにより、以下のものが生成されます。
for ループ内の where 句。
この where 句は for ループの出力に制限や制約を付ける。
where 句を使用して、where 句の式が true の場合に for ループによって戻り値の内容が出力されるよう指定できる。
この例では、availRequest 要素の widgetId が priceRequest 要素の widgetId と一致する場合に、</quoteResponse>
という XML データが返される。
quoteResponse 要素は空です。「手順 3. 空の要素にデータを入力するリンクの追加」で示された手順に従って、quoteResponse
要素にデータを入力するデータ リンクを追加します。
手順 3. 空の要素にデータを入力するリンクの追加
この節の手順に従って、quoteResponse 要素にデータを入力するデータ リンクを追加します。
quoteResponse 要素にデータを入力するには
以下の表に示されたソース要素をクリックし、示されたターゲット要素にドラッグ アンド ドロップして要素間にリンクを作成します。
ソース要素
|
リンクの種類
|
ターゲット要素
|
priceQuote\priceRequests\priceRequest\price
|
|
quote\quoteResponse\unitprice
|
priceQuote\priceRequests\priceRequest\widgetid
|
|
quote\quoteResponse\widgetid
|
availRequest\requestedQuantity
|
|
quote\quoteResponse\requestedQuantity
|
availRequest\quantityAvail
|
|
quote\quoteResponse\fillOrder
|
availRequest\shipDate
|
|
quote\quoteResponse\shipDate
|
上のリンクの作成後に、[デザイン] タブに以下のマップが表示されます。
図 3-5 quoteResponse 要素へのデータの入力
手順 4. 総費用額の計算
この手順では、発注書の総費用額を計算する関数を XQuery ソースに追加します。
総費用額を計算するには
ソース ビューで Join.xq
ファイルを開きます。
コード リスト 3-1 calculateTotalPrice 関数
declare function xf:calculateTotalPrice($taxRate as xs:float, $quantity as xs:float,$price as xs:float)
as xs:float {
let $taxQuantity := ($taxRate * $quantity)
let $totalTax := ($taxQuantity * $price)
let $costNoTax := ($quantity * $price)
let $totalCost := ($totalTax + $costNoTax)
return $totalCost
};
デザイン ビューで Join.xq
ファイルを開きます。
注意 : Join.xq
ファイルには、calculateTotalPrice と Join の 2 つの関数宣言が含まれています。XQ ファイルに複数の関数が含まれる場合は、同じ名前の関数がデザイン ビューに表示されます (この場合、Join 関数がデザイン ビューに表示されます)。
[対象] ペインで、totalCost ノードを選択します。次の手順に向けて、このノードを選択したままにしておきます。
[対象の式] タブに移動し、[一般] を選択します。
totalCost を計算するために、次の一般式を追加します。
xf:calculateTotalPrice($taxRate,$availRequest/ns1:requestedQuanity,$priceRequest/ns0:price)
図 3-6 totalCost 要素の一般式
式が XQuery の totalCost 要素に追加されます。
デザイン ビューに totalCost の新しい計算が反映されます。
図 3-7 デザイン ビューでの totalCost の計算
手順 5. 複数の条件を持つ制約の追加
[制約] タブの [Where 句式] ペインで制約を作成すると、XQuery の for
ループに、実行時に返されるターゲットの反復要素を制限する where
句を追加できます。
実行時には、複合条件を満たす反復要素についてのみ for
ループが反復処理されます。この節では、for
ループの where
句に別の条件を追加して (複合条件にして)、for
ループによって返される要素をさらに制限します。
複数の条件を使用して制約を追加するには
availRequest
および
quote\quoteResponse
where
句を構成する 1 つの条件が [制約] タブの [Where 句式] ペインに表示されます。
data($priceRequest/ns0:widgetId) = data($availRequest/ns1:widgetId)
availRequest/requestedQuanity ノードを選択して、[Where 句式] ペインの [左辺の式] セクションにドラッグ アンド ドロップして、以下の式を形成します。
data($availRequest/ns1:requestedQuanity)
[Where 句式] ペインの [右辺の式] セクションにあるテキストを削除します。
[Where 句式] ペインの [右辺の式] セクションに、"50" と入力します。
注意 : 50 は引用符で囲む必要があります。つまり、50 ではなく "50" と入力します。
[結合の種類] フィールドから [AND] オプションを選択します。
[結合の種類] によって、where
句を構成する条件が実行時に評価される方法が決まります。
[追加] をクリックします。for
ループの where
句に、2 つ目の条件が追加されます。
作業内容を保存します。これで、以下の where
句が作成されました。
where (data($availRequest/ns1:widgetId) = data($priceRequest/ns0:widgetId)
and data($availRequest/ns1:requestedQuanity) < "50")
XQuery をテストするには
XQuery トランスフォーメーションのテストについては、「XQuery ファイルのテスト」を参照してください。
この例に特化した以下の手順を実行して、「手順 5. 複数の条件を持つ制約の追加」でコンフィグレーションした両方の制約が満たされる場合にクエリが実行されることをテストする準備を整えます。
テスト ビューの [ソース データ] ペインで、[ソース変数] フィールドの priceQuote を選択して [データの生成] をクリックします。
テスト XML の widgetId 要素の値を書き留めます。
<ns0:widgetId>value
</ns0:widgetId>
[ソース データ] ペインで、[ソース変数] フィールドの availRequest を選択して [データの生成] をクリックします。
テスト XML の widgetId 要素の値に注目します。この値を編集して、priceQuote のテスト XML ファイル (手順 2) に表示された値と同じ値を入力します。
<ns0:widgetId>value
</ns0:widgetId>
requestedQuanity 要素を特定し、50 未満の値に編集します。次に例を示します。
<ns0:requestedQuanity>25</ns0:requestedQuanity>
[結果データ] ペインで [XQuery のテスト] をクリックし、[結果データ] ペインに表示された XQuery の結果を確認します。
[制約] タブの [和集合] オプションの使用
この例では、[制約] タブで [和集合] オプションを使用して、同じ型のデータを大きなデータ セットにマップする XQuery を作成します。
同じ型のデータ セットを結合するには
Eclipse を起動してサンプル プロジェクトに移動します。
XQueryTransformations フォルダを右クリックします。
[New|XQuery トランスフォーメーション] を選択します。
この例では、親フォルダは Samples/XQueryTransformations です。
[ファイル名] パスに union
と入力します。
以下のソース ファイルを選択します (PO.xsd\purchase-order
を 2 回選択します)。
PO.xsd\purchase-order
PO.xsd\purchase-order
Order.xsd\order
ソース データとターゲット データを選択すると、union.xq
ファイルが作成されます。
以下の表に示されたソース要素を選択し、[対象] ペインにドラッグします。
ソース要素
|
リンクの種類
|
ターゲット要素
|
purchase-order\line-items\line-item
|
|
order\items\item
|
purchase-order1\line-items\line-item
|
|
order\items\item
|
以下の図は、リンクの [デザイン] タブを示しています。
図 3-8 和集合の作成
![和集合の作成 和集合の作成](wwimages/union_example3.gif)
作業を続行する前に、$purchase-order/line-items/line-item
([ソース] ペインの反復する要素) と order/items/item
([対象] ペインの反復する要素) の間のリンクが選択されていることを確認してください。
[制約の種類] ペインで、[和集合] を選択します。
[ソース] ペインの part-no
要素と [対象] ペインの part-number
要素の間にリンクを作成します。
注意 : [ソース] ペインと [対象] ペインで要素の名前が同じである場合は、この手順の説明に従って手動でリンクを作成する代わりに、[自動マップ] 右クリック メニュー オプションを使用できます。詳細については、「リンクのメニュー オプション」を参照してください。
2 つの構造的なリンクには和集合の制約が適用されているため、図 3-9 で示されているように、下位要素の 2 番目のセット間に暗黙的なデータ リンクが生成されます。灰色の実線は、[制約] タブの [和集合] を選択して作成された暗黙的なリンクを表します。
図 3-9 暗黙的なリンクの作成
XQuery トランスフォーメーションのテストの詳細については、「XQuery ファイルのテスト」を参照してください。
反復ソースと非反復ターゲットの間のトランスフォーメーションの作成
この例では、反復する要素に、反復しない単一の要素をマップする方法を示します。この例では、以下の図に示されているように、反復する XML 要素 (ソース スキーマによって定義) の値を取得し、この要素をターゲット XML ドキュメントの単一の要素 (ターゲット スキーマで定義) にマップするトランスフォーメーションを作成します。
図 3-10 反復ソース グループから非反復ターゲット要素へ
反復ソース グループと非反復ターゲット要素の間のマップを作成するには
Eclipse を起動してサンプル プロジェクトに移動します。
XQueryTransformations フォルダを右クリックします。
[New|XQuery トランスフォーメーション] を選択します。
この例では、親フォルダは Samples/XQueryTransformations です。
[ファイル名] フィールドに repeatToNonRepeat
と入力します。
Dates.xsd\dates
PODate.xsd\PODate
[ソース] ペインから反復する要素 (dates/date
) を選択し、[対象] ペインにある最初の単一の要素 (PODate/billing-date
) にドラッグします。
このリンクを選択したままにして、次の手順に進みます。
[ソース] ペインから dates/date/type
ノードを選択して、[制約] タブにある [Where 句式] の [左辺の式] ペインにドロップします。
[制約] タブにある [Where 句式] の [右辺の式] ペインで、"BILLING"
と入力します。
以下の図に示されているように、date の文字列を入力するときは引用符を使用してください。
図 3-11 文字列関数の入力時に引用符を使用
前の手順で作成した制約により、XML ドキュメントの dates/date/type
要素の値を値 "BILLING" と比較するよう指定されます。
次の手順では、dates/date/type
要素の値が "BILLING" と一致する場合に指定されたデータを返す XQuery コードを for ループに追加します。
[ソース] ペインから dates/date/value
要素を選択し、[対象] ペインにある PODate/billing-date
要素にドラッグします。
データ リンクが作成されます。
このデータ リンクは、実行時に、制約 data($date/ns0:type) = "BILLING"
が true である場合に、billing-date
の値として datesDoc/date/value
の値を返します。
[ソース] ペインから反復する要素 (dates/date
) を選択し、[対象] ペインにある 2 番目の単一の要素 (PODate/delivery-date
) にドラッグします。
2 つの要素をつなぐ破線が表示されます。
このリンクを選択したままにして、次の手順に進みます。
[ソース] ペインから dates/date/type
ノードを選択して、[制約] タブにある [Where 句式] の [左辺の式] ペインにドロップします。
[制約] タブにある [Where 句式] の [右辺の式] ペインで、"DELIVERY"
と入力します。次の手順では、実行時に制約が true である場合にデータを返す XQuery コードを追加します。
注意 : 文字列値を入力するときは引用符を使用してください。
実行時に、この手順で作成した制約によって、dates/date/type
が文字列 "DELIVERY"
に等しいかどうかがテストされます。
[ソース] ペインから dates/date/value
要素を選択し、[対象] ペインにある PODate/delivery-date
要素にドラッグします。
データ リンクが作成されます。
このデータ リンクは、実行時に、制約 data($date/ns0:type) = "DELIVERY"
が true である場合に、delivery-date
として dates/date/value
の値を返します。
XQuery ファイルのテストの詳細については、「XQuery ファイルのテスト」を参照してください。
非反復ソースと反復ターゲットの間のトランスフォーメーションの作成
この例では、反復する要素に反復しない要素をマップする方法を示します。また、実行時に、単一のソース要素を反復するターゲット要素にマップするトランスフォーメーションを作成します。次の図を参照してください。
図 3-12 非反復ソース要素から反復ターゲット グループへ
非反復ソース要素と反復ターゲット グループを作成するには
Eclipse を起動してサンプル プロジェクトに移動します。
XQueryTransformations フォルダを右クリックします。
[New|XQuery トランスフォーメーション] を選択します。
この例では、親フォルダは Samples/XQueryTransformations です。
[ファイル名] パスに nonRepeatToRepeat
と入力します。
PODate.xsd\PODate
Dates.xsd\dates
ソース データとターゲット データを選択すると、nonRepeatToRepeat.xq
ファイルが作成されます。
以下の表に示されているソース要素を選択します。選択したソース要素を [ソース] ペインから [対象] ペインにドラッグします。
[ソース] ペイン
|
リンクの種類
|
[対象] ペイン
|
pODate/billing-date
|
|
dates/date
|
pODate/delivery-date
|
|
dates/date
|
次のような XQuery コードが生成されます。
<ns1:dates>
{
for $PODate in $pODate/ns0:billing-date union $pODate/ns0:delivery-date
return
<ns1:date/>
}
</ns1:dates>
実行時には、上記の XQuery コードの for
ループが 2 回実行されます。最初に for
ループが実行されるとき、反復変数 $PODate
は和集合の最初の要素 $pODate/ns0:billing-date
と対応し、2 回目に for
ループが実行されるとき、変数 $PODate
は和集合の 2 番目の要素 $pODate/ns0:delivery-date
と対応します。
上記のクエリで返される XML データは 2 つの空要素 <ns1:date/>
を返します。
以降の手順では、請求日と納期をクエリに返す XQuery コードが追加されます。
[ソース] ペインから pODate/billing-date
要素を選択し、[対象] ペインにある dates/date/value
要素にドラッグします。
次の図のように、2 つのデータ リンクが作成されます。
図 3-13 構造リンクの結合の作成
構造リンク (pODate/billing-date
から dates/date
) と (pODate/delivery-date
から dates/date
) が結合されているため、pODate/billing-date
要素から dates/date/value
要素 (dates/date/value
) へのリンクを作成したときに、pODate/delivery-date
要素と dates/date/value
要素の間に 2 番目のデータ リンクが自動的に作成されます。
[ソース] ペインから pODate/billing-date
要素を選択し、[対象] ペインにある dates/date/type
要素にドラッグします。
2 つのデータ リンクが作成されます。
pODate/billing-date
から dates/date/type
へのリンクを選択したままにして、次の手順に進みます。
[If Then Else] オプションを選択します。
XQuery の if-then-else 構文がリンクに追加されます。たとえば、リンクに対する次のような XQuery ソース コード セグメントが、
data($PODate)
以下の XQuery ソース コード セグメントで置き換えられます。
if (xf:boolean("true")) then
data($PODate)
else
()
[If 条件] ペインが表示されます。
この手順では、if-then-else の if セクションに条件を追加します。
[XQuery 関数|ノード関数] を展開します。
local-name 関数を選択して、[If 条件] ペインの [左辺の式] ペインにドラッグします。$node-var
引数は選択したままにしておきます。
[ソース] から、構造リンクの pODate
変数を、[If 条件] ペインにある local-name
関数の $node-var
引数にドラッグ アンド ドロップします。
[If 条件] ペインの [右辺の式] セクションで、"BILLING DATE"
と入力して [追加] をクリックします。
注意 : 文字列値を入力するときは引用符を使用してください。
以下の図で示されているように、if-then-else の if セクションに条件が追加されます。
図 3-14 請求日の If 条件
[Then 式] セクションで、既存のテキストを文字列 "BILLING"
で置き換えます。
次のテキストを、
data($PODate)
次の文字列で置き換えます。
"BILLING
"
注意 : 文字列 "BILLING"
の引用符は必ず入力してください。
[Else 式] セクションで、文字列 "DELIVERY"
を入力します。
注意 : 文字列 "DELIVERY"
の引用符は必ず入力してください。
[式の構造] ペインで、[If Then Else] をクリックします。
以下の図に示されているように、XQuery コードが [式の構造] ペインに表示されます。
図 3-15 If-Then-Else サンプルの結果の表示
XQuery ファイルのテストの詳細については、「XQuery ファイルのテスト」を参照してください。
ネストされた If-Then-Else 式の作成
この例では、ウィジェット ID と州税率に基づいて価格を計算する XQuery トランスフォーメーションを作成します。XQuery Mapper を使用して、次の if-then-else ロジックを表す式の構造を作成します。
ウィジェット ID が 0 ~ 200 の場合、価格は $10.00
ウィジェット ID が 201 ~ 400 の場合、価格は $20.00
ウィジェット ID が 401 ~ 600 の場合、価格は $30.00
この例では、以下の手順を示します。
手順 1. 新しい XQuery トランスフォーメーションの作成
この手順では、PurchaseAgree.xsd
と Supplier.xsd
を使用して新しい XQuery トランスフォーメーションを作成します。
新しい XQuery トランスフォーメーションを作成するには
Eclipse を起動してサンプル プロジェクトに移動します。
XQueryTransformations フォルダを右クリックします。
[New|XQuery トランスフォーメーション] を選択します。
この例では、親フォルダは Samples/XQueryTransformations です。
[ファイル名] パスに ifthenelse
と入力します。
Supplier.xsd\Supplier
PurchaseAgree.xsd\PurchaseOrder
ソース データとターゲット データを選択すると、ifthenelse.xq
ファイルが作成されます。
以下の要素を [ソース] ペインから [対象] ペインにドラッグします。
[ソース] ペイン
|
リンクの種類
|
[対象] ペイン
|
supplier/products/product
|
|
PurchaseOrder/products/product
|
supplier/products/product/price
|
|
PurchaseOrder/products/product/price
|
手順 2. 最初の If 条件の作成
この手順では、ウィジェット ID が 0 ~ 200 の場合に価格を $10.00 に設定する If 式を作成します。
最初の If 式を作成するには
式の種類として [If Then Else] を選択します。
[式の構造] ペインで、[If 条件] が選択されていることを確認します。
[ソース] ペインから、widgetId 要素を [左辺の式] ペインにドラッグ アンド ドロップします。
注意 : 数値を入力するときは引用符を使用してください。
[右辺の式] セクションで、"200"
と入力します。
注意 : 数値を入力するときは引用符を使用してください。
[編集 : Then 式] ペインで、"$10.00" と入力します。
注意 : [編集 : Then 式] ペインの既存のデータは削除しておきます。"$10.00" と入力するときは引用符を使用してください。
[式の構造] ペインで、[If Then Else] を選択します。
if then ステートメントが以下のように表示されていることを確認してください。
図 3-16 If Then 式の構造
手順 3. 最初のネストされた If-Then-Else 条件の作成
この手順では、ウィジェット ID が 201 ~ 400 の場合に価格を $20.00 に設定する、ネストされた If 式を作成します。このためには、「手順 2. 最初の If 条件の作成」で作成した Else 式の内部に、ネストされた If-Then-Else を挿入します。
最初のネストされた If-Then-Else 条件を作成するには
[式の構造] ペインで、[Else 式] を選択します。
右クリックして、[ネストされた If-Then-Else を挿入] を選択します。
ネストされた If-Then-Else 式で、[If 条件] を選択します。
[ソース] ペインから、widgetId 要素を [左辺の式] ペインにドラッグ アンド ドロップします。
[右辺の式] セクションで、"201"
と入力します。
注意 : 数値を入力するときは引用符を使用してください。
[右辺の式] セクションで、"400"
と入力します。
注意 : 数値を入力するときは引用符を使用してください。
[編集 : Then 式] ペインで、"$20.00" と入力します。
注意 : 数値を入力するときは引用符を使用してください。
[式の構造] ペインで、[If Then Else] を選択します。
ステートメントが以下のように表示されていることを確認してください。
図 3-17 ネストされた If Then Else 式の構造
手順 4. 2 つ目のネストされた If-Then-Else 条件の作成
この手順では、ウィジェット ID が 401 ~ 600 の場合に価格を $30.00 に設定する If 式を作成します。このためには、「手順 3. 最初のネストされた If-Then-Else 条件の作成」で作成した Else 式の内部に、ネストされた If-Then-Else を挿入します。
2 つ目のネストされた If-Then-Else 条件を作成するには
[式の構造] ペインで、[Else 式] を選択します。
注意 : 「手順 3. 最初のネストされた If-Then-Else 条件の作成」で作成した Else 式を必ず選択してください。
右クリックして、[ネストされた If-Then-Else を挿入] を選択します。
[ソース] ペインから、widgetId 要素を [左辺の式] ペインにドラッグ アンド ドロップします。
ネストされた If-Then-Else 式で、[If 条件] を選択します。
[右辺の式] セクションで、"401"
と入力します。
注意 : 数値を入力するときは引用符を使用してください。
[右辺の式] セクションで、"600"
と入力します。
注意 : 数値を入力するときは引用符を使用してください。
[編集 : Then 式] ペインで、"$30.00" と入力します。
注意 : 数値を入力するときは引用符を使用してください。
[式の構造] ペインで、[If Then Else] を選択します。
ステートメントが以下の図のように表示されていることを確認してください。
図 3-18 2 つ目のネストされた If-Then-Else 式
XQuery ファイルのテストの詳細については、「XQuery ファイルのテスト」を参照してください。
再帰的なスキーマの使用
この例では、再帰的な要素を含むスキーマを使用してマップを作成する方法を示します。再帰的な要素には、次の図で示されたような親と同じ型の子要素が含まれています。この例では、product
要素の型が productType
であり、かつ productType
には型が同じ productType
である child-product
要素が含まれているため (productType
は自身を参照)、product
要素は再帰的です。
図 3-19 再帰的なスキーマのサンプル
再帰的なスキーマを使用してトランスフォーメーションを作成するには
Eclipse を起動してサンプル プロジェクトに移動します。
XQueryTransformations フォルダを右クリックします。
[New|XQuery トランスフォーメーション] を選択します。
この例では、親フォルダは Samples/XQueryTransformations です。
[ファイル名] パスに recursive
と入力します。
SupplierAcme.xsd\supplier-acme
Product.xsd\product
ソース データとターゲット データを選択すると、recursive.xq
ファイルが作成されます。
以下の表に示されているソース要素を選択します。選択したソース要素を [ソース] ペインから [対象] ペインにドラッグします。
[ソース] ペイン
|
リンクの種類
|
[対象] ペイン
|
supplier-acme\part-description-00100
|
|
product\part-description
|
supplier-acme\part-description-00101
|
|
product\child-product\part-description
|
supplier-acme\part-description-00101
|
|
product\child-product\child-product\part-description
|
以下の図に示されているように、product
要素には再帰的な child-product
要素が含まれています。
図 3-20 再帰的な要素のマッピング
XQuery ファイルのテストの詳細については、「XQuery ファイルのテスト」を参照してください。
キー フィールドによるグループ XQuery 構文の作成
キー フィールドによるグループ機能を使用して、1 つまたは複数のキー値に基づいてデータをグループ化できます。ただし、このグループ化機能は XQuery Mapper ではグラフィカルにサポートされておらず、Mapper のデザイン ビューには XQuery の表現はありません。したがって、XQuery Mapper のソース ビューで Group By XQuery 構文を記述する必要があります。
この例では、input-warehouse-id
要素と input-location-desc
要素をキー フィールドとして使用して、出力ドキュメントのデータをグループ化します。
入力 XML ドキュメント (コード リスト 3-2 を参照) の反復する要素 input-line-item の最初と 3 つ目のインスタンスには、input-warehouse-id
要素と input-location-desc
要素の値と同じ値(それぞれ Warehouse1
と Location1
) が含まれる。
この例に示されている XQuery の結果として、ライン アイテムの最初と 3 つ目のインスタンスがグループ化される。つまり、これらの要素は、ターゲット (出力) ドキュメント (コード リスト 3-3 を参照) の Warehouse1
キーと Location1
キーでグループ化されます。
コード リスト 3-2 入力 XML ドキュメントのサンプル
<input-warehouse-inventory xmlns="http://www.creditpo.org/repkeyin">
<input-line-item>
<input-warehouse-id>Warehouse1</input-warehouse-id>
<input-location-desc>Location1</input-location-desc>
<input-part-no>1</input-part-no>
<input-quantity>10</input-quantity>
</input-line-item>
<input-line-item>
<input-warehouse-id>Warehouse2</input-warehouse-id>
<input-location-desc>Location2</input-location-desc>
<input-part-no>2</input-part-no>
<input-quantity>20</input-quantity>
</input-line-item>
<input-line-item>
<input-warehouse-id>Warehouse1</input-warehouse-id>
<input-location-desc>Location1</input-location-desc>
<input-part-no>3</input-part-no>
<input-quantity>30</input-quantity>
</input-line-item>
</input-warehouse-inventory>
コード リスト 3-3 出力ドキュメントのサンプル
<ns0:output-inventory xmlns:ns0="http://www.creditpo.org/repkeyout";>
<ns0:output-warehouse-inventory>
<ns0:output-warehouse-id>Warehouse1</ns0:output-warehouse-id>
<ns0:output-location-desc>Location1</ns0:output-location-desc>
<ns0:output-line-item>
<ns0:output-part-no>1</ns0:output-part-no>
<ns0:output-quantity>10</ns0:output-quantity>
</ns0:output-line-item>
<ns0:output-line-item>
<ns0:output-part-no>3</ns0:output-part-no>
<ns0:output-quantity>30</ns0:output-quantity>
</ns0:output-line-item>
</ns0:output-warehouse-inventory>
<ns0:output-warehouse-inventory>
<ns0:output-warehouse-id>Warehouse2</ns0:output-warehouse-id>
<ns0:output-location-desc>Location2</ns0:output-location-desc>
<ns0:output-line-item>
<ns0:output-part-no>2</ns0:output-part-no>
<ns0:output-quantity>20</ns0:output-quantity>
</ns0:output-line-item>
</ns0:output-warehouse-inventory>
</ns0:output-inventory>
Group By XQuery 構文を作成するには
Eclipse を起動してサンプル プロジェクトに移動します。
XQueryTransformations フォルダを右クリックします。
[New|XQuery トランスフォーメーション] を選択します。
親フォルダが Samples/XQueryTransformations であることを確認します。
[ファイル名] パスに groupby
と入力します。
regroupKeyFldIn.xsd\input-warehouse-inventory
regroupKeyFldOut.xsd\output-inventory
ソース データとターゲット データを選択すると、groupby.xq
ファイルが作成されます。
注意 : BEA WebLogic Integration 8.1 リリースの XQuery Mapper では、この時点で input-warehouse-id
と output-warehouse-inventory
との間のリンクを選択し、[制約の種類|キー フィールドによるグループ] をグラフィカルに選択できましたが、このリリースでは、デザイン ビュー上の表現は使用できません。Group by タイプはサポートされていますが、以下の手順に示すように、該当する XQuery を記述する必要があります。
既存の XQuery コードを以下のコードと置き換えます。
コード リスト 3-4 キー フィールドによるグループ XQuery 構文
declare namespace ns0 = "http://www.creditpo.org/repkeyin";
declare namespace ns1 = "http://www.creditpo.org/repkeyout";
declare function Regrouping($input-warehouse-inventory as element(ns0:input-warehouse-inventory))
as element(ns1:output-inventory) {
<ns1:output-inventory>
{
for $input-line-item in $input-warehouse-inventory/ns0:input-line-item
group $input-line-item as $group by
$input-line-item/ns0:input-warehouse-id as $key0,
$input-line-item/ns0:input-location-desc as $key1
return
<ns1:output-warehouse-inventory>
<ns1:output-warehouse-id>{ data($key0) }</ns1:output-warehouse-id>
<ns1:output-location-desc>{ data($key1) }</ns1:output-location-desc>
{
for $group0 in $group return
<ns1:output-line-item>
<ns1:output-part-no>{ xs:byte( data($group0/ns0:input-part-no) ) }</ns1:output-part-no>
<ns1:output-quantity>{ xs:byte( data($group0/ns0:input-quantity) ) }</ns1:output-quantity>
</ns1:output-line-item>
}
</ns1:output-warehouse-inventory>
}
</ns1:output-inventory>
};
declare variable $input-warehouse-inventory as element(ns0:input-warehouse-inventory) external;
Regrouping($input-warehouse-inventory)
変更内容はデザイン ビューには表示されません。以下の手順に従って、XQuery をテストします。
キー フィールドによるグループ XQuery 構文のテスト
groupby.xq ファイルをソース ビューで開いた状態で、[テスト] タブをクリックします。
[ソース データ] タブで [インポート] をクリックします。
サンプル プロジェクトに含まれる Regrouping.xml ファイルをインポートします (Samples/XML/Regrouping.xml
)。
[結果データ] ペインで [XQuery のテスト] をクリックします。生成されたデータが [結果データ] タブに表示されます。コード リスト 3-3 で示されたものに類似したキー フィールドでグループ化されたライン アイテムが表示されます (最初のキーが input-warehouse-id で、2 つ目のキーが input-location-desc)。
XQuery ファイルのテスト
[デザイン] タブで作成した XQuery トランスフォーメーションは、[テスト] タブを使用してテストできます。XQuery トランスフォーメーションをテストすると、予期される XML 出力または非 XML 出力が適切に生成されたかどうかを確認できます。自動生成された XML ファイル、またはカスタムの XML および非 XML テスト ファイルを使用できます。XQuery のテストの詳細については、「マップ トランスフォーメーションのテスト」を参照してください。
この節では、以下のトピックを取り上げます。
自動生成された XML ファイルを使用したテスト
XQuery Mapper では、テストに使用できる XML ファイルが自動的に生成されます。非 XML のテスト ファイルは、自動的に生成されません。詳細については、「カスタム MFL (非 XML) ファイルを使用したテスト」を参照してください。
テスト XML ファイルは、[ソース変数] ドロップダウン メニューから選択できます。テスト XML ファイルは、ソース スキーマに基づきます。このファイルは自動的に保存されないため、[エクスポート] アイコンを使用して手動で保存する必要があります。
[ソース変数] ドロップダウン メニューで、ソース テスト XML ファイルを選択します。
必要に応じて、[ソース データ] ペインで以下のオプションを使用できます。
[データの生成] : 自動生成された XML ファイルを更新または再生成する場合に選択します。
[インポート] : カスタム テスト XML ファイルをインポートする場合 (自動生成された XML ファイルを使用しない場合) に選択します。詳細については、「カスタム XML ファイルを使用したテスト」を参照してください。
[エクスポート] : 自動生成されたテスト XML データを保存する場合に選択します。
[自動検証] : ソース スキーマに対してソース テスト XML ファイルを検証する場合に選択します。自動検証オプションは永続的に有効にすることもできますが、状況に応じてオン/オフを切り替えることもできます。
注意 : [ソース] タブをクリックして、テスト XML を手動で編集することもできます。
[結果データ] ペインで [XQuery のテスト] をクリックします。
ソース データに対して XQuery が実行され、結果が生成されます。結果は、[結果データ] ペインに表示されます。エラーが発生した場合は、問題を示すエラー メッセージが表示されます。
必要に応じて、[結果データ] ペインで以下のオプションを使用できます。
[エクスポート] : テスト XML データを保存する場合に選択します。
[検証] : ターゲット スキーマに基づいてテスト XML を検証します。必要な要素または属性が見つからない場合は、エラーが表示されます。
カスタム XML ファイルを使用したテスト
自動生成された XML ファイルがビジネス要件を満たさない場合は、カスタム XML ファイルをインポートできます。
[ソース データ] ペインで [インポート] を選択します。
[ファイルのインポート] ダイアログ ボックスが開きます。このボックスを使用して、テストに使用する XML ファイルを検索します。適切なファイルを選択すると、そのファイルの内容が [ソース データ] ペインに表示されます。
テスト データを切り取って [ソース データ] ペインに貼り付けることもできます。
テスト ファイルのインポート後は、以下のオプションを使用できます。
[データの生成] : XML ファイルを更新または再生成する場合に選択します。
[エクスポート] : 保存する場合に選択します。
[自動検証] : ソース スキーマに対してソース テスト XML ファイルを検証する場合に選択します。自動検証オプションは永続的に有効にすることもできますが、状況に応じてオン/オフを切り替えることもできます。
[結果データ] ペインで [XQuery のテスト] を選択します。
ソース XML が XQuery に対してテストされ、その結果が表示されます。
必要に応じて、[結果データ] ペインで以下のオプションを使用できます。
[エクスポート] : インポートされたテスト XML データを再保存する場合に選択します。
[検証] : ターゲット スキーマに基づいてテスト XML を検証します。必要な要素または属性が見つからない場合は、エラーが表示されます。
カスタム MFL (非 XML) ファイルを使用したテスト
XQuery Mapper では、非 XML ファイルは自動的に生成されません。したがって、非 XML スキーマをテストするときは、カスタム非 XML テスト データをインポートする必要があります。
[ソース データ] ペインで [インポート] を選択します。
[ファイルのインポート] ダイアログ ボックスが表示されます。このボックスを使用して、テストに使用する非 XML ファイルを検索します。
注意 : [ファイルの種類] ドロップダウン リストは *.* に変更する必要があります。
テスト ファイルのインポート後は、以下のオプションを使用できます。
[インポート] : 他の MFL テスト ファイルをインポートする場合に選択します。
[エクスポート] : MFL テスト データを保存する場合に選択します。
[結果データ] ペインで [XQuery のテスト] を選択します。
ソース MFL がターゲット MFL と照合してテストされ、その結果が表示されます。
必要に応じて、[結果データ] ペインで以下のオプションを使用できます。
[エクスポート] : 結果データを保存する場合に選択します。