ナビゲーションをスキップ

XQuery Mapper を使用したデータの変換

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

例 : XQuery を使用したデータの操作と制約

この節では、BEA XQuery Mapper インストールに含まれるサンプル プロジェクトを使用したサンプル シナリオを示します。サンプル プロジェクトを開く方法については、「XQuery Mapper サンプル プロジェクト」を参照してください。

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

 


異なるスキーマのデータの結合

XQuery Mapper を使用して、2 つの異なるスキーマのコンテンツを結合できます。次の図 3-1 を参照してください。

この例では、顧客データ (CustInfo.xsd スキーマで記述されたデータ) が反復する要素 (PO.xsd スキーマで記述された line-items) と結合されて、POCustInfo.xsd スキーマに対して有効な単一の XML ドキュメントになります。

図 3-1 異なるスキーマのデータの結合

異なるスキーマのデータの結合


 

異なるスキーマのデータを結合するには

  1. Eclipse を起動してサンプル プロジェクトに移動します。
  2. XQueryTransformations フォルダを右クリックします。
  3. [NewXQuery トランスフォーメーション] を選択します。
  4. 親フォルダの名前を確認します。
  5. この例では、親フォルダは Samples/XQueryTransformations です。

  6. [ファイル名] パスに、combineData と入力します。
  7. 以下のソース ファイルを選択します。
  8. CustInfo.xsd\customer
    PO.xsd\purchase-order
  9. ターゲットの以下のスキーマと要素を選択します。
  10. POCustInfo.xsd\purchase-order

    ソース データとターゲット データを選択すると、combineData.xq ファイルが作成されます。

  11. 以下の表に示されたソース要素を選択し、[対象] ペインにドラッグします。
  12. ソース

    リンクの種類

    対象

    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.xsdAvailableQuote.xsd、および taxrate.xsd を結合して、単一の Quote.xsd ファイルを作成します。

この例では、以下の手順を示します。

手順 1. 新しい XQuery ファイルの作成

この節では、AvailQuote.xsdPriceQuote.xsd、および taxrate.xsd ファイルを使用して XQuery トランスフォーメーションを作成します。作成後は、複数の priceQuote ソース要素と availRequest ソース要素を、対応するターゲット要素に対してマップします。

  1. Eclipse を起動してサンプル プロジェクトに移動します。
  2. XQueryTransformations フォルダを右クリックします。
  3. [NewXQuery トランスフォーメーション] を選択します。
  4. 親フォルダが Samples/XQueryTransformations であることを確認します。
  5. [ファイル名] パスに Join と入力します。
  6. 以下のソース スキーマ ファイルと要素を選択します。
  7. PriceQuote.xsd\priceQuote
    PriceQuote.xsd\taxRate
    AvailQuote.xsd\availRequest 
  8. ターゲットの以下のスキーマと要素を選択します。
  9. Quote.xsd\quote

    ソース データとターゲット データを選択すると、Samples/XQueryTransformations フォルダに Join.xq ファイルが作成されます。

  10. 以下の表に示されたソース要素をクリックし、示されたターゲット要素にドラッグ アンド ドロップして要素間にリンクを作成します。

  11.  

    ソース要素

    リンクの種類

    ターゲット要素

    priceQuote\customerName

    再帰的な要素のマッピング


     

    quote\name

    priceQuote\shipAddress

    再帰的な要素のマッピング


     

    quote\address

    priceQuote\priceRequests\priceRequest

    再帰的な要素のマッピング


     

    quote\quoteResponse

    availRequest

    再帰的な要素のマッピング


     

    quote\quoteResponse


     
  12. 以下の図に示すように、[デザイン] タブに作成したマップが表示されます。
  13. 図 3-3 結合の例

    結合の例


     
  14. 変更内容を保存します。

手順 2. 条件的制約の追加

ソース ドキュメント priceQuoteavailRequest には、共通の要素 widgetId があります。このサブセクションでは、availRequest 要素の widgetIdpriceRequest 要素の widgetId と一致する場合に、結合された反復要素 quoteResponse を返す条件的制約を追加します。

制約を追加するには

  1. デザイン ビューで Join.xq を開きます。
  2. [ソース] ペインで、以下の要素をクリックします。
  3. priceRequests/priceRequest/widgetId
  4. [ソース] ペインで、priceRequests/priceRequest/widgetId を以下の要素にドラッグ アンド ドロップします。
  5. availRequest/widgetId 

    以下の図のように 2 つの widgetId ノード間に線が示されます (要素を結合したことを示します)。

    図 3-4 結合に条件的制約を追加する

    結合に条件的制約を追加する


     
  6. 変更内容を保存します。
  7. [ソース] タブをクリックして変更内容を確認します。
  8. widgetId ノード間のリンクにより、以下のものが生成されます。

quoteResponse 要素は空です。「手順 3. 空の要素にデータを入力するリンクの追加」で示された手順に従って、quoteResponse 要素にデータを入力するデータ リンクを追加します。

手順 3. 空の要素にデータを入力するリンクの追加

この節の手順に従って、quoteResponse 要素にデータを入力するデータ リンクを追加します。

quoteResponse 要素にデータを入力するには

  1. デザイン ビューで Join.xq を開きます。
  2. 以下の表に示されたソース要素をクリックし、示されたターゲット要素にドラッグ アンド ドロップして要素間にリンクを作成します。
  3. ソース要素

    リンクの種類

    ターゲット要素

    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 要素へのデータの入力

    quoteResponse 要素へのデータの入力


     

手順 4. 総費用額の計算

この手順では、発注書の総費用額を計算する関数を XQuery ソースに追加します。

総費用額を計算するには

  1. ソース ビューで Join.xq ファイルを開きます。
  2. 以下の関数宣言を XQuery に追加します。

コード リスト 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
};
  1. デザイン ビューで Join.xq ファイルを開きます。
  2. 注意 : Join.xq ファイルには、calculateTotalPrice と Join の 2 つの関数宣言が含まれています。XQ ファイルに複数の関数が含まれる場合は、同じ名前の関数がデザイン ビューに表示されます (この場合、Join 関数がデザイン ビューに表示されます)。

  3. [対象] ペインで、totalCost ノードを選択します。次の手順に向けて、このノードを選択したままにしておきます。
  4. [対象の式] タブに移動し、[一般] を選択します。
  5. totalCost を計算するために、次の一般式を追加します。
  6. xf:calculateTotalPrice($taxRate,$availRequest/ns1:requestedQuanity,$priceRequest/ns0:price)


     

    図 3-6 totalCost 要素の一般式

    totalCost 要素の一般式


     
  7. [適用] をクリックします。
  8. 式が XQuery の totalCost 要素に追加されます。

  9. 変更内容を保存します。
  10. デザイン ビューに totalCost の新しい計算が反映されます。

    図 3-7 デザイン ビューでの totalCost の計算

    デザイン ビューでの totalCost の計算


     

手順 5. 複数の条件を持つ制約の追加

[制約] タブの [Where 句式] ペインで制約を作成すると、XQuery の for ループに、実行時に返されるターゲットの反復要素を制限する where 句を追加できます。

実行時には、複合条件を満たす反復要素についてのみ for ループが反復処理されます。この節では、for ループの where 句に別の条件を追加して (複合条件にして)、for ループによって返される要素をさらに制限します。

複数の条件を使用して制約を追加するには

  1. Join.xq ファイルを開きます。
  2. 以下の要素間のリンクを選択します。
  3. availRequest

    および

    quote\quoteResponse

    where 句を構成する 1 つの条件が [制約] タブの [Where 句式] ペインに表示されます。

    data($priceRequest/ns0:widgetId) = data($availRequest/ns1:widgetId)
  4. availRequest/requestedQuanity ノードを選択して、[Where 句式] ペインの [左辺の式] セクションにドラッグ アンド ドロップして、以下の式を形成します。
  5. data($availRequest/ns1:requestedQuanity)
  6. 演算子 < を選択します。
  7. [Where 句式] ペインの [右辺の式] セクションにあるテキストを削除します。
  8. [Where 句式] ペインの [右辺の式] セクションに、"50" と入力します。
  9. 注意 : 50 は引用符で囲む必要があります。つまり、50 ではなく "50" と入力します。

  10. [結合の種類] フィールドから [AND] オプションを選択します。
  11. [結合の種類] によって、where 句を構成する条件が実行時に評価される方法が決まります。

  12. [追加] をクリックします。for ループの where 句に、2 つ目の条件が追加されます。
  13. 作業内容を保存します。これで、以下の where 句が作成されました。
  14. where (data($availRequest/ns1:widgetId) = data($priceRequest/ns0:widgetId)
    and data($availRequest/ns1:requestedQuanity) < "50")

XQuery をテストするには

XQuery トランスフォーメーションのテストについては、「XQuery ファイルのテスト」を参照してください。

この例に特化した以下の手順を実行して、「手順 5. 複数の条件を持つ制約の追加」でコンフィグレーションした両方の制約が満たされる場合にクエリが実行されることをテストする準備を整えます。

  1. テスト ビューの [ソース データ] ペインで、[ソース変数] フィールドの priceQuote を選択して [データの生成] をクリックします。
  2. テスト XML の widgetId 要素の値を書き留めます。
  3. <ns0:widgetId>value</ns0:widgetId>
  4. [ソース データ] ペインで、[ソース変数] フィールドの availRequest を選択して [データの生成] をクリックします。
  5. テスト XML の widgetId 要素の値に注目します。この値を編集して、priceQuote のテスト XML ファイル (手順 2) に表示された値と同じ値を入力します。
  6. <ns0:widgetId>value</ns0:widgetId>
  7. requestedQuanity 要素を特定し、50 未満の値に編集します。次に例を示します。
  8. <ns0:requestedQuanity>25</ns0:requestedQuanity>
  9. [結果データ] ペインで [XQuery のテスト] をクリックし、[結果データ] ペインに表示された XQuery の結果を確認します。

 


[制約] タブの [和集合] オプションの使用

この例では、[制約] タブで [和集合] オプションを使用して、同じ型のデータを大きなデータ セットにマップする XQuery を作成します。

同じ型のデータ セットを結合するには

  1. Eclipse を起動してサンプル プロジェクトに移動します。
  2. XQueryTransformations フォルダを右クリックします。
  3. [NewXQuery トランスフォーメーション] を選択します。
  4. 親フォルダを確認します。
  5. この例では、親フォルダは Samples/XQueryTransformations です。

  6. [ファイル名] パスに union と入力します。
  7. 以下のソース ファイルを選択します (PO.xsd\purchase-order を 2 回選択します)。
  8. PO.xsd\purchase-order
    PO.xsd\purchase-order
  9. ターゲットの以下のスキーマと要素を選択します。
  10. Order.xsd\order

    ソース データとターゲット データを選択すると、union.xq ファイルが作成されます。

  11. 以下の表に示されたソース要素を選択し、[対象] ペインにドラッグします。

  12.  

    ソース要素

    リンクの種類

    ターゲット要素

    purchase-order\line-items\line-item

    再帰的な要素のマッピング


     

    order\items\item

    purchase-order1\line-items\line-item

    再帰的な要素のマッピング


     

    order\items\item


     

    以下の図は、リンクの [デザイン] タブを示しています。

    図 3-8 和集合の作成

    和集合の作成


     
  13. 作業を続行する前に、$purchase-order/line-items/line-item ([ソース] ペインの反復する要素) と order/items/item ([対象] ペインの反復する要素) の間のリンクが選択されていることを確認してください。
  14. [制約の種類] ペインで、[和集合] を選択します。
  15. [ソース] ペインの part-no 要素と [対象] ペインの part-number 要素の間にリンクを作成します。
  16. 注意 : [ソース] ペインと [対象] ペインで要素の名前が同じである場合は、この手順の説明に従って手動でリンクを作成する代わりに、[自動マップ] 右クリック メニュー オプションを使用できます。詳細については、「リンクのメニュー オプション」を参照してください。

    2 つの構造的なリンクには和集合の制約が適用されているため、図 3-9 で示されているように、下位要素の 2 番目のセット間に暗黙的なデータ リンクが生成されます。灰色の実線は、[制約] タブの [和集合] を選択して作成された暗黙的なリンクを表します。

    図 3-9 暗黙的なリンクの作成

    暗黙的なリンクの作成


     
  17. 作業内容を保存します。

XQuery トランスフォーメーションのテストの詳細については、「XQuery ファイルのテスト」を参照してください。

 


反復ソースと非反復ターゲットの間のトランスフォーメーションの作成

この例では、反復する要素に、反復しない単一の要素をマップする方法を示します。この例では、以下の図に示されているように、反復する XML 要素 (ソース スキーマによって定義) の値を取得し、この要素をターゲット XML ドキュメントの単一の要素 (ターゲット スキーマで定義) にマップするトランスフォーメーションを作成します。

図 3-10 反復ソース グループから非反復ターゲット要素へ

反復ソース グループから非反復ターゲット要素へ


 

反復ソース グループと非反復ターゲット要素の間のマップを作成するには

  1. Eclipse を起動してサンプル プロジェクトに移動します。
  2. XQueryTransformations フォルダを右クリックします。
  3. [NewXQuery トランスフォーメーション] を選択します。
  4. 親フォルダを確認します。
  5. この例では、親フォルダは Samples/XQueryTransformations です。

  6. [ファイル名] フィールドに repeatToNonRepeat と入力します。
  7. 以下のソース ファイルを選択します。
  8. Dates.xsd\dates 
  9. ターゲットの以下のスキーマと要素を選択します。
  10. PODate.xsd\PODate
  11. [ソース] ペインから反復する要素 (dates/date) を選択し、[対象] ペインにある最初の単一の要素 (PODate/billing-date) にドラッグします。
  12. このリンクを選択したままにして、次の手順に進みます。

  13. [制約] タブを選択します。
  14. [ソース] ペインから dates/date/type ノードを選択して、[制約] タブにある [Where 句式] の [左辺の式] ペインにドロップします。
  15. 演算子 = を選択します。
  16. [制約] タブにある [Where 句式] の [右辺の式] ペインで、"BILLING" と入力します。
  17. 以下の図に示されているように、date の文字列を入力するときは引用符を使用してください。

    図 3-11 文字列関数の入力時に引用符を使用

    文字列関数の入力時に引用符を使用


     
  18. [追加] をクリックします。
  19. 前の手順で作成した制約により、XML ドキュメントの dates/date/type 要素の値を値 "BILLING" と比較するよう指定されます。

    次の手順では、dates/date/type 要素の値が "BILLING" と一致する場合に指定されたデータを返す XQuery コードを for ループに追加します。

  20. [ソース] ペインから dates/date/value 要素を選択し、[対象] ペインにある PODate/billing-date 要素にドラッグします。
  21. データ リンクが作成されます。

    このデータ リンクは、実行時に、制約 data($date/ns0:type) = "BILLING"true である場合に、billing-date の値として datesDoc/date/value の値を返します。

  22. [ソース] ペインから反復する要素 (dates/date) を選択し、[対象] ペインにある 2 番目の単一の要素 (PODate/delivery-date) にドラッグします。
  23. 2 つの要素をつなぐ破線が表示されます。

    このリンクを選択したままにして、次の手順に進みます。

  24. [ソース] ペインから dates/date/type ノードを選択して、[制約] タブにある [Where 句式] の [左辺の式] ペインにドロップします。
  25. 演算子 = を選択します。
  26. [制約] タブにある [Where 句式] の [右辺の式] ペインで、"DELIVERY" と入力します。次の手順では、実行時に制約が true である場合にデータを返す XQuery コードを追加します。
  27. 注意 : 文字列値を入力するときは引用符を使用してください。

  28. [追加] をクリックします。
  29. 実行時に、この手順で作成した制約によって、dates/date/type が文字列 "DELIVERY" に等しいかどうかがテストされます。

  30. [ソース] ペインから dates/date/value 要素を選択し、[対象] ペインにある PODate/delivery-date 要素にドラッグします。
  31. データ リンクが作成されます。

    このデータ リンクは、実行時に、制約 data($date/ns0:type) = "DELIVERY"true である場合に、delivery-date として dates/date/value の値を返します。

  32. 作業内容を保存します。

XQuery ファイルのテストの詳細については、「XQuery ファイルのテスト」を参照してください。

 


非反復ソースと反復ターゲットの間のトランスフォーメーションの作成

この例では、反復する要素に反復しない要素をマップする方法を示します。また、実行時に、単一のソース要素を反復するターゲット要素にマップするトランスフォーメーションを作成します。次の図を参照してください。

図 3-12 非反復ソース要素から反復ターゲット グループへ

非反復ソース要素から反復ターゲット グループへ


 

非反復ソース要素と反復ターゲット グループを作成するには

  1. Eclipse を起動してサンプル プロジェクトに移動します。
  2. XQueryTransformations フォルダを右クリックします。
  3. [NewXQuery トランスフォーメーション] を選択します。
  4. 親フォルダを確認します。
  5. この例では、親フォルダは Samples/XQueryTransformations です。

  6. [ファイル名] パスに nonRepeatToRepeat と入力します。
  7. 以下のソース ファイルを選択します。
  8. PODate.xsd\PODate
  9. ターゲットの以下のスキーマと要素を選択します。
  10. Dates.xsd\dates

    ソース データとターゲット データを選択すると、nonRepeatToRepeat.xq ファイルが作成されます。

  11. 以下の表に示されているソース要素を選択します。選択したソース要素を [ソース] ペインから [対象] ペインにドラッグします。
  12. [ソース] ペイン

    リンクの種類

    [対象] ペイン

    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 コードが追加されます。

  13. [ソース] ペインから pODate/billing-date 要素を選択し、[対象] ペインにある dates/date/value 要素にドラッグします。
  14. 次の図のように、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 番目のデータ リンクが自動的に作成されます。

  15. [ソース] ペインから pODate/billing-date 要素を選択し、[対象] ペインにある dates/date/type 要素にドラッグします。
  16. 2 つのデータ リンクが作成されます。

    pODate/billing-date から dates/date/type へのリンクを選択したままにして、次の手順に進みます。

  17. [対象の式] タブを選択します。
  18. [If Then Else] オプションを選択します。
  19. XQuery の if-then-else 構文がリンクに追加されます。たとえば、リンクに対する次のような XQuery ソース コード セグメントが、

    data($PODate)

    以下の XQuery ソース コード セグメントで置き換えられます。

    if (xf:boolean("true")) then
    data($PODate)
    else
    ()
  20. [If 条件] をクリックします。
  21. [If 条件] ペインが表示されます。

  22. この手順では、if-then-else の if セクションに条件を追加します。
    1. [式の関数] ビューを選択します。
    2. [XQuery 関数ノード関数] を展開します。
    3. local-name 関数を選択して、[If 条件] ペインの [左辺の式] ペインにドラッグします。$node-var 引数は選択したままにしておきます。
    4. [式の変数] ビューを選択します。
    5. [ソース] から、構造リンクpODate 変数を、[If 条件] ペインにある local-name 関数の $node-var 引数にドラッグ アンド ドロップします。
    6. 演算子 = を選択します。
    7. [If 条件] ペインの [右辺の式] セクションで、"BILLING DATE" と入力して [追加] をクリックします。
    8. 注意 : 文字列値を入力するときは引用符を使用してください。

      以下の図で示されているように、if-then-else の if セクションに条件が追加されます。

      図 3-14 請求日の If 条件

      請求日の If 条件


       
  23. [Then 式] をクリックします。
  24. [Then 式] セクションで、既存のテキストを文字列 "BILLING" で置き換えます。
  25. 次のテキストを、

    data($PODate)

    次の文字列で置き換えます。

    "BILLING"

    注意 : 文字列 "BILLING" の引用符は必ず入力してください。

  26. [適用] をクリックします。
  27. [Else 式] をクリックします。
  28. [Else 式] セクションで、文字列 "DELIVERY" を入力します。
  29. 注意 : 文字列 "DELIVERY" の引用符は必ず入力してください。

  30. [適用] をクリックします。
  31. [式の構造] ペインで、[If Then Else] をクリックします。
  32. 以下の図に示されているように、XQuery コードが [式の構造] ペインに表示されます。

    図 3-15 If-Then-Else サンプルの結果の表示

    If-Then-Else サンプルの結果の表示


     
  33. 作業内容を保存します。

XQuery ファイルのテストの詳細については、「XQuery ファイルのテスト」を参照してください。

 


ネストされた If-Then-Else 式の作成

この例では、ウィジェット ID と州税率に基づいて価格を計算する XQuery トランスフォーメーションを作成します。XQuery Mapper を使用して、次の if-then-else ロジックを表す式の構造を作成します。

この例では、以下の手順を示します。

手順 1. 新しい XQuery トランスフォーメーションの作成

この手順では、PurchaseAgree.xsdSupplier.xsd を使用して新しい XQuery トランスフォーメーションを作成します。

新しい XQuery トランスフォーメーションを作成するには

  1. Eclipse を起動してサンプル プロジェクトに移動します。
  2. XQueryTransformations フォルダを右クリックします。
  3. [NewXQuery トランスフォーメーション] を選択します。
  4. 親フォルダを確認します。
  5. この例では、親フォルダは Samples/XQueryTransformations です。

  6. [ファイル名] パスに ifthenelse と入力します。
  7. 以下のソース ファイルを選択します。
  8. Supplier.xsd\Supplier
  9. ターゲットの以下のスキーマと要素を選択します。
  10. PurchaseAgree.xsd\PurchaseOrder

    ソース データとターゲット データを選択すると、ifthenelse.xq ファイルが作成されます。

  11. 以下の要素を [ソース] ペインから [対象] ペインにドラッグします。
  12. [ソース] ペイン

    リンクの種類

    [対象] ペイン

    supplier/products/product

    再帰的な要素のマッピング


     

    PurchaseOrder/products/product

    supplier/products/product/price

    再帰的な要素のマッピング


     

    PurchaseOrder/products/product/price


     

手順 2. 最初の If 条件の作成

この手順では、ウィジェット ID が 0 ~ 200 の場合に価格を $10.00 に設定する If 式を作成します。

最初の If 式を作成するには

  1. [対象の式] タブをクリックします。
  2. 式の種類として [If Then Else] を選択します。
  3. [式の構造] ペインで、[If 条件] が選択されていることを確認します。

  4. [ソース] ペインから、widgetId 要素を [左辺の式] ペインにドラッグ アンド ドロップします。
  5. 演算子 > を選択します。
  6. [右辺の式] ペインで、"0" と入力します。
  7. 注意 : 数値を入力するときは引用符を使用してください。

  8. [追加] をクリックします。
  9. 演算子 <= を選択します。
  10. [右辺の式] セクションで、"200" と入力します。
  11. 注意 : 数値を入力するときは引用符を使用してください。

  12. [追加] をクリックします。
  13. [Then 式] をクリックします。
  14. [編集 : Then 式] ペインで、"$10.00" と入力します。
  15. 注意 : [編集 : Then 式] ペインの既存のデータは削除しておきます。"$10.00" と入力するときは引用符を使用してください。

  16. [適用] をクリックします。
  17. [式の構造] ペインで、[If Then Else] を選択します。
  18. if then ステートメントが以下のように表示されていることを確認してください。

    図 3-16 If Then 式の構造

    If Then 式の構造


     

手順 3. 最初のネストされた If-Then-Else 条件の作成

この手順では、ウィジェット ID が 201 ~ 400 の場合に価格を $20.00 に設定する、ネストされた If 式を作成します。このためには、「手順 2. 最初の If 条件の作成」で作成した Else 式の内部に、ネストされた If-Then-Else を挿入します。

最初のネストされた If-Then-Else 条件を作成するには

  1. [式の構造] ペインで、[Else 式] を選択します。
  2. 右クリックして、[ネストされた If-Then-Else を挿入] を選択します。
  3. ネストされた If-Then-Else 式で、[If 条件] を選択します。
  4. [ソース] ペインから、widgetId 要素を [左辺の式] ペインにドラッグ アンド ドロップします。
  5. 演算子 > を選択します。
  6. [右辺の式] セクションで、"201" と入力します。
  7. 注意 : 数値を入力するときは引用符を使用してください。

  8. [追加] をクリックします。
  9. 演算子 <= を選択します。
  10. [右辺の式] セクションで、"400" と入力します。
  11. 注意 : 数値を入力するときは引用符を使用してください。

  12. [追加] をクリックします。
  13. [Then 式] をクリックします。
  14. [編集 : Then 式] ペインで、"$20.00" と入力します。
  15. 注意 : 数値を入力するときは引用符を使用してください。

  16. [適用] をクリックします。
  17. [式の構造] ペインで、[If Then Else] を選択します。
  18. ステートメントが以下のように表示されていることを確認してください。

    図 3-17 ネストされた If Then Else 式の構造

    ネストされた 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 条件を作成するには

  1. [式の構造] ペインで、[Else 式] を選択します。
  2. 注意 : 手順 3. 最初のネストされた If-Then-Else 条件の作成」で作成した Else 式を必ず選択してください。

  3. 右クリックして、[ネストされた If-Then-Else を挿入] を選択します。
  4. [ソース] ペインから、widgetId 要素を [左辺の式] ペインにドラッグ アンド ドロップします。
  5. ネストされた If-Then-Else 式で、[If 条件] を選択します。
  6. 演算子 > を選択します。
  7. [右辺の式] セクションで、"401" と入力します。
  8. 注意 : 数値を入力するときは引用符を使用してください。

  9. [追加] をクリックします。
  10. 演算子 <= を選択します。
  11. [右辺の式] セクションで、"600" と入力します。
  12. 注意 : 数値を入力するときは引用符を使用してください。

  13. [追加] をクリックします。
  14. [Then 式] をクリックします。
  15. [編集 : Then 式] ペインで、"$30.00" と入力します。
  16. 注意 : 数値を入力するときは引用符を使用してください。

  17. [適用] をクリックします。
  18. [式の構造] ペインで、[If Then Else] を選択します。
  19. ステートメントが以下の図のように表示されていることを確認してください。

    図 3-18 2 つ目のネストされた If-Then-Else 式

    2 つ目のネストされた If-Then-Else 式


     

XQuery ファイルのテストの詳細については、「XQuery ファイルのテスト」を参照してください。


 

 


再帰的なスキーマの使用

この例では、再帰的な要素を含むスキーマを使用してマップを作成する方法を示します。再帰的な要素には、次の図で示されたような親と同じ型の子要素が含まれています。この例では、product 要素の型が productType であり、かつ productType には型が同じ productType である child-product 要素が含まれているため (productType は自身を参照)、product 要素は再帰的です。

図 3-19 再帰的なスキーマのサンプル

再帰的なスキーマのサンプル


 

再帰的なスキーマを使用してトランスフォーメーションを作成するには

  1. Eclipse を起動してサンプル プロジェクトに移動します。
  2. XQueryTransformations フォルダを右クリックします。
  3. [NewXQuery トランスフォーメーション] を選択します。
  4. 親フォルダを確認します。
  5. この例では、親フォルダは Samples/XQueryTransformations です。

  6. [ファイル名] パスに recursive と入力します。
  7. 以下のソース ファイルを選択します。
  8. SupplierAcme.xsd\supplier-acme
  9. ターゲットの以下のスキーマと要素を選択します。
  10. Product.xsd\product

    ソース データとターゲット データを選択すると、recursive.xq ファイルが作成されます。

  11. 以下の表に示されているソース要素を選択します。選択したソース要素を [ソース] ペインから [対象] ペインにドラッグします。
  12. [ソース] ペイン

    リンクの種類

    [対象] ペイン

    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 再帰的な要素のマッピング

再帰的な要素のマッピング


 
  1. 作業内容を保存します。

XQuery ファイルのテストの詳細については、「XQuery ファイルのテスト」を参照してください。

 


キー フィールドによるグループ XQuery 構文の作成

キー フィールドによるグループ機能を使用して、1 つまたは複数のキー値に基づいてデータをグループ化できます。ただし、このグループ化機能は XQuery Mapper ではグラフィカルにサポートされておらず、Mapper のデザイン ビューには XQuery の表現はありません。したがって、XQuery Mapper のソース ビューで Group By XQuery 構文を記述する必要があります。

この例では、input-warehouse-id 要素と input-location-desc 要素をキー フィールドとして使用して、出力ドキュメントのデータをグループ化します。

コード リスト 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 構文を作成するには

  1. Eclipse を起動してサンプル プロジェクトに移動します。
  2. XQueryTransformations フォルダを右クリックします。
  3. [NewXQuery トランスフォーメーション] を選択します。
  4. 親フォルダが Samples/XQueryTransformations であることを確認します。
  5. [ファイル名] パスに groupby と入力します。
  6. 以下のソース ファイルと要素を選択します。
  7. regroupKeyFldIn.xsd\input-warehouse-inventory
  8. ターゲットの以下のスキーマと要素を選択します。
  9. regroupKeyFldOut.xsd\output-inventory

    ソース データとターゲット データを選択すると、groupby.xq ファイルが作成されます。

    注意 : BEA WebLogic Integration 8.1 リリースの XQuery Mapper では、この時点で input-warehouse-idoutput-warehouse-inventory との間のリンクを選択し、[制約の種類キー フィールドによるグループ] をグラフィカルに選択できましたが、このリリースでは、デザイン ビュー上の表現は使用できません。Group by タイプはサポートされていますが、以下の手順に示すように、該当する XQuery を記述する必要があります。

  10. [ソース] タブをクリックします。
  11. 既存の 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)
  1. 作業内容を保存します。

変更内容はデザイン ビューには表示されません。以下の手順に従って、XQuery をテストします。

キー フィールドによるグループ XQuery 構文のテスト

  1. groupby.xq ファイルをソース ビューで開いた状態で、[テスト] タブをクリックします。
  2. [ソース データ] タブで [インポート] をクリックします。
  3. サンプル プロジェクトに含まれる 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) ファイルを使用したテスト」を参照してください。

  1. テストする XQuery ファイルを開きます。
  2. [テスト] タブをクリックします。
  3. テスト XML ファイルは、[ソース変数] ドロップダウン メニューから選択できます。テスト XML ファイルは、ソース スキーマに基づきます。このファイルは自動的に保存されないため、[エクスポート] アイコンを使用して手動で保存する必要があります。

  4. [ソース変数] ドロップダウン メニューで、ソース テスト XML ファイルを選択します。
  5. 必要に応じて、[ソース データ] ペインで以下のオプションを使用できます。
  6. [結果データ] ペインで [XQuery のテスト] をクリックします。
  7. ソース データに対して XQuery が実行され、結果が生成されます。結果は、[結果データ] ペインに表示されます。エラーが発生した場合は、問題を示すエラー メッセージが表示されます。

  8. 必要に応じて、[結果データ] ペインで以下のオプションを使用できます。

カスタム XML ファイルを使用したテスト

自動生成された XML ファイルがビジネス要件を満たさない場合は、カスタム XML ファイルをインポートできます。

  1. テストする XQuery ファイルを開きます。
  2. [テスト] タブをクリックします。
  3. [ソース データ] ペインで [インポート] を選択します。
  4. [ファイルのインポート] ダイアログ ボックスが開きます。このボックスを使用して、テストに使用する XML ファイルを検索します。適切なファイルを選択すると、そのファイルの内容が [ソース データ] ペインに表示されます。

    テスト データを切り取って [ソース データ] ペインに貼り付けることもできます。

  5. テスト ファイルのインポート後は、以下のオプションを使用できます。
  6. [結果データ] ペインで [XQuery のテスト] を選択します。
  7. ソース XML が XQuery に対してテストされ、その結果が表示されます。

  8. 必要に応じて、[結果データ] ペインで以下のオプションを使用できます。

カスタム MFL (非 XML) ファイルを使用したテスト

XQuery Mapper では、非 XML ファイルは自動的に生成されません。したがって、非 XML スキーマをテストするときは、カスタム非 XML テスト データをインポートする必要があります。

  1. テストする XQuery ファイルを開きます。
  2. [テスト] タブをクリックします。
  3. [ソース データ] ペインで [インポート] を選択します。
  4. [ファイルのインポート] ダイアログ ボックスが表示されます。このボックスを使用して、テストに使用する非 XML ファイルを検索します。

    注意 : [ファイルの種類] ドロップダウン リストは *.* に変更する必要があります。

  5. テスト ファイルのインポート後は、以下のオプションを使用できます。
  6. [結果データ] ペインで [XQuery のテスト] を選択します。
  7. ソース MFL がターゲット MFL と照合してテストされ、その結果が表示されます。

  8. 必要に応じて、[結果データ] ペインで以下のオプションを使用できます。
  9. [エクスポート] : 結果データを保存する場合に選択します。

 

ページの先頭 前 次