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. XQuery Transformation フォルダを右クリックします。
  3. [新規Arrow symbolXQuery トランスフォーメーション] を選択します。
  4. 親フォルダの名前を確認します。
  5. この例では、親フォルダは Sample/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.xsd、PriceQuote.xsd および taxrate.xsd ファイルを使用して XQuery トランスフォーメーションを作成します。作成後は、複数の priceQuote ソース要素と availRequest ソース要素を、対応するターゲット要素に対してマッピングします。

  1. Eclipse を起動してサンプル プロジェクトに移動します。
  2. XQuery Transformation フォルダを右クリックします。
  3. [新規Arrow symbolXQuery トランスフォーメーション] を選択します。
  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 ノード間のリンクにより、以下のものが生成されます。

    • for ループ内の where 句。
    • この where 句により、for ループの出力が制約または制限される。
    • where 句を使用して、where 句の式が true の場合に for ループによって戻り値の内容が出力されるよう指定できる。
    • この例では、availRequest 要素の widgetId が priceRequest 要素の widgetId と一致する場合に、</quoteResponse> という XML データが返される。

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. コード リスト 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
    };
  4. デザイン ビューで Join.xq ファイルを開きます。
  5. 注意 : Join.xq ファイルには、calculateTotalPrice と Join の 2 つの関数宣言が含まれています。XQ ファイルに複数の関数が含まれる場合は、同じ名前の関数がデザイン ビューに表示されます (この場合、Join 関数がデザイン ビューに表示されます)。
  6. [対象] ペインで、totalCost ノードを選択します。次の手順に向けて、このノードを選択したままにしておきます。
  7. [対象の式] タブに移動し、[一般] を選択します。
  8. totalCost を計算するために、次の一般式を追加します。
  9. xf:calculateTotalPrice($taxRate,$availRequest/ns1:requestedQuanity,$priceRequest/ns0:price)
    図 3-6 totalCost 要素の一般式


    totalCost 要素の一般式

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

  12. 変更内容を保存します。
  13. デザイン ビューに 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. XQuery Transformation フォルダを右クリックします。
  3. [新規Arrow symbolXQuery トランスフォーメーション] を選択します。
  4. 親フォルダを確認します。
  5. この例では、親フォルダは Samples/XQueryTransformations です。

  6. [ファイル名] パスに「union」と入力します。
  7. 以下のソース ファイルを選択します (PO.xsd\purchase-order を 2 回選択します)。
  8. PO.xsd\purchase-order
    PO.xsd\purchase-order
    注意 : 同じ要素を 2 回追加するには、パラメータ名を変更する必要があります。
  9. 以下のターゲット スキーマと要素を選択します
  10. Order.xsd\order

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

  11. 以下の表に示されたソース要素を選択し、[対象] ペインにドラッグします。
  12. ソース要素
    リンクの種類
    ターゲット要素
    purchase-order1\line-items\line-item

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

    order\items\item
    purchase-order2\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. XQuery Transformation フォルダを右クリックします。
  3. [新規Arrow symbolXQuery トランスフォーメーション] を選択します。
  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 String 関数の入力時に引用符を使用する


    String 関数の入力時に引用符を使用する

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

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

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

    このデータ リンクは、実行時に、制約 data($date/ns1: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. 実行時に、この手順で作成した制約によって、datesDoc/date/type が文字列 "DELIVERY" に等しいかどうかがテストされます。

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

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

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

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

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

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

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

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

非反復ソース要素と反復ターゲット グループを作成するには
  1. Eclipse を起動してサンプル プロジェクトに移動します。
  2. XQuery Transformation フォルダを右クリックします。
  3. [新規Arrow symbolXQuery トランスフォーメーション] を選択します。
  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 $PODate1/ns0:billing-date union $PODate1/ns0:delivery-date
    return
    <ns1:date/>
    }
    </ns1:dates>

    実行時には、上記の XQuery コードの for ループが 2 回実行されます。最初に for ループが実行されるとき、反復変数 $PODate は和集合 $PODate1/ns0:billing-date の最初の要素と対応し、2 回目に for ループが実行されるとき、変数 $PODate は和集合 $PODate1/ns0:delivery-date の 2 番目の要素と対応します。

    上記のクエリで返される XML データは 2 つの空要素 <ns1:date/> を返します。

    以降の手順では、請求日と納期をクエリに返す XQuery コードが追加されます。

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

    図 3-13 構造的なリンクの結合の作成


    構造的なリンクの結合の作成

    構造的なリンク (pODate/billing-date から dates/date へ) と (pODate/delivery-date から dates/date へ) が結合されているため、pODate/billing-date 要素から dates/value 要素 (dates/value) へのリンクを作成したときに、pODate/delivery-date 要素と dates/value 要素の間の 2 番目のデータ リンクが自動的に作成されます。

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

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

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

    data($PODate)

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

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

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

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

      図 3-14 Billing Date の If 条件


      Billing Date の 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. XQuery Transformation フォルダを右クリックします。
  3. [新規Arrow symbolXQuery トランスフォーメーション] を選択します。
  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 条件の作成」で作成した Then 式の内部に、ネストされた 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. XQuery Transformation フォルダを右クリックします。
  3. [新規Arrow symbolXQuery トランスフォーメーション] を選択します。
  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 つまたは複数のキー値に基づいてデータをグループ化できます。ただし、Group By 機能は XQuery Mapper ではグラフィカルにサポートされておらず、Mapper のデザイン ビューには XQuery の表現はありません。したがって、XQuery Mapper のソース ビューで Group By XQuery 構文を記述する必要があります。

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

Group By XQuery 構文を作成するには
  1. Eclipse を起動してサンプル プロジェクトに移動します。
  2. XQuery Transformation フォルダを右クリックします。
  3. [新規Arrow symbolXQuery トランスフォーメーション] を選択します。
  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 コードを以下のコードと置き換えます。
  12. コード リスト 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)
  13. 作業内容を保存します。

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

キー フィールドによるグループ XQuery 構文のテスト
  1. groupby.xq ファイルをソース ビューで開いた状態で、[テスト] タブをクリックします。
  2. [ソース データ] ペインで [インポート...] をクリックします。
  3. サンプル プロジェクトで提供された Regrouping.xml ファイルをインポートします。つまり、Samples/XML/Regrouping.xml をインポートします。

[結果データ] ペインで [XQuery のテスト] をクリックします。生成されたデータが [結果データ] タブに表示されます。コード リスト 3-3 に示されたものに類似したキー フィールドでグループ化されたライン アイテムが表示されます (input-warehouse-id は最初のキー、input-location-desc は 2 つ目のキー)。

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. または、[ソース データ] ペインで、以下のオプションから選択することもできます。
    • [データの生成] : 自動生成された XML ファイルを更新または再生成する場合に選択します。
    • [インポート] : カスタム テスト XML ファイルをインポートする場合 (自動生成された XML ファイルを使用しない場合) に選択します。詳細については、「カスタム XML ファイルを使用したテスト」を参照してください。
    • [エクスポート] : 自動生成されたテスト XML データを保存する場合に選択します。
    • [自動検証] : ソース スキーマに対してソース テスト XML ファイルを検証する場合に選択します。自動検証オプションは永続的に有効にすることもできますが、状況に応じてオン/オフを切り替えることもできます。
    • 注意 : [ソース] タブをクリックして、テスト XML を手動で編集することもできます。
  6. [結果データ] ペインで [XQuery のテスト] をクリックします。
  7. ソース データに対して XQuery が実行され、結果が生成されます。結果は、[結果データ] ペインに表示されます。エラーが発生した場合は、問題を示すエラー メッセージが表示されます。

  8. または、[結果データ] ペインで、以下のオプションから選択することもできます。
    • [エクスポート] : テスト XML データを保存する場合に選択します。
    • [検証] : ターゲット スキーマに対してテスト XML を検証します。必要な要素または属性が見つからない場合は、エラーが表示されます。
カスタム XML ファイルを使用したテスト

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

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

    テスト データを [ソース データ] ペインにカット アンド ペーストすることもできます。

  5. テスト ファイルのインポート後は、以下のオプションを使用できます。
    • [データの生成] : XML ファイルを更新または再生成する場合に選択します。
    • [エクスポート] : 保存する場合に選択します。
    • [自動検証] : ソース スキーマに対してソース テスト XML ファイルを検証する場合に選択します。自動検証オプションは永続的に有効にすることもできますが、状況に応じてオン/オフを切り替えることもできます。
  6. [結果データ] ペインで [XQuery のテスト] を選択します。
  7. ソース XML が XQuery に対してテストされ、その結果が表示されます。

  8. または、[結果データ] ペインで、以下のオプションから選択することもできます。
    • [エクスポート] : インポートされたテスト XML データを再保存する場合に選択します。
    • [検証] : ターゲット スキーマに対してテスト XML を検証します。必要な要素または属性が見つからない場合は、エラーが表示されます。
カスタム MFL (非 XML) ファイルを使用したテスト

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

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

    注意 : [ファイルの種類] ドロップダウン リストは *.* に変更する必要があります。
  5. テスト ファイルのインポート後は、以下のオプションを使用できます。
    • [インポート] : 他の MFL テスト ファイルをインポートする場合に選択します。
    • [エクスポート] : MFL テスト データを保存する場合に選択します。
  6. [結果データ] ペインで [XQuery のテスト] を選択します。
  7. ソース MFL がターゲット MFL と照合してテストされ、その結果が表示されます。

  8. または、[結果データ] ペインで、以下のオプションを選択することもできます。
  9. [エクスポート] : 結果データを保存する場合に選択します。


  ページの先頭       前  次