チュートリアル : 初めてのデータ トランスフォーメーション構築

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

概念について

この節は省略可能です。ここでは、以下のトピックに関する概念について詳細に説明します。

 


トランスフォーメーションについて

手順 3 : 要素および属性のマッピング」のクエリの構築で発生するトランスフォーメーションを次の図に示します。

図 6-1 要素および属性のマッピング

要素および属性のマッピング

要素の複数の属性を 1 つの要素にマップするには」で生成されるクエリを以下に示します。

1. (:: pragma bea:dtfFile-class type="requestquote.MyTutorialJoin" ::)
2. declare namespace xf = "http://tempuri.org/Tutorial_Process_Application_Web/src/requestquote/myJoin/";
3. declare namespace ns0 = "http://www.example.org/price";
4. declare namespace ns1 = "http://www.example.org/avail";
5. declare namespace ns2 = "http://www.example.org/quote";
6. declare function xf:myJoin($priceQuote1 as element(ns0:priceQuote),
7. $availQuote1 as element(ns1:availQuote),
8. $taxRate as xs:float)
9. as element(ns2:quote) {
10. <ns2:quote>
11. <name>{ data($priceQuote1/ns0:customerName) }</name>
12. <address>{ concat($priceQuote1/ns0:shipAddress/@street , $priceQuote1/ns0:shipAddress/@city , $priceQuote1/ns0:shipAddress/@state , $priceQuote1/ns0:shipAddress/@zip) }</address>
13. </ns2:quote>
14. };
15. declare variable $priceQuote1 as element(ns0:priceQuote) external;
16. declare variable $availQuote1 as element(ns1:availQuote) external;
17. declare variable $taxRate as xs:float external;
18. xf:myJoin($priceQuote1,$availQuote1,$taxRate)
注意 : 行番号は、参照用に付けられています。

このクエリの 2 番目の行は、XQuery 関数のネームスペースを表しています。ネームスペース宣言はクエリ プロローグの一部です。ソースおよび対象の XML スキーマの各ネームスペースに対して、マッパーでネームスペース宣言が生成されます。たとえば、PriceQuote.xsd ファイルの XML スキーマに定義されている名前空間 URI (http://www.example.org/price) に対して、ネームスペース宣言 ns0 が生成されます。ネームスペースは、XML スキーマの要素を別の XML スキーマの要素と一意に識別するために使用されます。

以下の手順では、前に示したクエリに対してソース XML データを実行したときに発生するトランスフォーメーションについて説明します。

  1. クエリの 10 番目の行を次に示します。
  2. <ns2:quote>

    次に示すように、クエリのこの行が XML 出力の最初の行になります。

    <quot:quote xmlns:quot="http://www.example.org/quote">

    トランスフォーメーションの実行中に、quote 要素のネームスペース プレフィックスが変わります。このクエリで、http://www.example.org/quote ネームスペース URI に関連付けられているネームスペース プレフィックスは ns2 です。一方、結果の XML データでは、data, the namespace prefix generated for the http://www.example.org/quote ネームスペース URI に対して生成されたネームスペース プレフィックスは quot です。このネームスペース宣言は、前のリストでは太字で強調表示されています。

  3. クエリの 11 番目の行を次に示します。
  4. <name>{data($priceQuoteDoc/ns0:customerName)}</name>

    クエリのこの行で、priceQuote 要素の customerName 要素が、quote 要素の name 要素に変換されます。

    以下の手順では、XQuery コードのこの行で発生するトランスフォーメーションについて説明します。

    1. <name> タグと </name> タグは、XML 出力に直接変換します。
    2. 中括弧 {} の間の文字は、XQuery エンジンによって特殊な方法で解釈されます。つまり、中括弧で囲まれた文字は、XML には直接変換されません。具体的には、この例で、中括弧で囲まれた data メソッドは、XQuery 言語の data 関数を実行する必要があることを指定しています。
    3. data 関数は、渡された XML ノードの値を返します。この例の場合、data 関数の引数は、XPath 式 $priceQuoteDoc/ns0:customerName です。$priceQuoteDoc 変数には、下位要素を含めた priceQuote 要素の内容が含まれています。この XPath 式は priceQuote 要素の customerName ノードを返します。/ XPath 演算子は、親ノードと子ノードを区切ります。

      XQuery data 関数は、customerName ノードを取得し、そのノードの値として文字列 Acme Inc を返します。この文字列は、次に示すように、出力 XML データの次の行の <name> タグと </name> タグの間に配置されます。

      <name>Acme Inc</name>
  5. クエリの 12 番目の行を次に示します。

<address>

{

concat($priceQuote1/ns1:shipAddress/@street ,",",

$priceQuote1/ns1:shipAddress/@city ,",",

fn:upper-case($priceQuote1/ns1:shipAddress/@state) ,",",

$priceQuote1/ns1:shipAddress/@zip)

}

</address>

以下の手順では、XQuery コードのこの行で発生するトランスフォーメーションについて説明します。

    1. <address> タグと </address> タグは、XML 出力に直接変換します。
    2. 中括弧 {} の間の文字は、XQuery エンジンによって特殊な方法で解釈されます。 つまり、中括弧で囲まれた文字は、XML には直接変換されません。具体的には、この例で、中括弧で囲まれた data メソッドは、XQuery 言語の data 関数を実行する必要があることを指定しています。
    3. concat 関数は、そのすべての引数の値を取得し、それらの値を連結して、1 つの文字列として返します。この例の場合、concat 関数は、すべての XPath 式の値を取得し、1 つの住所の文字列に連結します。また、この concat 関数のすべての引数が、表 6-1 に示すように、指定された属性の値を返す XPath 式です。
    4. 表 6-1 引数 : XPath 式
      XPath 式
      返す値
      文字列
      $priceQuote1/ns0:sh
      ipAddress/@ns0:street
      shipAddress 要素の street 属性の値。
      12 Springs Rd
      $priceQuote1/ns0:shipAddress/@ns0:city
      shipAddress 要素の city 属性の値。
      Morris Plains
      $priceQuote1/ns0:shipAddress/@ns0:state
      shipAddress 要素の state 属性の値。
      nj
      $priceQuote1/ns0:shipAddress/@ns0:zip
      shipAddress 要素の zip 属性の値。
      07960

      concat 関数から返される文字列は、次に示すように、XML データの次の行の <address> タグと </address> タグとの間に配置されます。

      <address>12 Springs RdMorris Plainsnj07960</address>
  1. クエリの最後の行を次に示します。
  2. </ns2:quote>

    次に示すように、このクエリの最後の行が XML 出力の最後の行になります。

    </quot:quote>

結果の address 要素には、street、city、state、zip code の各フィールドの間に区切り文字がないため、住所がわかりにくくなることがあります。このクエリに区切り文字を追加する手順については、このチュートリアルの主節にある「簡単なクエリを編集して再テストするには」を参照してください。

 


XML の繰り返しノードについて

繰り返しノードとは、この XML ノードを複数インスタンス指定できることを表します。たとえば、次に示す XML データの場合、priceRequest ノードの 3 つのインスタンスがあります。

<?xml version="1.0"?>
<priceQuote xmlns="http://www.example.org/price">
<customerName>Acme Inc</customerName>
<shipAddress street="12 Springs Rd" city="Morris Plains" state="nj" zip="07960"/>
<priceRequests>
<priceRequest>
<widgetId>12</widgetId>
<price>1.00</price>
</priceRequest>
<priceRequest>
<widgetId>134</widgetId>
<price>34.10</price>
</priceRequest>
<priceRequest>
<widgetId>211</widgetId>
<price>10.00</price>
</priceRequest>
</priceRequests>
</priceQuote>

前の XML データの XML スキーマのセグメントを次に示します。

<?xml version="1.0"?>
<xsd:schema . . . >
. . .
<xsd:element name="widgetId" type="xsd:integer"/>
<xsd:element name="price" type="xsd:float"/>
<xsd:element name="priceRequest">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="pri:widgetId"/>
<xsd:element ref="pri:price"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="priceRequests">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="pri:priceRequest" minOccurs="1" maxOccurs="10"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
. . .
<xsd:element name="priceQuote">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="pri:customerName" minOccurs="1" maxOccurs="1"/>
<xsd:element ref="pri:shipAddress" minOccurs="1" maxOccurs="1"/>
<xsd:element ref="pri:priceRequests"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

priceRequest 要素の定義にある minOccurs="1" 設定と maxOccurs="10" 設定は (前のリストでは太字で強調表示)、priceRequest 要素のインスタンスが 1 個から最大 10 個まで存在できることを指定しています。この例では、priceQuote を繰り返し要素として定義しています。

XML スキーマ全体のリストを表示して PriceQuote.xsd ファイルを開くには
  1. [パッケージ・エクスプローラー] ペインで、Tutorial_Process_Application_Utility/schemas フォルダを展開します。
  2. PriceQuote.xsd をダブルクリックします。
  3. PriceQuote.xsd ファイルが表示されます。

  4. myJoin.xq ファイルのデザイン ビューに戻ります。
    1. [パッケージ・エクスプローラー] ペインで、Tutorial_Process_Application_Web\src\requestquote\myJoin.xq をダブルクリックします。
    2. [デザイン] タブを選択します。

  ページの先頭       前  次