ヘッダーをスキップ
Oracle® Fusion Middleware Oracle Service Bus開発者ガイド
11gリリース1 (11.1.1.6.2)
B61435-05
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

7 例: XQuery Mapperを使用したデータ・トランスフォーメーション

この章では、XQuery Mapperでデータ・トランスフォーメーションを実行するためのチュートリアルを示します。

ここで説明している例は、プロジェクトに含まれているサンプル・プロジェクトに基づいています。サンプル・プロジェクトを開くための詳細は、6.2項「XQuery Mapperサンプル・プロジェクトのインポート」を参照してください。

以下のシナリオの例が用意されています。

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

次の図のように、XQuery Mapperを使用して、2つの異なるスキーマのコンテンツを結合できます。

図7-1 異なるスキーマからのデータ結合

図7-1の説明が続きます
「図7-1 異なるスキーマからのデータ結合」の説明

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

  1. Eclipseを起動して、サンプル・プロジェクトを開きます。

  2. [ XQuery Transformations ]フォルダを右クリックします。

  3. 「New」「XQuery Transformation」を選択します。

  4. 親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。

  5. ファイル名として「combineData」と入力し、「Next」をクリックします。

  6. 次のソース要素を選択し、「Next」をクリックします。

    • CustInfo.xsd\customer

    • PO.xsd\purchase-order

  7. ターゲット要素としてPOCustInfo.xsd\purchase-orderを選択し、「Finish」をクリックします。

    /XQuery Transformation/XQueryTransformationsフォルダに、combineData.xqファイルが作成されます。

    次の図のように、選択したソースとターゲットの要素が「Design」ビューに表示されます。

    図7-2 XQueryトランスフォーメーションの「Design」ビュー

    図7-2の説明が続きます
    「図7-2 XQueryトランスフォーメーションの「Design」ビュー」の説明

  8. 「Source」ペインの要素を「Target」ペインにドラッグして、次のソース要素とターゲット要素の間のリンクを作成します。

    ソース要素 リンクのイメージ ターゲット要素

    customer1

    緑色の1方向の点線矢印

    purchase-order\customer

    customer1\customer-id

    水色の1方向の点線矢印

    purchase-order\customer\customer-id

    customer1\customer-name

    水色の1方向の点線矢印

    purchase-order\customer\customer-name

    customer1\customer-address

    水色の1方向の点線矢印

    purchase-order\customer\customer-address

    purchase_order1\line-items\line-item

    緑色の1方向の点線矢印

    purchase-order\line-items\line-item

    purchase-order1\line-items\line-item\part-no

    水色の1方向の点線矢印

    purchase-order\line-items\line-item\part-no

    purchase-order1\line-items\line-item\quantity

    水色の1方向の点線矢印

    purchase-order\line-items\line-item\quantity



    注意:

    破線は 構造的な リンクを表します。このリンクは、データを直接マップせず、親構造間に作成されます。

    実線は データ リンクを表します。このリンクは、ソース・ノードの値をターゲット・ノードの値に直接変換します。

    詳細は、6.10項「「Design」ビューのグラフィカルな機能」を参照してください。


    ソース要素とターゲット要素の間のリンクが、次の図のように示されます。

    図7-3 「デザイン」ビューのデータ・トランスフォーメーション

    図7-3の説明が続きます
    「図7-3 「Design」ビューのデータ・トランスフォーメーション」の説明

  9. 変更を保存します。

XQueryトランスフォーメーションのテストの詳細は、6.9項「データ・トランスフォーメーションのテスト」を参照してください。

7.2 反復する要素のマップと結合の作成

異なるスキーマ(この例では、PriceQuote.xsd、AvailableQuote.xsd、およびtaxrate.xsd)に対して有効なXMLファイルのデータを結合し、単一のスキーマQuote.xsdに対して有効なファイルを作成します。

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

7.2.1 ステップ1.XQueryファイルの作成

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

  1. Eclipseを起動して、サンプル・プロジェクトを開きます。

  2. 「XQuery Transformations」フォルダを右クリックします。

  3. 「New」「XQuery Transformation」を選択します。

  4. 親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。

  5. ファイル名として「Join」と入力し、「Next」をクリックします。

  6. 次のソース要素を選択し、「Next」をクリックします。

    • PriceQuote.xsd\priceQuote

    • PriceQuote.xsd\taxRate

    • AvailQuote.xsd\availRequest

  7. ターゲット要素としてQuote.xsd\quoteを選択し、「Finish」をクリックします。

    XQueryTransformation/XQueryTransformationsフォルダにJoin.xqファイルが作成されます。

  8. 「Source」ペインの要素を「Target」ペインにドラッグして、次のソース要素とターゲット要素の間のリンクを作成します。

    ソース要素 ターゲット要素

    priceQuote1\customerName

    quote\name

    priceQuote1\shipAddress\street

    quote\address

    priceQuote1\shipAddress\city

    quote\address

    priceQuote1\shipAddress\state

    quote\address

    priceQuote1\shipAddress\zip

    quote\address

    priceQuote1\priceRequests\priceRequest

    quote\quoteResponse

    availRequest1

    quote\quoteResponse


    次の図のようなリンクが表示されます。

    図7-4 「デザイン」ビューのデータ・トランスフォーメーション

    図7-4の説明が続きます
    「図7-4 「Design」ビューのデータ・トランスフォーメーション」の説明

  9. 変更を保存します。

7.2.2 ステップ2.制約の追加

priceQuote/priceRequestsおよびavailRequestソース要素は、共通の要素widgetIdを共有しています。この手順では、availRequestスキーマのwidgetIdpriceQuote/priceRequests要素のwidgetIdと等しい場合に、問合せがターゲット反復要素quoteResponseを返す必要のある制限を追加します。

  1. 「Design」ビューでJoin.xqを開きます。

  2. 「Source」ペインのpriceQuote1/priceRequests/priceRequest/widgetId要素をドラッグし、「Source」ペインのavailRequest1/widgetId要素にドロップします。

    次の図のように、 「Source」ペインの2つのwidgetIdノードの間を結ぶ線が表示されます。

    図7-5 制約の追加

    図7-5の説明が続きます
    「図7-5 制約の追加」の説明

  3. 変更を保存します。

  4. 「Source」ビューで変更を確認します。

    2つのwidgetIdノードの間のリンクはforループのwhere句で表されます。where句は、where句がtrueの場合にのみforループで式の結果が返される必要があることを指定します。この例では、availRequest要素のwidgetIdpriceRequest要素のwidgetIdと等しい場合にのみ、quoteResponse要素で指定されたXMLデータが式によって返されます。


    注意:

    [制約]ビューでwhere句を表示することもできます。


現在、quoteResponse要素は空です。次の手順で要素のコンテンツを追加します。

7.2.3 ステップ3.要素を返すデータの追加

この手順では、quoteResponseターゲット要素にデータ・リンクを追加します。

「Design」ビューでJoin.xqを開き、次のソース要素とターゲット要素の間のリンクを作成します。

ソース要素 ターゲット要素

priceQuote1\priceRequests\priceRequest\widgetid

quote\quoteResponse\widgetid

priceQuote1\priceRequests\priceRequest\price

quote\quoteResponse\unitprice

availRequest1\requestedQuantity

quote\quoteResponse\requestedQuantity

availRequest1\quantityAvail

quote\quoteResponse\fillOrder

availRequest1\shipDate

quote\quoteResponse\shipDate


ソース要素とターゲット要素の間のリンクが、次の図のように示されます。

図7-6 QuoteResponse要素のデータの追加

図7-6の説明が続きます
「図7-6 QuoteResponse要素のデータの追加」の説明

7.2.4 ステップ4.見積り値を計算する関数の追加

この手順では、見積りの合計値を計算する関数を追加します。

  1. 「Source」ビューでJoin.xqファイルを開きます。

  2. ソース・コードのネームスペース宣言とJoin関数呼出しの間の任意の場所に、次の関数定義を挿入します。たとえば、Join関数宣言の直前に挿入できます。

    例7-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
    };
    
  3. 「Design」ビューに切り替えます。


    注意:

    Join.xqには2つの関数宣言calculateTotalPriceおよびJoinが含まれるようになります。XQueryファイルに複数の関数が含まれる場合は、XQファイルと同じ名前の関数が「Design」ビューに表示されます。この場合、Join関数が「Design」ビューに表示されます。


  4. 「Target」ペインで、totalCostノードを選択します。次の手順に向けて、このノードを選択したままにしておきます。

  5. 「Target Expression」ビューを選択し、「General」オプションを選択します。

  6. 「General Expression」ペインに次のコードを挿入します。

    xf:calculateTotalPrice($taxRate1,$availRequest/ns1:requestedQuanity,$priceRequest/ns0:price)
    
  7. 「Apply」をクリックします。

    式がXQueryのtotalCost要素に追加されます。

  8. 変更を保存します。

    「Design」ビューにtotalCostターゲット要素の計算が表示されます。

図7-7 「Design」ビューでのtotalCostの計算

図7-7の説明が続きます
「図7-7 「Design」ビューでのtotalCostの計算」の説明

7.2.5 ステップ5.複数の条件を持つ制約の追加

「Constraints」ビューの「Where Clause」ペインを使用して制約を作成すると、XQueryで返されるターゲット反復要素を制限できます。実行時には、where句の条件を満たす反復要素のみがXQueryのforループで反復処理されます。

この手順では、forループのwhere句に別の条件を追加して(つまり、複合条件となる)、forループで返されるデータをさらに制限します。

  1. join.xqファイルを開きます。

  2. 「Design」ビューで、availRequest1ソース要素とquote\quoteResponseターゲット要素の間のリンクを選択します。

    where句を構成する1つの条件が「Constraints」ビューの「Where Clause」ペインに表示されます。

    data($priceRequest/ns0:widgetId) = data($availRequest/ns1:widgetId)
    
  3. 「Source」ペインのavailRequest1/requestedQuanity要素をドラッグし、「Where Clause」ペインの「Left Hand Expression」領域にドロップします。

    where句に、以下の左辺の式が作成されます。

    data($availRequest/ns1:requestedQuanity)
    
  4. <演算子を選択します。

  5. 「Where Clause」ペインの「Right Hand Expression」領域にあるテキストを削除し、「"50"」と入力します。


    注意:

    引用符で囲まれた数字50を入力します(50ではなく、"50")。


  6. 「Join Type」フィールドから「AND」オプションを選択します。

    「Join Type」は、where句を構成する条件が実行時に評価される方法を決定します。

  7. 「Add」をクリックします。forループのwhere句に、2つ目の条件が追加されます。

  8. 変更を保存します。

    この手順により、次のwhere句の作成が完了します。

例7-2 where句

where (data($availRequest/ns1:widgetId) = data($priceRequest/ns0:widgetId)
and data($availRequest/ns1:requestedQuanity) < "50")

7.2.6 XQueryのテスト

次の手順を実行して、where句の条件が両方とも満たされた場合にXQueryが動作することを確認します。

  1. 「Test」ビューに切り替えます。

  2. 「Test」ビューの「Source Data」ペインで、「Source Variable」フィールドのpriceQuoteを選択し、「Generate Data」アイコンをクリックします。

  3. テストXMLデータのwidgetId要素の値を書き留めておきます。

    <ns0:widgetId>value</ns0:widgetId>
    
  4. 「Source Data」ペインで、「Source Variable」フィールドのavailRequestを選択し、「Generate Data」アイコンをクリックします。

  5. テストXMLデータpriceQuoteに表示された値と一致するように、テストXMLデータのwidgetId要素の値を編集します。

    <ns0:widgetId>value</ns0:widgetId>
    
  6. requestedQuanity要素を探し、50より小さい数に値を編集します。

    例: <ns0:requestedQuanity>25</ns0:requestedQuanity>

  7. 「Result Data」ペインで、「Test XQuery」アイコンをクリックし、XQueryの結果を表示します。

7.3 和集合の作成

この例では、「Constraints」ビューの「Union」オプションを使用して、同じ型のデータを大きなデータ・セットにマップするXQueryを作成します。

  1. Eclipseを起動して、サンプル・プロジェクトを開きます。

  2. 「XQuery Transformations」フォルダを右クリックします。

  3. 「New」「XQuery Transformation」を選択します。

  4. 親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。

  5. ファイル名として「union」と入力し、「Next」をクリックします。

  6. 「Source Types」ダイアログ・ボックスで、PO.xsd\purchase-orderを2回選択し、「Next」をクリックします。


    注意:

    同じ要素を2回以上追加するには、パラメータ名を変更する必要があります。


  7. ターゲット型としてOrder.xsd\orderを選択し、「Finish」をクリックします。

    union.xqファイルが作成されます。

  8. 以下のソース要素とターゲット要素の間のリンクを作成します。

    ソース要素 ターゲット要素

    purchase-order1\line-items\line-item

    order\items\item

    purchase-order2\line-items\line-item

    order\items\item


    「Design」ビューに、次のリンクが表示されます。

    図7-8 和集合の作成

    図7-8の説明が続きます
    「図7-8 和集合の作成」の説明

  9. $purchase-order1/line-items/line-itemソース要素とorder/items/itemターゲット要素の間のリンクを選択します。

  10. 「Constraints」ビューの「Constraint Type」ペインで、「Union」を選択します。

  11. 以下のソース要素とターゲット要素の間のリンクを作成します。

    ソース要素 ターゲット要素

    purchase-order1\line-items\part-no

    order\items\item\part-number

    purchase-order1\line-items\quantity

    order\items\item\quantity-number



    注意:

    同じ名前のソース要素とターゲット要素の間にリンクを作成するには、手動でリンクを作成するかわりに、「Induce Map」オプションを使用できます。詳細は、6.10.1項「右クリック・メニュー・オプション」を参照してください。


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

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

    図7-9の説明が続きます
    「図7-9 暗黙的なリンクの作成」の説明

  12. 変更を保存します。

XQueryトランスフォーメーションのテストの詳細は、6.9項「データ・トランスフォーメーションのテスト」を参照してください。

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

この例では、反復するソースXML要素を、反復しないターゲットXML要素にマップします。

次の図に、この例で作成したトランスフォーメーションを示します。

図7-10 反復ソースから非反復ターゲットへのトランスフォーメーション

図7-10の説明が続きます
「図7-10 反復ソースから非反復ターゲットへのトランスフォーメーション」の説明

  1. Eclipseを起動して、サンプル・プロジェクトを開きます。

  2. 「XQuery Transformations」フォルダを右クリックします。

  3. 「New」「XQuery Transformation」を選択します。

  4. 親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。

  5. ファイル名として「repeatToNonRepeat」と入力し、「Next」をクリックします。

  6. ソース・スキーマとしてDates.xsd\datesを選択し、「Next」をクリックします。

  7. ターゲット・スキーマとしてPODate.xsd\PODateを選択し、「Finish」をクリックします。

    次の図のように、 repeatToNonRepeat.xq ファイルが作成され、表示されます。

    図7-11 反復ソースから非反復ターゲットへのデータ・トランスフォーメーション

    図7-11の説明が続きます
    「図7-11 反復ソースから非反復ターゲットへのデータ・トランスフォーメーション」の説明

  8. 「Source」ペインのdates1/date反復要素と「Target」ペインのPODate/billing-date要素の間のリンクを作成します。

    次の手順に向けて、このリンクを選択したままにしておきます。

  9. 「Constraints」ビューを選択します。

  10. 「Source」ペインのdates1/date/type要素を「Constraints」ビューの「Where Clause」ペインの「Left Hand Expression」領域にドラッグします。

  11. =演算子を選択します。

  12. 「Right Hand Expression」領域で、(引用符も含めて)「"BILLING"」と入力し、「Add」をクリックします。

  13. 「Source」ペインのdates1/date/value要素と「Target」ペインのPODate/billing-date要素の間のリンクを作成します。

    前の手順で作成した制約により、XMLドキュメントのdates1/date/type要素の値が値「"BILLING"」と比較するように指定されます。

    実行時は、dates1/date/type要素の値が「"BILLING"」である場合に、XQueryでdates1/date/valueの値がbilling-dateの値として返されます。

  14. 「Source」ペインのdates1/date反復要素と「Target」ペインのPODate/delivery-date要素の間のリンクを作成します。

    次の手順に向けて、このリンクを選択したままにしておきます。

  15. 「Source」ペインのdates1/date/type要素を「Constraints」ビューの「Where Clause」ペインの「Left Hand Expression」領域にドラッグします。

  16. =演算子を選択します。

  17. 「Right Hand Expression」領域で、(引用符も含めて)「"DELIVERY"」と入力し、「Add」をクリックします。

  18. 「Source」ペインのdates1/date/value反復要素と「Target」ペインのPODate/delivery-date要素の間のリンクを作成します。

    前の手順で作成した制約により、XMLドキュメントのdates1/date/type要素の値が値「"DELIVERY"」と比較するように指定されます。

    実行時は、dates1/date/type要素の値が「"DELIVERY"」である場合に、XQueryでdates1/date/valueの値がdelivery-dateの値として返されます。

    図7-12 反復ソースから非反復ターゲットへのデータ・トランスフォーメーション

    図7-12の説明が続きます
    「図7-12 反復ソースから非反復ターゲットへのデータ・トランスフォーメーション」の説明

  19. 変更を保存します。

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

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

この例では、反復しないソース要素を、反復するターゲット要素にマップします。

次の図に、この例で作成したトランスフォーメーションを示します。

図7-13 非反復ソースから反復ターゲットへのトランスフォーメーション

図7-13の説明が続きます
「図7-13 非反復ソースから反復ターゲットへのトランスフォーメーション」の説明

  1. Eclipseを起動して、サンプル・プロジェクトを開きます。

  2. 「XQuery Transformations」フォルダを右クリックします。

  3. 「New」「XQuery Transformation」を選択します。

  4. 親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。

  5. ファイル名として「nonRepeatToRepeat」と入力し、「Next」をクリックします。

  6. ソース・スキーマとしてPODate.xsd\PODateを選択し、「Next」をクリックします。

  7. ターゲット・スキーマとしてDates.xsd\datesを選択し、「Finish」をクリックします。

  8. 「Design」ビューに、nonRepeatToRepeat.xqファイルが作成され、表示されます。

  9. 以下のソース要素とターゲット要素の間のリンクを作成します。

    ソース要素 ターゲット要素

    pODate1/billing-date

    dates/date

    pODate1/delivery-date

    dates/date


    次の例は、生成されるXQueryコードを示します。

    <ns1:dates>
    {
      for $PODate in $PODate1/ns0:billing-date union $PODate1/ns0:delivery-date
      return
      <ns1:date/>
    }
    </ns1:dates>
    

    実行時に、forループが2回実行されます。最初の実行時に、反復変数$PODateは和集合の最初の要素$PODate1/ns0:billing-dateと等しくなります。2回目の実行では、$PODate$PODate1/ns0:delivery-dateと等しくなります。

    XQueryはタグ<ns1:date/>を持つ2つの空XML要素を返します。

    以降の手順では、請求日と納期を問合せに返すXQueryコードを追加します。

  10. 「Design」ビューに切り替えます。

  11. pODate1/billing-dateソース要素と「Target」ペインのdates/valueターゲット要素の間のリンクを作成します。

    次の図のように、2つのデータ・リンクが作成されます。

    図7-14 構造的なリンクの結合の作成

    図7-14の説明が続きます
    「図7-14 構造的なリンクの和集合の作成」の説明

    pODate1/billing-dateからdates/valueへのリンクを作成したときに、次の構造的なリンクが結合されています。

    • pODate1/billing-dateからdates/date

    • pODate1/delivery-dateからdates/date

    pODate1/delivery-date要素とdates/value要素の間の2番目のデータ・リンクが自動的に作成されます。

  12. pODate1/billing-dateソース要素とdates/typeターゲット要素の間のリンクを作成します。

    2つのデータ・リンクが作成されます。

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

  13. 「Target Expression」ビューを選択します。

  14. 「If Then Else」オプションを選択します。

    以下のXQuery if-then-else式がリンクに追加されます。

    if (fn:boolean("true")) then
        data($PODate)
    else
        ()
    
  15. この手順では、if-then-else式のifセクションの条件を追加します。

    1. 「Expression Structure」領域で「If Condition」を選択します。

      「Edit If Condition」ペインが表示されます。

    2. 「Expression Functions」ビューで、「Node Functions」を展開します。

    3. local-name関数を、「Edit If Condition」ペインの「Left Hand Expression」領域にドラッグします。関数の$node-var引数を選択したままにしておきます。

    4. 「Expression Variables」ビューを選択します。

    5. PODate構造リンク変数を、「Edit If Condition」ペインの「Left Hand Expression」領域のlocal-name関数の$node-var引数にドラッグします。

    6. =演算子を選択します。

    7. 「Edit If Condition」ペインの「Right Hand Expression」領域で、(引用符も含めて)「"billing-date"」と入力し、「Add」をクリックします。

      if-then-else式のifセクションに、次の条件が追加されます。

      fn:local-name($PODate)="billing-date"
      
  16. 「Expression Structure」領域で「Then Expression」を選択します。

    「Edit Then Condition」ペインが表示されます。

  17. 既存のテキストを(引用符も含めて)「"BILLING"」で置き換え、「Apply」アイコンをクリックします。

  18. 「Expression Structure」領域で「Else Expression」を選択します。

    「Edit Else Condition」ペインが表示されます。

  19. 既存のテキストを(引用符も含めて)「"DELIVERY"」で置き換え、「Apply」アイコンをクリックします。

  20. 「Expression Structure」領域で「If Then Else」を選択します。

    「Expression Structure」ペインに、次のXQueryコードが表示されます。

    if (fn:local-name($PODate) = "billing-date") then
    "BILLING"
    else
    "DELIVERY"
    
  21. 変更を保存します。

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

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

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

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

7.6.1 ステップ1.XQueryトランスフォーメーションの作成

この手順では、 PurchaseAgree.xsd および Supplier.xsd スキーマを使用してXQueryトランスフォーメーションを作成します。

  1. Eclipseを起動して、サンプル・プロジェクトを開きます。

  2. 「XQuery Transformations」フォルダを右クリックします。

  3. 「New」「XQuery Transformation」を選択します。

  4. 親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。

  5. ファイル名として「ifthenelse」と入力し、「Next」をクリックします。

  6. ソース型としてSupplier.xsd\Supplierを選択し、「Next」をクリックします。

  7. ターゲット型としてPurchaseAgree.xsd\PurchaseOrderを選択し、「Finish」をクリックします。

    ifThenElse.xqファイルが作成されます。

  8. 以下のソース要素とターゲット要素の間のリンクを作成します。

    ソース要素 ターゲット要素

    supplier1/products/product

    PurchaseOrder/products/product

    supplier1/products/product/price

    PurchaseOrder/products/product/price


    次の図のようなリンクが表示されます。

図7-15 If-Then-ElseサンプルのXQueryトランスフォーメーション

図7-15の説明が続きます
「図7-15 If-Then-ElseサンプルのXQueryトランスフォーメーション」の説明

7.6.2 ステップ2.最初の「If」条件の作成

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

  1. supplier1/products/product/priceソース要素とPurchaseOrder/products/product/priceターゲット要素の間のリンクを選択します。

  2. 「Target Expression」ビューを選択します。

  3. 「If Then Else」の式タイプを選択します。

  4. 「Expression Structure」ペインで、「If Condition」を選択します。

    「Edit If Condition」ペインが表示されます。

  5. 「Source」ペインのsupplier1\products\product\widgetID要素をドラッグし、「Left Hand Expression」ペインにドロップします。

  6. >=演算子を選択します。

  7. 「Right Hand Expression」ペインで、(引用符も含めて)「"0"」と入力し、「Add」をクリックします。

  8. <=演算子を選択します。

  9. 「Right Hand Expression」ペインで、「"200"」と入力します。

  10. 「Update」ボタンの横の矢印をクリックし、「Add」を選択します。

  11. 「Expression Structure」ペインで、「Then Condition」を選択します。

    「Edit Then Condition」ペインが表示されます。

  12. 「Edit Then Expression」ペインで、既存のデータを削除し、「"$10.00"」と入力します。

  13. 「Apply」アイコンをクリックします。

  14. 「Expression Structure」ペインで、「If Then Else」を選択します。

    以下のコード・リストに示すようなif-then式が表示されます。

例7-3 If-Then式

if ((xs:string(data($product/ns0:widgetId)) >= "0" 
  and xs:string(data($product/ns0:widgetId)) <= "200")) then
  "$10.00"
else
  ()

7.6.3 ステップ3.最初のネストされたIf-Then-Else条件の作成

この手順では、ウィジェットIDが201 - 400の場合に価格を$20.00にするネストされたIf式を作成します。このためには、前の手順で作成したElse式の内部にネストされたif-then-else式を挿入します。

  1. 「Expression Structure」ペインで、「Else Expression」を右クリックし、「Insert Nested If-Then-Else」を選択します。

  2. ネストされた「If-Then-Else」式で、「If Condition」を選択します。

  3. 「Source」ペインのwidgetID要素をドラッグし、「Left Hand Expression」ペインにドロップします。

  4. >=演算子を選択します。

  5. 「Right Hand Expression」ペインで、(引用符も含めて)「"201"」と入力し、「Add」をクリックします。

  6. <=演算子を選択します。

  7. 「Right Hand Expression」ペインで、「"400"」と入力します。

  8. 「Update」ボタンの横の矢印をクリックし、「Add」を選択します。

  9. 「Expression Structure」ペインで、「Then Expression」を選択します。

  10. 「Edit Then Expression」ペインで、「"$20.00"」と入力します。

  11. 「Apply」アイコンをクリックします。

  12. 「Expression Structure」ペインで、「If Then Else」を選択します。

    以下のコード・リストに示すようなif-then-else式が表示されます。

例7-4 ネストされたIf-Then-Else式

if ((xs:string(data($product/ns0:widgetId)) >= "0" 
   and xs:string(data($product/ns0:widgetId)) <= "200")) then
      "$10.00"
else
   if ((xs:string(data($product/ns0:widgetId)) >= "201"  
      and xs:string(data($product/ns0:widgetId)) <= "400")) then
      "$20.00"
   else
      ()

7.6.4 ステップ4.2つ目のネストされたIf-Then-Else条件の作成

この手順では、ウィジェットIDが401 - 600の場合に価格を$30.00にするネストされたIf式を作成します。このためには、前の手順で作成したElse式の内部にネストされたif-then-else式を挿入します。

  1. 「Expression Structure」ペインで、ネストされたif-then-else式のElse句を選択します。この句は、7.6.3項「ステップ3.最初のネストされたIf-Then-Else条件の作成」で作成されています。

  2. 右クリックし、「Insert Nested If-Then-Else」を選択します。

  3. 作成したばかりのネストされたif-then-else式のIf条件を選択します。

  4. 「Source」ペインのwidgetIDをドラッグし、「Left Hand Expression」ペインにドロップします。

  5. >=演算子を選択します。

  6. 「Right Hand Expression」ペインで、「"401"」と入力し、「Add」をクリックします。

  7. <=演算子を選択します。

  8. 「Right Hand Expression」ペインで、「"600"」と入力し、「Add」をクリックします。

  9. 「Expression Structure」ペインで、「Then Expression」を選択します。

  10. 「Edit Then Expression」ペインで、「"$30.00"」と入力し、「Apply」アイコンをクリックします。

  11. 「Expression Structure」ペインで、「If Then Else」を選択します。

    以下のコード・リストに示すようなネストされたif-then-else式が表示されます。

例7-5 ネストされたIf-Then-Else式

if ((xs:string(data($product/ns0:widgetId)) >= "0" 
   and xs:string(data($product/ns0:widgetId)) <= "200")) then
      "$10.00"
else
   if ((xs:string(data($product/ns0:widgetId)) >= "201" 
      and xs:string(data($product/ns0:widgetId)) <= "400")) then
      "$20.00"
   else
      if ((xs:string(data($product/ns0:widgetId)) >= "401" 
         and xs:string(data($product/ns0:widgetId)) <= "600")) then
         "$30.00"
      else
         ()

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

7.7 FLWOR式の作成

この例では、For-Let-Where-Order By-Return式を使用して、合計値が2000を超えるアイテムについて、見積りからウィジェットIDを抽出します。

  1. XQueryファイルを作成します。

    1. Eclipseを起動して、サンプル・プロジェクトを開きます。

    2. 「XQuery Transformations」フォルダを右クリックします。

    3. 「New」「XQuery Transformation」を選択します。

    4. 親フォルダの名前を確認します。

    5. ファイル名として「flwor」と入力し、「Next」をクリックします。

    6. ソース型としてQuote.xsd\quoteを選択し、「Next」をクリックします。

    7. ターゲット型としてQuote.xsd\quoteを選択し、「Finish」をクリックします。

      次の図のように、 flwor.xq ファイルが作成されます。

      図7-16 XQueryサンプル - FLWOR式

      図7-16の説明が続きます
      「図7-16 XQueryサンプル - FLWOR式」の説明

  2. Let句をデザインします。


    注意:

    この例では、let句は必須ではありません。ここではXQuery Mapperでのデザイン方法を示すためにのみ使用しています。


    1. 「Expression Structure」ペインで、「Let Clause」を選択します。

      「Edit Let Clause」ペインが表示されます。

    2. 「Variable」フィールドで、既存の値をwidgetで置き換えます。

    3. 「Expression Variables」ビューを選択します。

    4. 「Structural Link」フォルダで、quoteノードを展開します。

    5. 「Expression Variables」ビューのquote/widgetIDをドラッグし、「Single Expression」フィールドにドロップします。

    6. 「Update」をクリックします。

  3. Where句をデザインします。

    1. 「Expression Structure」ペインで、「For...Return」を右クリックし、「Insert Where Clause」を選択します。

    2. 「Where Clause」を選択します。

      「Edit Where Condition」ペインが表示されます。

    3. 「Expression Variables」ビューの「Structural Link」フォルダのquote/totalCostをドラッグし、「Left Hand Expression」フィールドにドロップします。

    4. >演算子を選択します。

    5. 「Right Hand Expression」領域に、「2000」と入力します。

    6. 「Add」をクリックします。

  4. Order By句をデザインします。

    1. 「Expression Structure」ペインで、「For...Return」を右クリックし、「Insert Order By Clause」を選択します。

    2. 「Order By Clause」を選択します。

      「Edit Order By Clause」ペインが表示されます。

    3. 「Sort Order」フィールドで、「ascending」を選択します。

    4. 「Single Expression」フィールドで、「$widget」と入力します。これは、let句で宣言された変数の名前です。

    5. 「Update」をクリックします。

  5. Return式をデザインします。

    1. 「Expression Structure」ペインで、「Return Expression」を選択します。

    2. 「Expression Variables」ビューで、「Structural Link」フォルダを展開します。

    3. 「Expression Variables」ビューのquoteをドラッグし、「Single Expression」フィールドにドロップします。

    4. 「Apply」アイコンをクリックします。

  6. 変更を保存します。

「Expression Structure」ペインで「For...Return」を選択すると、FLWOR式のソース・コードを表示できます。次のコード・リストに示すようなコードが作成されます。

例7-6 FLWOR式のコード

for $quote in ($quote1/quoteResponse)
let $widget := ($quote/widgetId)
where $quote/totalCost > 2000
order by $widget ascending
return
    $quote

XQueryトランスフォーメーションのテストの詳細は、6.9項「データ・トランスフォーメーションのテスト」を参照してください。

7.8 再帰的なスキーマの使用

この例では、再帰的な要素を含むスキーマを使用してデータ・トランスフォーメーションを作成します。

スキーマの要素は、例7-7に示すように、親と同じタイプの子要素を含んでいる場合に再帰的と見なされます。この例では、product要素が再帰的な要素です。これは、この要素のタイプがproductTypeであり、productTypeにはタイプが同じproductTypeであるchild-product要素が含まれているためです(productTypeは自身を参照)。

例7-7 再帰的なスキーマの例

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
   targetNamespace="http://www.acme.org/Product" 
   xmlns="http://www.acme.org/Product" elementformDefault="qualified" 
   attributeFormDefault="unqualified">
   <xs:complexType name="productType">
      <xs:sequence>
         <xs:element name="part-description" minOccurs="0" 
            maxOccurs="unbounded" type="xs:string" />
         <xs:element name="child-product" minOccurs="0" 
            maxOccurs="unbounded" type="producttype" />
      </xs:sequence>
   </xs:complexType>
   <xs:element name="product" type="productType">
   </xs:element>
</xs:schema>

再帰的なスキーマを使用してトランスフォーメーションを作成するには、以下の手順を実行します。

  1. Eclipseを起動して、サンプル・プロジェクトを開きます。

  2. 「XQuery Transformations」フォルダを右クリックします。

  3. 「New」「XQuery Transformation」を選択します。

  4. 親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。

  5. ファイル名として「recursive」と入力し、「Next」をクリックします。

  6. ソース・スキーマとしてSupplierAcme.xsd\supplier_acmeを選択し、「Next」をクリックします。

  7. ターゲット・スキーマとしてProduct.xsd\productを選択し、「Finish」をクリックします。

    recursive.xqファイルが作成されます。

  8. 以下のソース要素とターゲット要素の間のリンクを作成します。

    ソース要素 ターゲット要素

    supplier_acme1\part-description-00100

    product\part-description

    supplier_acme1\part-description-00101

    product\child-product\part-description

    supplier_acme1\part-description-00101

    product\child-product\child-product\part-description


    次の図に、ソース要素と再帰的なchild-productターゲット要素の間のリンクを示します。

    図7-17 再帰的な要素のマッピング

    図7-17の説明が続きます
    「図7-17 再帰的な要素のマッピング」の説明

  9. 変更を保存します。

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

7.9 キー・フィールドによるデータのグループ

「Group by Key Fields」機能を使用して、1つまたは複数のキー値に基づいてデータをグループ化できます。


注意:

Group-By機能はXQuery Mapperではグラフィカルにサポートされておらず、「Design」ビューにはXQueryの表現はありません。「Source」ビューでGroup-By式を記述する必要があります。


この例では、入力XMLドキュメントとして以下のコード・リストを使用します。

例7-8 入力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>

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

反復する要素input-line-itemの最初のインスタンスと3つ目のインスタンスには、input-warehouse-id要素とinput-location-desc要素の同じ値(それぞれWarehouse1Location1)が含まれます。

この例の目的は、明細の最初のインスタンスと3つ目のインスタンスをグループ化するXQueryを作成することです。これには、例7-9に示すように、出力ドキュメントのWarehouse1キーとLocation1キーを使用します。

例7-9 出力XMLドキュメントのサンプル

<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式を作成するには、以下の手順を実行します。

  1. Eclipseを起動して、サンプル・プロジェクトを開きます。

  2. 「XQuery Transformations」フォルダを右クリックします。

  3. 「New」「XQuery Transformation」を選択します。

  4. 親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。

  5. ファイル名として「groupby」と入力し、「Next」をクリックします。

  6. ソース・スキーマとしてregroupKeyFldIn.xsd\input-warehouse-inventoryを選択し、「Next」をクリックします。

  7. ターゲット・スキーマとしてregroupKeyFldOut.xsd\output-inventoryを選択し、「Finish」をクリックします。

    groupby.xqファイルが作成されます。

  8. 「Source」ビューを選択します。

  9. 以下のコード・リストのコードを使用して、既存のコードを置き換えます。

    例7-10 Group-By式の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)
    
  10. 変更を保存します。

    変更内容は 「デザイン」 ビューには表示されません。

  11. 「Source」ビューでgroupby.xqファイルを開いた状態で、「Test」ビューを選択します。

  12. 「Source Data」ペインで、「Import」アイコンをクリックします。

  13. ( XML Transformation/XML/ フォルダから)サンプル・プロジェクトで提供されている Regrouping.xml ファイルをインポートします。

  14. 「Result Data」ペインで、「Test XQuery」アイコンを選択します。

    例7-9に示すように、XQueryの結果が表示されます。