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

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. 以下の表に示されたソース要素を選択し、[Target] ペインにドラッグします。
  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. 以下の図に示すように、[Design] タブに作成したマップが表示されます。
  13. 図 3-3 結合の例


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

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

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

制約を追加するには

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

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

    図 3-4 結合への制約的条件の追加


     
  6. 変更内容を保存します。
  7. [Source] タブをクリックして変更内容を確認します。
  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


     

    上のリンクの作成後に、[Design] タブに以下のマップが表示されます。

    図 3-5 quoteResponse 要素へのデータの入力


     

手順 4. 総費用額の計算

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

総費用額を計算するには

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

コードリスト 3-1 calculateTotalPrice 関数

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


     

    図 3-6 totalCost 要素の一般式


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

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

    図 3-7 デザイン ビューでの 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. 以下の表に示されたソース要素を選択し、[Target] ペインにドラッグします。

  12.  

    ソース要素

    リンクの種類

    対象要素

    purchase-order\line-items\line-item


     

    order\items\item

    purchase-order1\line-items\line-item


     

    order\items\item


     

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

    図 3-8 和集合の作成


     
  13. 作業を続行する前に、$purchase-order/line-items/line-item ([Source] ペインの反復する要素) と order/items/item ([Target] ペインの反復する要素) の間のリンクが選択されていることを確認してください。
  14. [制約の種類] ペインで、[和集合] を選択します。
  15. 2 つの構造リンクには和集合の制約が適用されているため、図 3-9 で示されているように、下位要素の 2 番目のセット間に暗黙的なデータ リンクが生成されます。

    以下の図に示されているように、灰色の実線は [制約] タブの [和集合] を選択して作成された暗黙的なリンクを表します。

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


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

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. [Source] ペインから反復する要素 (dates/date) を選択し、[Target] ペインにある最初の単一の要素 (PODate/billing-date) にドラッグします。
  12. このリンクを選択したままにして、次の手順に進みます。

  13. [制約] タブを選択します。
  14. [Source] ペインから 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. [Source] ペインから dates/date/value 要素を選択し、[Target] ペインにある PODate/billing-date 要素にドラッグします。
  21. データ リンクが作成されます。

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

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

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

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

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

  30. [Source] ペインから dates/date/value 要素を選択し、[Target] ペインにある 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. 以下の表に示されているソース要素を選択します。選択したソース要素を [Source] ペインから [Target] ペインにドラッグします。
  12. [Source] ペイン

    リンクの種類

    [Target] ペイン

    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. [Source] ペインから pODate/billing-date 要素を選択し、[Target] ペインにある 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. [Source] ペインから pODate/billing-date 要素を選択し、[Target] ペインにある 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 関数Node Functions] を展開します。
    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 条件


       
  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 サンプルの結果の表示


     
  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. 以下の要素を [Source] ペインから [Target] ペインにドラッグします。
  12. [Source] ペイン

    リンクの種類

    [Target] ペイン

    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. [Source] ペインから、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 式の構造


     

手順 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. [Source] ペインから、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 式の構造


     

手順 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. [Source] ペインから、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 式


     

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. 以下の表に示されているソース要素を選択します。選択したソース要素を [Source] ペインから [Target] ペインにドラッグします。
  12. [Source] ペイン

    リンクの種類

    [Target] ペイン

    supplier-acme\part-description-00100


     

    product\part-description

    supplier-acme\part-description-00101


     

    product\child-produc\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. [Source] タブをクリックします。
  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 ファイルをソース ビューで開いた状態で、[Test] タブをクリックします。
  2. [ソース データ] タブで [インポート] をクリックします。
  3. サンプル プロジェクトに含まれる Regrouping.xml ファイルをインポートします (Samples/XML/Regrouping.xml)。

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

 


XQuery ファイルのテスト

[Design] タブで作成した XQuery トランスフォーメーションは、[Test] タブを使用してテストできます。XQuery トランスフォーメーションをテストすると、予期される XML 出力または非 XML 出力が適切に生成されたかどうかを確認できます。自動生成された XML ファイル、またはカスタムの XML および非 XML テスト ファイルを使用できます。XQuery のテストの詳細については、「マップ トランスフォーメーションのテスト」を参照してください。

この節では、以下のトピックを取り上げます。

自動生成された XML ファイルを使用したテスト

XQuery Mapper では、テストに使用できる XML ファイルが自動的に生成されます。非 XML のテスト ファイルは、自動的に生成されません。詳細については、「カスタム MFL (非 XML) ファイルを使用したテスト」を参照してください。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

ページの先頭 前 次