この章では、XQuery Mapperでデータ・トランスフォーメーションを実行するためのチュートリアルを示します。
ここで説明している例は、プロジェクトに含まれているサンプル・プロジェクトに基づいています。サンプル・プロジェクトを開くための詳細は、6.2項「XQuery Mapperサンプル・プロジェクトのインポート」を参照してください。
次のシナリオの例が用意されています。
次の図のように、XQuery Mapperを使用して、2つの異なるスキーマのコンテンツを結合できます。
この例では、(CustInfo.xsdで有効な)顧客データが(PO.xsdで有効な)反復する要素line-items
と結合されて、POCustInfo.xsdスキーマに対して有効な単一のXMLドキュメントになります。
Eclipseを起動して、サンプル・プロジェクトを開きます。
Eclipseの起動の詳細は、6.1項「XQuery Mapperの起動」を参照してください。
サンプル・プロジェクトを開くための詳細は、6.2項「XQuery Mapperサンプル・プロジェクトのインポート」を参照してください。
[ XQuery Transformations ]フォルダを右クリックします。
「New」→「XQuery Transformation」を選択します。
親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。
ファイル名として「combineData」と入力し、「Next」をクリックします。
次のソース要素を選択し、「Next」をクリックします。
CustInfo.xsd\customer
PO.xsd\purchase-order
ターゲット要素としてPOCustInfo.xsd\purchase-order
を選択し、「Finish」をクリックします。
/XQuery Transformation/XQueryTransformationsフォルダに、combineData.xqファイルが作成されます。
次の図のように、選択したソースとターゲットの要素が「Design」ビューに表示されます。
「Source」ペインの要素を「Target」ペインにドラッグして、次のソース要素とターゲット要素の間のリンクを作成します。
ソース要素 | リンクのイメージ | ターゲット要素 |
---|---|---|
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 |
注意: 破線は 構造的な リンクを表します。このリンクは、データを直接マップせず、親構造間に作成されます。 実線は データ リンクを表します。このリンクは、ソース・ノードの値をターゲット・ノードの値に直接変換します。 詳細は、6.10項「「Design」ビューのグラフィカルな機能」を参照してください。 |
ソース要素とターゲット要素の間のリンクが、次の図のように示されます。
変更を保存します。
XQueryトランスフォーメーションのテストの詳細は、6.9項「データ・トランスフォーメーションのテスト」を参照してください。
異なるスキーマ(この例では、PriceQuote.xsd、AvailableQuote.xsd、およびtaxrate.xsd)に対して有効なXMLファイルのデータを結合し、単一のスキーマQuote.xsdに対して有効なファイルを作成します。
この例では、次の手順を示します。
この手順では、AvailQuote.xsd、PriceQuote.xsdおよびtaxrate.xsdスキーマを使用して、XQueryトランスフォーメーションを作成します。その後、複数のpriceQuote
およびavailRequest
ソース要素を対応するターゲット要素にマップします。
Eclipseを起動して、サンプル・プロジェクトを開きます。
Eclipseの起動の詳細は、6.1項「XQuery Mapperの起動」を参照してください。
サンプル・プロジェクトを開くための詳細は、6.2項「XQuery Mapperサンプル・プロジェクトのインポート」を参照してください。
「XQuery Transformations」フォルダを右クリックします。
「New」→「XQuery Transformation」を選択します。
親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。
ファイル名として「Join」と入力し、「Next」をクリックします。
次のソース要素を選択し、「Next」をクリックします。
PriceQuote.xsd\priceQuote
PriceQuote.xsd\taxRate
AvailQuote.xsd\availRequest
ターゲット要素としてQuote.xsd\quoteを選択し、「Finish」をクリックします。
XQueryTransformation/XQueryTransformationsフォルダにJoin.xqファイルが作成されます。
「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 |
次の図のようなリンクが表示されます。
変更を保存します。
priceQuote/priceRequests
およびavailRequest
ソース要素は、共通の要素widgetId
を共有しています。この手順では、availRequest
スキーマのwidgetId
がpriceQuote/priceRequests
要素のwidgetId
と等しい場合に、問合せがターゲット反復要素quoteResponse
を返す必要のある制限を追加します。
「Design」ビューでJoin.xqを開きます。
「Source」ペインのpriceQuote1/priceRequests/priceRequest/widgetId
要素をドラッグし、「Source」ペインのavailRequest1/widgetId
要素にドロップします。
次の図のように、 「Source」ペインの2つのwidgetId
ノードの間を結ぶ線が表示されます。
変更を保存します。
「Source」ビューで変更を確認します。
2つのwidgetId
ノードの間のリンクはforループのwhere句で表されます。where句は、where句がtrueの場合にのみforループで式の結果が返される必要があることを指定します。この例では、availRequest
要素のwidgetId
がpriceRequest
要素のwidgetId
と等しい場合にのみ、quoteResponse
要素で指定されたXMLデータが式によって返されます。
注意: [制約]ビューでwhere句を表示することもできます。 |
現在、quoteResponse
要素は空です。次の手順で要素のコンテンツを追加します。
この手順では、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 |
ソース要素とターゲット要素の間のリンクが、次の図のように示されます。
この手順では、見積りの合計値を計算する関数を追加します。
「Source」ビューでJoin.xqファイルを開きます。
ソース・コードのネームスペース宣言と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 };
「Design」ビューに切り替えます。
注意: Join.xqには2つの関数宣言calculateTotalPriceおよびJoinが含まれるようになります。XQueryファイルに複数の関数が含まれる場合は、XQファイルと同じ名前の関数が「Design」ビューに表示されます。この場合、Join関数が「Design」ビューに表示されます。 |
「Target」ペインで、totalCostノードを選択します。次の手順に向けて、このノードを選択したままにしておきます。
「Target Expression」ビューを選択し、「General」オプションを選択します。
「General Expression」ペインに次のコードを挿入します。
xf:calculateTotalPrice($taxRate1,$availRequest/ns1:requestedQuanity,$priceRequest/ns0:price)
「Apply」をクリックします。
式がXQueryのtotalCost要素に追加されます。
変更を保存します。
「Design」ビューにtotalCostターゲット要素の計算が表示されます。
「Constraints」ビューの「Where Clause」ペインを使用して制約を作成すると、XQueryで返されるターゲット反復要素を制限できます。実行時には、where句の条件を満たす反復要素のみがXQueryのforループで反復処理されます。
この手順では、forループのwhere句に別の条件を追加して(つまり、複合条件となる)、forループで返されるデータをさらに制限します。
join.xqファイルを開きます。
「Design」ビューで、availRequest1
ソース要素とquote\quoteResponse
ターゲット要素の間のリンクを選択します。
where句を構成する1つの条件が「Constraints」ビューの「Where Clause」ペインに表示されます。
data($priceRequest/ns0:widgetId) = data($availRequest/ns1:widgetId)
「Source」ペインのavailRequest1/requestedQuanity
要素をドラッグし、「Where Clause」ペインの「Left Hand Expression」領域にドロップします。
where句に、次の左辺の式が作成されます。
data($availRequest/ns1:requestedQuanity)
<演算子を選択します。
「Where Clause」ペインの「Right Hand Expression」領域にあるテキストを削除し、「"50"」と入力します。
注意: 引用符で囲まれた数字50を入力します(50ではなく、"50")。 |
「Join Type」フィールドから「AND」オプションを選択します。
「Join Type」は、where句を構成する条件が実行時に評価される方法を決定します。
「Add」をクリックします。forループのwhere句に、2つ目の条件が追加されます。
変更を保存します。
この手順により、次のwhere句の作成が完了します。
次の手順を実行して、where句の条件が両方とも満たされた場合にXQueryが動作することを確認します。
「Test」ビューに切り替えます。
「Test」ビューの「Source Data」ペインで、「Source Variable」フィールドのpriceQuote
を選択し、「Generate Data」アイコンをクリックします。
テストXMLデータのwidgetId
要素の値を書き留めておきます。
<ns0:widgetId>value</ns0:widgetId>
「Source Data」ペインで、「Source Variable」フィールドのavailRequest
を選択し、「Generate Data」アイコンをクリックします。
テストXMLデータpriceQuote
に表示された値と一致するように、テストXMLデータのwidgetId
要素の値を編集します。
<ns0:widgetId>value</ns0:widgetId>
requestedQuanity
要素を探し、50より小さい数に値を編集します。
例: <ns0:requestedQuanity>25</ns0:requestedQuanity>
「Result Data」ペインで、「Test XQuery」アイコンをクリックし、XQueryの結果を表示します。
この例では、「Constraints」ビューの「Union」オプションを使用して、同じ型のデータを大きなデータ・セットにマップするXQueryを作成します。
Eclipseを起動して、サンプル・プロジェクトを開きます。
Eclipseの起動の詳細は、6.1項「XQuery Mapperの起動」を参照してください。
サンプル・プロジェクトを開くための詳細は、6.2項「XQuery Mapperサンプル・プロジェクトのインポート」を参照してください。
「XQuery Transformations」フォルダを右クリックします。
「New」→「XQuery Transformation」を選択します。
親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。
ファイル名として「union」と入力し、「Next」をクリックします。
「Source Types」ダイアログ・ボックスで、PO.xsd\purchase-order
を2回選択し、「Next」をクリックします。
注意: 同じ要素を2回以上追加するには、パラメータ名を変更する必要があります。 |
ターゲット型としてOrder.xsd\order
を選択し、「Finish」をクリックします。
union.xqファイルが作成されます。
次のソース要素とターゲット要素の間のリンクを作成します。
ソース要素 | ターゲット要素 |
---|---|
purchase-order1\line-items\line-item |
order\items\item |
purchase-order2\line-items\line-item |
order\items\item |
「Design」ビューに、次のリンクが表示されます。
$purchase-order1/line-items/line-item
ソース要素とorder/items/item
ターゲット要素の間のリンクを選択します。
「Constraints」ビューの「Constraint Type」ペインで、「Union」を選択します。
次のソース要素とターゲット要素の間のリンクを作成します。
ソース要素 | ターゲット要素 |
---|---|
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」を選択して作成された暗黙的なリンクを示します。
変更を保存します。
XQueryトランスフォーメーションのテストの詳細は、6.9項「データ・トランスフォーメーションのテスト」を参照してください。
この例では、反復するソースXML要素を、反復しないターゲットXML要素にマップします。
次の図に、この例で作成したトランスフォーメーションを示します。
Eclipseを起動して、サンプル・プロジェクトを開きます。
Eclipseの起動の詳細は、6.1項「XQuery Mapperの起動」を参照してください。
サンプル・プロジェクトを開くための詳細は、6.2項「XQuery Mapperサンプル・プロジェクトのインポート」を参照してください。
「XQuery Transformations」フォルダを右クリックします。
「New」→「XQuery Transformation」を選択します。
親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformations
です。
ファイル名として「repeatToNonRepeat
」と入力し、「Next」をクリックします。
ソース・スキーマとしてDates.xsd\dates
を選択し、「Next」をクリックします。
ターゲット・スキーマとしてPODate.xsd\PODate
を選択し、「Finish」をクリックします。
次の図のように、 repeatToNonRepeat.xq ファイルが作成され、表示されます。
「Source」ペインのdates1/date
反復要素と「Target」ペインのPODate/billing-date
要素の間のリンクを作成します。
次の手順に向けて、このリンクを選択したままにしておきます。
「Constraints」ビューを選択します。
「Source」ペインのdates1/date/type
要素を「Constraints」ビューの「Where Clause」ペインの「Left Hand Expression」領域にドラッグします。
=演算子を選択します。
「Right Hand Expression」領域で、(引用符も含めて)「"BILLING"」と入力し、「Add」をクリックします。
「Source」ペインのdates1/date/value
要素と「Target」ペインのPODate/billing-date
要素の間のリンクを作成します。
前の手順で作成した制約により、XMLドキュメントのdates1/date/type
要素の値が値「"BILLING"」と比較するように指定されます。
実行時は、dates1/date/type
要素の値が「"BILLING"」である場合に、XQueryでdates1/date/value
の値がbilling-date
の値として返されます。
「Source」ペインのdates1/date
反復要素と「Target」ペインのPODate/delivery-date
要素の間のリンクを作成します。
次の手順に向けて、このリンクを選択したままにしておきます。
「Source」ペインのdates1/date/type
要素を「Constraints」ビューの「Where Clause」ペインの「Left Hand Expression」領域にドラッグします。
=演算子を選択します。
「Right Hand Expression」領域で、(引用符も含めて)「"DELIVERY"」と入力し、「Add」をクリックします。
「Source」ペインのdates1/date/value
反復要素と「Target」ペインのPODate/delivery-date
要素の間のリンクを作成します。
前の手順で作成した制約により、XMLドキュメントのdates1/date/type
要素の値が値「"DELIVERY"」と比較するように指定されます。
実行時は、dates1/date/type
要素の値が「"DELIVERY"」である場合に、XQueryでdates1/date/value
の値がdelivery-date
の値として返されます。
変更を保存します。
XQueryファイルのテストの詳細は、6.9項「データ・トランスフォーメーションのテスト」を参照してください。
この例では、反復しないソース要素を、反復するターゲット要素にマップします。
次の図に、この例で作成したトランスフォーメーションを示します。
Eclipseを起動して、サンプル・プロジェクトを開きます。
Eclipseの起動の詳細は、6.1項「XQuery Mapperの起動」を参照してください。
サンプル・プロジェクトを開くための詳細は、6.2項「XQuery Mapperサンプル・プロジェクトのインポート」を参照してください。
「XQuery Transformations」フォルダを右クリックします。
「New」→「XQuery Transformation」を選択します。
親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。
ファイル名として「nonRepeatToRepeat
」と入力し、「Next」をクリックします。
ソース・スキーマとしてPODate.xsd\PODate
を選択し、「Next」をクリックします。
ターゲット・スキーマとしてDates.xsd\dates
を選択し、「Finish」をクリックします。
「Design」ビューに、nonRepeatToRepeat.xqファイルが作成され、表示されます。
次のソース要素とターゲット要素の間のリンクを作成します。
ソース要素 | ターゲット要素 |
---|---|
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コードを追加します。
「Design」ビューに切り替えます。
pODate1/billing-date
ソース要素と「Target」ペインのdates/value
ターゲット要素の間のリンクを作成します。
次の図のように、2つのデータ・リンクが作成されます。
pODate1/billing-date
からdates/value
へのリンクを作成したときに、次の構造的なリンクが結合されています。
pODate1/billing-date
からdates/date
pODate1/delivery-date
からdates/date
pODate1/delivery-date
要素とdates/value
要素の間の2番目のデータ・リンクが自動的に作成されます。
pODate1/billing-date
ソース要素とdates/type
ターゲット要素の間のリンクを作成します。
2つのデータ・リンクが作成されます。
次の手順に向けて、pODate1/billing-date
からdates/type
へのリンクを選択したままにしておきます。
「Target Expression」ビューを選択します。
「If Then Else」オプションを選択します。
次のXQuery if-then-else式がリンクに追加されます。
if (fn:boolean("true")) then data($PODate) else ()
この手順では、if-then-else式のifセクションの条件を追加します。
「Expression Structure」領域で「If Condition」を選択します。
「Edit If Condition」ペインが表示されます。
「Expression Functions」ビューで、「Node Functions」を展開します。
local-name関数を、「Edit If Condition」ペインの「Left Hand Expression」領域にドラッグします。関数の$node-var引数を選択したままにしておきます。
「Expression Variables」ビューを選択します。
PODate
構造リンク変数を、「Edit If Condition」ペインの「Left Hand Expression」領域のlocal-name関数の$node-var引数にドラッグします。
=演算子を選択します。
「Edit If Condition」ペインの「Right Hand Expression」領域で、(引用符も含めて)「"billing-date"」と入力し、「Add」をクリックします。
if-then-else式のifセクションに、次の条件が追加されます。
fn:local-name($PODate)="billing-date"
「Expression Structure」領域で「Then Expression」を選択します。
「Edit Then Condition」ペインが表示されます。
既存のテキストを(引用符も含めて)「"BILLING"」で置き換え、「Apply」アイコンをクリックします。
「Expression Structure」領域で「Else Expression」を選択します。
「Edit Else Condition」ペインが表示されます。
既存のテキストを(引用符も含めて)「"DELIVERY"」で置き換え、「Apply」アイコンをクリックします。
「Expression Structure」領域で「If Then Else」を選択します。
「Expression Structure」ペインに、次のXQueryコードが表示されます。
if (fn:local-name($PODate) = "billing-date") then "BILLING" else "DELIVERY"
変更を保存します。
XQueryファイルのテストの詳細は、6.9項「データ・トランスフォーメーションのテスト」を参照してください。
この例では、ウィジェットIDと州税率に基づいて価格を計算するXQueryトランスフォーメーションを作成します。次のロジックを表すif-then-else式を作成します。
ウィジェットIDが0 - 200の場合は、価格が$10.00
ウィジェットIDが201 - 400の場合は、価格が$20.00
ウィジェットIDが401 - 600の場合は、価格が$30.00
この例では、次の手順を示します。
この手順では、 PurchaseAgree.xsd および Supplier.xsd スキーマを使用してXQueryトランスフォーメーションを作成します。
Eclipseを起動して、サンプル・プロジェクトを開きます。
Eclipseの起動の詳細は、6.1項「XQuery Mapperの起動」を参照してください。
サンプル・プロジェクトを開くための詳細は、6.2項「XQuery Mapperサンプル・プロジェクトのインポート」を参照してください。
「XQuery Transformations」フォルダを右クリックします。
「New」→「XQuery Transformation」を選択します。
親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。
ファイル名として「ifthenelse」と入力し、「Next」をクリックします。
ソース型としてSupplier.xsd\Supplier
を選択し、「Next」をクリックします。
ターゲット型としてPurchaseAgree.xsd\PurchaseOrder
を選択し、「Finish」をクリックします。
ifThenElse.xqファイルが作成されます。
次のソース要素とターゲット要素の間のリンクを作成します。
ソース要素 | ターゲット要素 |
---|---|
supplier1/products/product |
PurchaseOrder/products/product |
supplier1/products/product/price |
PurchaseOrder/products/product/price |
次の図のようなリンクが表示されます。
この手順では、ウィジェットIDが0 - 200の場合に価格を$10.00に指定するIf式を作成します。
supplier1/products/product/price
ソース要素とPurchaseOrder/products/product/price
ターゲット要素の間のリンクを選択します。
「Target Expression」ビューを選択します。
「If Then Else」の式タイプを選択します。
「Expression Structure」ペインで、「If Condition」を選択します。
「Edit If Condition」ペインが表示されます。
「Source」ペインのsupplier1\products\product\widgetID
要素をドラッグし、「Left Hand Expression」ペインにドロップします。
>=演算子を選択します。
「Right Hand Expression」ペインで、(引用符も含めて)「"0"」と入力し、「Add」をクリックします。
<=演算子を選択します。
「Right Hand Expression」ペインで、「"200"」と入力します。
「Update」ボタンの横の矢印をクリックし、「Add」を選択します。
「Expression Structure」ペインで、「Then Condition」を選択します。
「Edit Then Condition」ペインが表示されます。
「Edit Then Expression」ペインで、既存のデータを削除し、「"$10.00"」と入力します。
「Apply」アイコンをクリックします。
「Expression Structure」ペインで、「If Then Else」を選択します。
次のコード・リストに示すようなif-then式が表示されます。
この手順では、ウィジェットIDが201 - 400の場合に価格を$20.00にするネストされたIf式を作成します。このためには、前の手順で作成したElse式の内部にネストされたif-then-else式を挿入します。
「Expression Structure」ペインで、「Else Expression」を右クリックし、「Insert Nested If-Then-Else」を選択します。
ネストされた「If-Then-Else」式で、「If Condition」を選択します。
「Source」ペインのwidgetID
要素をドラッグし、「Left Hand Expression」ペインにドロップします。
>=演算子を選択します。
「Right Hand Expression」ペインで、(引用符も含めて)「"201"」と入力し、「Add」をクリックします。
<=演算子を選択します。
「Right Hand Expression」ペインで、「"400"」と入力します。
「Update」ボタンの横の矢印をクリックし、「Add」を選択します。
「Expression Structure」ペインで、「Then Expression」を選択します。
「Edit Then Expression」ペインで、「"$20.00"」と入力します。
「Apply」アイコンをクリックします。
「Expression Structure」ペインで、「If Then Else」を選択します。
次のコード・リストに示すようなif-then-else式が表示されます。
この手順では、ウィジェットIDが401 - 600の場合に価格を$30.00にするネストされたIf式を作成します。このためには、前の手順で作成したElse式の内部にネストされたif-then-else式を挿入します。
「Expression Structure」ペインで、ネストされたif-then-else式のElse句を選択します。この句は、7.6.3項「ステップ3.最初のネストされたIf-Then-Else条件の作成」で作成されています。
右クリックし、「Insert Nested If-Then-Else」を選択します。
作成したばかりのネストされたif-then-else式のIf条件を選択します。
「Source」ペインのwidgetID
をドラッグし、「Left Hand Expression」ペインにドロップします。
>=演算子を選択します。
「Right Hand Expression」ペインで、「"401"」と入力し、「Add」をクリックします。
<=演算子を選択します。
「Right Hand Expression」ペインで、「"600"」と入力し、「Add」をクリックします。
「Expression Structure」ペインで、「Then Expression」を選択します。
「Edit Then Expression」ペインで、「"$30.00"」と入力し、「Apply」アイコンをクリックします。
「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項「データ・トランスフォーメーションのテスト」を参照してください。
この例では、For-Let-Where-Order By-Return式を使用して、合計値が2000を超えるアイテムについて、見積りからウィジェットIDを抽出します。
XQueryファイルを作成します。
Eclipseを起動して、サンプル・プロジェクトを開きます。
Eclipseの起動の詳細は、6.1項「XQuery Mapperの起動」を参照してください。
サンプル・プロジェクトを開くための詳細は、6.2項「XQuery Mapperサンプル・プロジェクトのインポート」を参照してください。
「XQuery Transformations」フォルダを右クリックします。
「New」→「XQuery Transformation」を選択します。
親フォルダの名前を確認します。
ファイル名として「flwor」と入力し、「Next」をクリックします。
ソース型としてQuote.xsd\quote
を選択し、「Next」をクリックします。
ターゲット型としてQuote.xsd\quote
を選択し、「Finish」をクリックします。
次の図のように、 flwor.xq ファイルが作成されます。
Let句をデザインします。
注意: この例では、let句は必須ではありません。ここではXQuery Mapperでのデザイン方法を示すためにのみ使用しています。 |
「Expression Structure」ペインで、「Let Clause」を選択します。
「Edit Let Clause」ペインが表示されます。
「Variable」フィールドで、既存の値をwidget
で置き換えます。
「Expression Variables」ビューを選択します。
「Structural Link」フォルダで、quote
ノードを展開します。
「Expression Variables」ビューのquote/widgetID
をドラッグし、「Single Expression」フィールドにドロップします。
「Update」をクリックします。
Where句をデザインします。
「Expression Structure」ペインで、「For...Return」を右クリックし、「Insert Where Clause」を選択します。
「Where Clause」を選択します。
「Edit Where Condition」ペインが表示されます。
「Expression Variables」ビューの「Structural Link」フォルダのquote/totalCost
をドラッグし、「Left Hand Expression」フィールドにドロップします。
>演算子を選択します。
「Right Hand Expression」領域に、「2000」と入力します。
「Add」をクリックします。
Order By句をデザインします。
「Expression Structure」ペインで、「For...Return」を右クリックし、「Insert Order By Clause」を選択します。
「Order By Clause」を選択します。
「Edit Order By Clause」ペインが表示されます。
「Sort Order」フィールドで、「ascending」を選択します。
「Single Expression」フィールドで、「$widget」と入力します。これは、let句で宣言された変数の名前です。
「Update」をクリックします。
Return式をデザインします。
「Expression Structure」ペインで、「Return Expression」を選択します。
「Expression Variables」ビューで、「Structural Link」フォルダを展開します。
「Expression Variables」ビューのquote
をドラッグし、「Single Expression」フィールドにドロップします。
「Apply」アイコンをクリックします。
変更を保存します。
「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-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>
再帰的なスキーマを使用してトランスフォーメーションを作成するには、次の手順を実行します。
Eclipseを起動して、サンプル・プロジェクトを開きます。
Eclipseの起動の詳細は、6.1項「XQuery Mapperの起動」を参照してください。
サンプル・プロジェクトを開くための詳細は、6.2項「XQuery Mapperサンプル・プロジェクトのインポート」を参照してください。
「XQuery Transformations」フォルダを右クリックします。
「New」→「XQuery Transformation」を選択します。
親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。
ファイル名として「recursive」と入力し、「Next」をクリックします。
ソース・スキーマとしてSupplierAcme.xsd\supplier_acme
を選択し、「Next」をクリックします。
ターゲット・スキーマとしてProduct.xsd\product
を選択し、「Finish」をクリックします。
recursive.xqファイルが作成されます。
次のソース要素とターゲット要素の間のリンクを作成します。
ソース要素 | ターゲット要素 |
---|---|
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
ターゲット要素の間のリンクを示します。
変更を保存します。
XQueryファイルのテストの詳細は、6.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
要素の同じ値(それぞれWarehouse1
とLocation1
)が含まれます。
この例の目的は、明細の最初のインスタンスと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式を作成するには、次の手順を実行します。
Eclipseを起動して、サンプル・プロジェクトを開きます。
Eclipseの起動の詳細は、6.1項「XQuery Mapperの起動」を参照してください。
サンプル・プロジェクトを開くための詳細は、6.2項「XQuery Mapperサンプル・プロジェクトのインポート」を参照してください。
「XQuery Transformations」フォルダを右クリックします。
「New」→「XQuery Transformation」を選択します。
親フォルダの名前を確認します。この例では、親フォルダは/XQuery Transformation/XQueryTransformationsです。
ファイル名として「groupby」と入力し、「Next」をクリックします。
ソース・スキーマとしてregroupKeyFldIn.xsd\input-warehouse-inventory
を選択し、「Next」をクリックします。
ターゲット・スキーマとしてregroupKeyFldOut.xsd\output-inventory
を選択し、「Finish」をクリックします。
groupby.xqファイルが作成されます。
「Source」ビューを選択します。
次のコード・リストのコードを使用して、既存のコードを置き換えます。
例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)
変更を保存します。
変更内容は 「デザイン」 ビューには表示されません。
「Source」ビューでgroupby.xqファイルを開いた状態で、「Test」ビューを選択します。
「Source Data」ペインで、「Import」アイコンをクリックします。
( XML Transformation/XML/ フォルダから)サンプル・プロジェクトで提供されている Regrouping.xml ファイルをインポートします。
「Result Data」ペインで、「Test XQuery」アイコンを選択します。
例7-9に示すように、XQueryの結果が表示されます。