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

     前  次    新しいウィンドウで目次を開く     
ここから内容

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

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

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

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

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

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

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

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

  1. WorkSpace Studio を起動して、サンプル プロジェクトを開きます。
  2. XQuery Transformations フォルダを右クリックします。
  3. [新規XQuery トランスフォーメーション] を選択します。
  4. 親フォルダの名前を確認します。この例では、親フォルダは /XQuery Transformation/XQueryTransformations です。
  5. ファイル名として「combineData」と入力し、[次へ] をクリックします。
  6. 以下のソース要素を選択し、[次へ] をクリックします。
    • CustInfo.xsd\customer
    • PO.xsd\purchase-order
  7. ターゲット要素として POCustInfo.xsd\purchase-order を選択し、[完了] をクリックします。
  8. /XQuery Transformation/XQueryTransformations フォルダに、combineData.xq ファイルが作成されます。

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

    図 3-2 XQuery トランスフォーメーションのデザイン ビュー


    XQuery トランスフォーメーションのデザイン ビュー

  9. [ソース] ペインの要素を [対象] ペインにドラッグして、以下のソース要素とターゲット要素の間のリンクを作成します。
    ソース要素
     
    ターゲット要素
    customer1

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

    purchase-order\customer
    customer1\customer-id

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

    purchase-order\customer\customer-id
    customer1\customer-name

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

    purchase-order\customer\customer-name
    customer1\customer-address

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

    purchase-order\customer\customer-address
    purchase_order1\line-items\line-item

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

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

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

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

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

    purchase-order\line-items\line-item\quantity
  10. 注意 : 破線は構造的なリンクを表します。このリンクは、データを直接マップせず、親構造間に作成されます。
    注意 : 実線はデータ リンクを表します。このリンクは、ソース ノードの値をターゲット ノードの値に直接変換します。
    注意 : 詳細については、「デザイン ビューのグラフィカルな機能」を参照してください。

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

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


    デザイン ビューのデータ トランスフォーメーション

  11. 変更を保存します。

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

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

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

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

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

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

  1. WorkSpace Studio を起動して、サンプル プロジェクトを開きます。
  2. XQuery Transformations フォルダを右クリックします。
  3. [新規XQuery トランスフォーメーション] を選択します。
  4. 親フォルダの名前を確認します。この例では、親フォルダは /XQuery Transformation/XQueryTransformations です。
  5. ファイル名として「Join」と入力し、[次へ] をクリックします。
  6. 以下のソース要素を選択し、[次へ] をクリックします。
    • PriceQuote.xsd\priceQuote
    • PriceQuote.xsd\taxRate
    • AvailQuote.xsd\availRequest
  7. ターゲット要素として Quote.xsd\quote を選択し、[完了] をクリックします。
  8. XQueryTransformation/XQueryTransformations フォルダに Join.xq ファイルが作成されます。

  9. [ソース] ペインの要素を [対象] ペインにドラッグして、以下のソース要素とターゲット要素の間のリンクを作成します。
    ソース要素
    ターゲット要素
    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
  10. 次の図のようなリンクが表示されます。

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


    デザイン ビューのデータ トランスフォーメーション

  11. 変更を保存します。

手順 2. 制約の追加

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

  1. デザイン ビューで Join.xq を開きます。
  2. [ソース] ペインの priceQuote1/priceRequests/priceRequest/widgetId 要素をドラッグし、[ソース] ペインの availRequest1/widgetId 要素にドロップします。
  3. 次の図のように、[ソース] ペインの 2 つの widgetId ノードの間を結ぶ線が表示されます。

    図 3-5 制約の追加


    制約の追加

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

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

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

手順 3. 要素を返すデータの追加

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

デザイン ビューで 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

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

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

QuoteResponse 要素のデータの追加

手順 4. 見積もり値を計算する関数の追加

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

  1. ソース ビューで Join.xq ファイルを開きます。
  2. ソース コードのネームスペース宣言と Join 関数呼び出しの間の任意の場所に、以下の関数定義を挿入します。 たとえば、Join 関数宣言の直前に挿入できます。
  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. デザイン ビューに切り替えます。
  5. 注意 : Join.xq には 2 つの関数宣言 calculateTotalPrice および Join が含まれるようになります。 XQuery ファイルに複数の関数が含まれる場合は、XQuery ファイルと同じ名前の関数がデザイン ビューに表示されます。この場合、Join 関数がデザイン ビューに表示されます。
  6. [対象] ペインで、totalCost ノードを選択します。 次の手順に向けて、このノードを選択したままにしておきます。
  7. [対象の式] ビューを選択し、[一般] オプションを選択します。
  8. [一般式] ペインに、以下のコードを挿入します。
  9. xf:calculateTotalPrice($taxRate1,$availRequest/ns1:requestedQuanity,$priceRequest/ns0:price)
  10. [適用] をクリックします。
  11. 式が XQuery の totalCost 要素に追加されます。

  12. 変更を保存します。
  13. デザイン ビューに totalCost ターゲット要素の計算が表示されます。

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


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

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

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

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

  1. join.xq ファイルを開きます。
  2. デザイン ビューで、availRequest1 ソース要素と quote\quoteResponse ターゲット要素の間のリンクを選択します。
  3. where 句を構成する 1 つの条件が [制限] ビューの [Where 句] ペインに表示されます。

    data($priceRequest/ns0:widgetId) = data($availRequest/ns1:widgetId)
    
  4. [ソース] ペインの availRequest1/requestedQuanity 要素をドラッグし、[Where 句] ペインの [左辺の式] 領域にドロップします。
  5. where 句に、以下の左辺の式が作成されます。

    data($availRequest/ns1:requestedQuanity)
    
  6. < 演算子を選択します。
  7. [Where 句] ペインの [右辺の式] セクションにあるテキストを削除し、「"50"」と入力します。
  8. 注意 : 引用符で囲まれた数字 50 を入力します (50 ではなく、"50")。
  9. [結合の種類] フィールドから [AND] オプションを選択します。
  10. [結合の種類] は、where 句を構成する条件が実行時に評価される方法を決定します。

  11. [追加] をクリックします。for ループの where 句に、2 つ目の条件が追加されます。
  12. 変更を保存します。
  13. この手順により、以下の where 句の作成が完了します。

    コード リスト 3-2 Where 句
    where (data($availRequest/ns1:widgetId) = data($priceRequest/ns0:widgetId)
    and data($availRequest/ns1:requestedQuanity) < "50")

XQuery のテスト

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

  1. テスト ビューに切り替えます。
  2. テスト ビューの [ソース データ] ペインで、[ソース変数] フィールドの priceQuote を選択し、[データの生成] アイコンをクリックします。
  3. テスト XML データの widgetId 要素の値を書き留めておきます。
  4. <ns0:widgetId>value</ns0:widgetId>
  5. [ソース データ] ペインで、[ソース変数] フィールドの availRequest を選択し、[データの生成] アイコンをクリックします。
  6. テスト XML データ priceQuote に表示された値と一致するように、テスト XML データの widgetId 要素の値を編集します。
  7. <ns0:widgetId>value</ns0:widgetId>
    
  8. requestedQuanity 要素を探し、50 より小さい数に値を編集します。
  9. 例 : <ns0:requestedQuanity>25</ns0:requestedQuanity>

  10. [結果データ] ペインで、[XQuery のテスト] アイコンをクリックし、XQuery の結果を表示します。

和集合の作成

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

  1. WorkSpace Studio を起動して、サンプル プロジェクトを開きます。
  2. XQuery Transformations フォルダを右クリックします。
  3. [新規XQuery トランスフォーメーション] を選択します。
  4. 親フォルダの名前を確認します。この例では、親フォルダは /XQuery Transformation/XQueryTransformations です。
  5. ファイル名として「union」と入力し、[次へ] をクリックします。
  6. [ソース型] ダイアログ ボックスで、[PO.xsd\purchase-order] を 2 回選択し、[次へ] をクリックします。
  7. 注意 : 同じ要素を 2 回以上追加するには、パラメータ名を変更する必要があります。
  8. ターゲット型として Order.xsd\order を選択し、[完了] をクリックします。
  9. union.xq ファイルが作成されます。

  10. 以下のソース要素とターゲット要素の間のリンクを作成します。
    ソース要素
    ターゲット要素
    purchase-order1\line-items\line-item
    order\items\item
    purchase-order2\line-items\line-item
    order\items\item
  11. デザイン ビューに、以下のリンクが表示されます。

    図 3-8 和集合の作成


    和集合の作成

  12. $purchase-order1/line-items/line-item ソース要素と order/items/item ターゲット要素の間のリンクを選択します。
  13. [制約] ビューの [制約の種類] ペインで、[和集合] を選択します。
  14. 以下のソース要素とターゲット要素の間のリンクを作成します。
    ソース要素
    ターゲット要素
    purchase-order1\line-items\part-no
    order\items\item\part-number
    purchase-order1\line-items\quantity
    order\items\item\quantity-number
  15. 注意 : 同じ名前のソース要素とターゲット要素の間にリンクを作成するには、手動でリンクを作成する代わりに、[自動マップ] オプションを使用できます。詳細については、「右クリック メニュー オプション」を参照してください。

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

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


    暗黙的なリンクの作成

  16. 変更を保存します。

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

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

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

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

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

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

  1. WorkSpace Studio を起動して、サンプル プロジェクトを開きます。
  2. XQuery Transformations フォルダを右クリックします。
  3. [新規XQuery トランスフォーメーション] を選択します。
  4. 親フォルダの名前を確認します。この例では、親フォルダは /XQuery Transformation/XQueryTransformations です。
  5. ファイル名として「repeatToNonRepeat」と入力し、[次へ] をクリックします。
  6. ソース スキーマとして Dates.xsd\dates を選択し、[次へ] をクリックします。
  7. ターゲット スキーマとして PODate.xsd\PODate を選択し、[完了] をクリックします。
  8. 次の図のように、repeatToNonRepeat.xq ファイルが作成され、表示されます。

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


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

  9. [ソース] ペインの dates1/date 反復要素と [対象] ペインの PODate/billing-date 要素の間のリンクを作成します。
  10. 次の手順に向けて、このリンクを選択したままにしておきます。

  11. [制約] ビューを選択します。
  12. [ソース] ペインの dates1/date/type 要素を [制約] ビューの [Where 句] ペインの [左辺の式] 領域にドラッグします。
  13. = 演算子を選択します。
  14. [右辺の式] 領域で、(引用符も含めて)「"BILLING"」と入力し、[追加] をクリックします。
  15. [ソース] ペインの dates1/date/value 要素と [対象] ペインの PODate/billing-date 要素の間のリンクを作成します。
  16. 前の手順で作成した制約により、XML ドキュメントの dates1/date/type 要素の値が値 "BILLING" と比較するように指定されます。

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

  17. [ソース] ペインの dates1/date 反復要素と [対象] ペインの PODate/delivery-date 要素の間のリンクを作成します。
  18. 次の手順に向けて、このリンクを選択したままにしておきます。

  19. [ソース] ペインの dates1/date/type 要素を [制約] ビューの [Where 句] ペインの [左辺の式] 領域にドラッグします。
  20. = 演算子を選択します。
  21. [右辺の式] 領域で、(引用符も含めて)「"DELIVERY"」と入力し、[追加] をクリックします。
  22. [ソース] ペインの dates1/date/value 反復要素と [対象] ペインの PODate/delivery-date 要素の間のリンクを作成します。
  23. 前の手順で作成した制約により、XML ドキュメントの dates1/date/type 要素の値が値 "DELIVERY" と比較するように指定されます。

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

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


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

  24. 変更を保存します。

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

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

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

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

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

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

  1. WorkSpace Studio を起動して、サンプル プロジェクトを開きます。
  2. XQuery Transformations フォルダを右クリックします。
  3. [新規XQuery トランスフォーメーション] を選択します。
  4. 親フォルダの名前を確認します。この例では、親フォルダは /XQuery Transformation/XQueryTransformations です。
  5. ファイル名として「nonRepeatToRepeat」と入力し、[次へ] をクリックします。
  6. ソース スキーマとして PODate.xsd\PODate を選択し、[次へ] をクリックします。
  7. ターゲット スキーマとして Dates.xsd\dates を選択し、[完了] をクリックします。
  8. デザイン ビューに、nonRepeatToRepeat.xq ファイルが作成され、表示されます。
  9. 以下のソース要素とターゲット要素の間のリンクを作成します。
    [ソース] ペイン
    [対象] ペイン
    pODate1/billing-date
    dates/date
    pODate1/delivery-date
    dates/date
  10. 以下のコード リストに、生成された XQuery コードを示します。

    コード リスト 3-3 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 コードを追加します。

  11. デザイン ビューに切り替えます。
  12. pODate1/billing-date ソース要素と [対象] ペインの dates/value ターゲット要素の間のリンクを作成します。
  13. 次の図のように、2 つのデータ リンクが作成されます。

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


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

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

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

  14. pODate1/billing-date ソース要素と dates/type ターゲット要素の間のリンクを作成します。
  15. 2 つのデータ リンクが作成されます。

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

  16. [対象の式] ビューを選択します。
  17. [If Then Else] オプションを選択します。
  18. 以下の XQuery if-then-else 式がリンクに追加されます。

    if (fn:boolean("true")) then
    
        data($PODate)
    
    else
    
        ()
  19. この手順では、if-then-else 式の if セクションの条件を追加します。
    1. [式の構造] 領域で [If 条件] を選択します。
    2. [編集 : If 条件] ペインが表示されます。

    3. [式の関数] ビューで、[ノード関数] を展開します。
    4. local-name 関数を、[編集 : If 条件] ペインの [左辺の式] 領域にドラッグします。 関数の $node-var 引数を選択したままにしておきます。
    5. [式の変数] ビューを選択します。
    6. PODate 構造リンク変数を、[編集 : If 条件] ペインの [左辺の式] 領域の local-name 関数の $node-var 引数にドラッグします。
    7. = 演算子を選択します。
    8. [編集 : If 条件] ペインの [右辺の式] 領域で、(引用符も含めて)「"billing-date"」と入力し、[追加] をクリックします。
    9. if-then-else 式の if セクションに、以下の条件が追加されます。

      fn:local-name($PODate)="billing-date"
      
  20. [式の構造] 領域で [Then 式] を選択します。
  21. [編集 : Then 式] ペインが表示されます。

  22. 既存のテキストを (引用符も含めて) "BILLING" で置き換え、[適用] アイコンをクリックします。
  23. [式の構造] 領域で [Else 式] を選択します。
  24. [編集 : Else 式] ペインが表示されます。

  25. 既存のテキストを (引用符も含めて) "DELIVERY" で置き換え、[適用] アイコンをクリックします。
  26. [式の構造] 領域で [If Then Else] を選択します。
  27. [式の構造] ペインに、以下の XQuery コードが表示されます。

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

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

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

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

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

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

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

  1. WorkSpace Studio を起動して、サンプル プロジェクトを開きます。
  2. XQuery Transformations フォルダを右クリックします。
  3. [新規XQuery トランスフォーメーション] を選択します。
  4. 親フォルダの名前を確認します。この例では、親フォルダは /XQuery Transformation/XQueryTransformations です。
  5. ファイル名として「ifthenelse」と入力し、[次へ] をクリックします。
  6. ソース型として Supplier.xsd\Supplier を選択し、[次へ] をクリックします。
  7. ターゲット型として PurchaseAgree.xsd\PurchaseOrder を選択し、[完了] をクリックします。
  8. ifThenElse.xq ファイルが作成されます。

  9. 以下のソース要素とターゲット要素の間のリンクを作成します。
    ソース要素
    ターゲット要素
    supplier1/products/product
    PurchaseOrder/products/product
    supplier1/products/product/price
    PurchaseOrder/products/product/price
  10. 次の図のようなリンクが表示されます。

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


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

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

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

  1. supplier1/products/product/price ソース要素と PurchaseOrder/products/product/price ターゲット要素の間のリンクを選択します。
  2. [対象の式] ビューを選択します。
  3. [If Then Else] の式タイプを選択します。
  4. [式の構造] ペインで、[If 条件] を選択します。
  5. [編集 : If 条件] ペインが表示されます。

  6. [ソース] ペインの supplier1\products\product\widgetID 要素をドラッグし、[左辺の式] ペインにドロップします。
  7. >= 演算子を選択します。
  8. [右辺の式] ペインで、(引用符も含めて)「"0"」と入力し、[追加] をクリックします。
  9. <= 演算子を選択します。
  10. [右辺の式] ペインで、「"200"」と入力します。
  11. [更新] ボタンの横の矢印をクリックし、[追加] を選択します。
  12. [式の構造] ペインで、[Then 式] を選択します。
  13. [編集 : Then 式] ペインが表示されます。

  14. [編集 : Then 式] ペインで、既存のデータを削除し、「"$10.00"」と入力します。
  15. [適用] アイコンをクリックします。
  16. [式の構造] ペインで、[If Then Else] を選択します。
  17. 以下のコード リストに示すような if-then 式が表示されます。

    コード リスト 3-4 If-Then 式
    if ((xs:string(data($product/ns0:widgetId)) >= "0"
      and xs:string(data($product/ns0:widgetId)) <= "200")) then
      "$10.00"
    else
      ()

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

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

  1. [式の構造] ペインで、[Else 式] を右クリックし、[ネストされた If-Then-Else を挿入] を選択します。
  2. ネストされた [If-Then-Else] 式で、[If 条件] を選択します。
  3. [ソース] ペインの widgetID 要素をドラッグし、[左辺の式] ペインにドロップします。
  4. >= 演算子を選択します。
  5. [右辺の式] ペインで、(引用符も含めて)「"201"」と入力し、[追加] をクリックします。
  6. <= 演算子を選択します。
  7. [右辺の式] ペインで、「"400"」と入力します。
  8. [更新] ボタンの横の矢印をクリックし、[追加] を選択します。
  9. [式の構造] ペインで、[Then 式] を選択します。
  10. [編集 : Then 式] ペインで、「"$20.00"」と入力します。
  11. [適用] アイコンをクリックします。
  12. [式の構造] ペインで、[If Then Else] を選択します。
  13. 以下のコード リストに示すような if-then-else 式が表示されます。

    コード リスト 3-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
          ()

手順 4. 2 つ目のネストされた If-Then-Else 条件の作成

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

  1. [式の構造] ペインで、ネストされた if-then-else 式の Else 句を選択します。この句は、「手順 3. 最初のネストされた If-Then-Else 条件の作成」で作成されています。
  2. 右クリックし、[ネストされた If-Then-Else の挿入] を選択します。
  3. 作成したばかりのネストされた if-then-else 式の If 条件を選択します。
  4. [ソース] ペインの widgetID をドラッグし、[左辺の式] ペインにドロップします。
  5. >= 演算子を選択します。
  6. [右辺の式] ペインで、「"401"」と入力し、[追加] をクリックします。
  7. <= 演算子を選択します。
  8. [右辺の式] ペインで、「"600"」と入力し、[追加] をクリックします。
  9. [式の構造] ペインで、[Then 式] を選択します。
  10. [編集 : Then 式] ペインで、「"$30.00"」と入力し、[適用] アイコンをクリックします。
  11. [式の構造] ペインで、[If Then Else] を選択します。
  12. 以下のコード リストに示すようなネストされた if-then-else 式が表示されます。

    コード リスト 3-6 ネストされた 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 ファイルのテストについては、「データ トランスフォーメーションのテスト」を参照してください。

FLWOR 式の作成

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

  1. XQuery ファイルを作成します。
    1. WorkSpace Studio を起動して、サンプル プロジェクトを開きます。
    2. XQuery Transformations フォルダを右クリックします。
    3. [新規XQuery トランスフォーメーション] を選択します。
    4. 親フォルダの名前を確認します。
    5. ファイル名として「flwor」と入力し、[次へ] をクリックします。
    6. ソース型として Quote.xsd\quote を選択し、[次へ] をクリックします。
    7. ターゲット型として Quote.xsd\quote を選択し、[完了] をクリックします。
    8. 次の図のように、flwor.xq ファイルが作成され、表示されます。

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


      XQuery サンプル - FLWOR 式

  2. FLWOR 式を作成します。
    1. 対象ペインの quote\quoteResponse 反復要素をクリックします。
    2. [対象の式] ビューで、[For...Return] オプションを選択します。
    3. ビューが次の図のように変わります。

      図 3-17 FLWOR 式


      FLWOR 式

    4. [式の構造] ペインで、[For 句] を選択します。
    5. [編集 : For 句] ペインが表示されます。

    6. [変数] フィールドで、既存の値を quote で置き換えます。
    7. [式の変数] ビューで、quote1 ノードを展開します。
    8. [式の変数] ビューの quote1/quoteresponse をドラッグし、[単一式] フィールドにドロップします。
    9. [更新] をクリックします。
  3. Let 句をデザインします。
  4. 注意 : この例では、let 句は必須ではありません。 ここでは XQuery Mapper でのデザイン方法を示すためにのみ使用しています。
    1. [式の構造] ペインで、[Let 句] を選択します。
    2. [編集 : Let 句] ペインが表示されます。

    3. [変数] フィールドで、既存の値を widget で置き換えます。
    4. [式の変数] ビューを選択します。
    5. 構造的なリンク フォルダで、quote ノードを展開します。
    6. [式の変数] ビューの quote/widgetID をドラッグし、[単一式] フィールドにドロップします。
    7. [更新] をクリックします。
  5. Where 句をデザインします。
    1. [式の構造] ペインで、[For...Return] を右クリックし、[Where 句を挿入] を選択します。
    2. [Where 句] を選択します。
    3. [編集 :Where 条件] ペインが表示されます。

    4. [式の変数] ビューの構造的なリンク フォルダの quote/totalCost をドラッグし、[左辺の式] フィールドにドロップします。
    5. > 演算子を選択します。
    6. [右辺の式] 領域に、「2000」と入力します。
    7. [追加] をクリックします。
  6. Order By 句をデザインします。
    1. [式の構造] ペインで、[For...Return] を右クリックし、[Order By 句を挿入] を選択します。
    2. [Order By 句] を選択します。
    3. [編集 :Order By 句] ペインが表示されます。

    4. [Sort Order] フィールドで、[ascending] を選択します。
    5. [単一式] フィールドで、「$widget」と入力します。これは、let 句で宣言された変数の名前です。
    6. [更新] をクリックします。
  7. Return 式をデザインします。
    1. [式の構造] ペインで、[Return 式] を選択します。
    2. [式の変数] ビューで、構造的なリンク フォルダを展開します。
    3. [式の変数] ビューの quote をドラッグし、[単一式] フィールドにドロップします。
    4. [適用] アイコンをクリックします。
  8. 変更を保存します。

[式の構造] ペインで [For...Return] を選択すると、FLWOR 式のソース コードを表示できます。以下のコード リストに示すようなコードが作成されます。

コード リスト 3-7 FLWOR 式のコード
for $quote in ($quote1/quoteResponse)
let $widget := ($quote/widgetId)
where $quote/totalCost > 2000
order by $widget ascending
return
	$quote

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

再帰的なスキーマの使用

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

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

コード リスト 3-8 再帰的なスキーマの例
<?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. WorkSpace Studio を起動して、サンプル プロジェクトを開きます。
  2. XQuery Transformations フォルダを右クリックします。
  3. [新規XQuery トランスフォーメーション] を選択します。
  4. 親フォルダの名前を確認します。この例では、親フォルダは /XQuery Transformation/XQueryTransformations です。
  5. ファイル名として「recursive」と入力し、[次へ] をクリックします。
  6. ソース スキーマとして SupplierAcme.xsd\supplier_acme を選択し、[次へ] をクリックします。
  7. ターゲット スキーマとして Product.xsd\product を選択し、[完了] をクリックします。
  8. recursive.xq ファイルが作成されます。

  9. 以下のソース要素とターゲット要素の間のリンクを作成します。
    ソース要素
    ターゲット要素
    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 ターゲット要素の間のリンクを示します。

図 3-18 再帰的な要素のマッピング

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

  1. 変更を保存します。

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

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

[キー フィールドによるグループ] 機能を使用して、1 つまたは複数のキー値に基づいてデータをグループ化できます。

注意 : Group-By 機能は XQuery Mapper ではグラフィカルにサポートされておらず、デザイン ビューには XQuery の表現はありません。 ソース ビューで Group-By 式を記述する必要があります。

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

コード リスト 3-9 入力 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-10 に示すように、出力ドキュメントの Warehouse1 キーと Location1 キーを使用して、ライン アイテムの最初のインスタンスと 3 つ目のインスタンスをグループ化する XQuery を作成します。

コード リスト 3-10 出力 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. WorkSpace Studio を起動して、サンプル プロジェクトを開きます。
  2. XQuery Transformations フォルダを右クリックします。
  3. [新規XQuery トランスフォーメーション] を選択します。
  4. 親フォルダの名前を確認します。この例では、親フォルダは /XQuery Transformation/XQueryTransformations です。
  5. ファイル名として「groupby」と入力し、[次へ] をクリックします。
  6. ソース スキーマとして regroupKeyFldIn.xsd\input-warehouse-inventory を選択し、[次へ] をクリックします。
  7. ターゲット スキーマとして regroupKeyFldOut.xsd\output-inventory を選択し、[完了] をクリックします。
  8. groupby.xq ファイルが作成されます。

  9. ソース ビューを選択します。
  10. 以下のコード リストのコードを使用して、既存のコードを置き換えます。
  11. コード リスト 3-11 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)
  12. 変更を保存します。
  13. 変更内容はデザイン ビューには表示されません。

  14. ソース ビューで groupby.xq ファイルを開いた状態で、テスト ビューを選択します。
  15. [ソース データ] ペインで、[インポート] アイコンをクリックします。
  16. (XML Transformation/XML/ フォルダから) サンプル プロジェクトで提供されている Regrouping.xml ファイルをインポートします。
  17. [結果データ] ペインで、[XQuery のテスト] アイコンを選択します。
  18. コード リスト 3-10 に示すように、XQuery の結果が表示されます。


  ページの先頭       前  次