![]() ![]() ![]() ![]() |
この節は省略可能です。ここでは、以下のトピックに関する概念について詳細に説明します。
「手順 3 : 要素および属性のマッピング」のクエリの構築で発生するトランスフォーメーションを次の図に示します。
「要素の複数の属性を 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 データを実行したときに発生するトランスフォーメーションについて説明します。
<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
です。このネームスペース宣言は、前のリストでは太字で強調表示されています。
<name>{data($priceQuoteDoc/ns0:customerName)}</name>
クエリのこの行で、priceQuote
要素の customerName
要素が、quote
要素の name
要素に変換されます。
以下の手順では、XQuery コードのこの行で発生するトランスフォーメーションについて説明します。
<name>
タグと </name>
タグは、XML 出力に直接変換します。 {}
の間の文字は、XQuery エンジンによって特殊な方法で解釈されます。つまり、中括弧で囲まれた文字は、XML には直接変換されません。具体的には、この例で、中括弧で囲まれた data メソッドは、XQuery 言語の data
関数を実行する必要があることを指定しています。
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>
concat($priceQuote1/ns1:shipAddress/@street ,",",
$priceQuote1/ns1:shipAddress/@city ,",",
fn:upper-case($priceQuote1/ns1:shipAddress/@state) ,",",
$priceQuote1/ns1:shipAddress/@zip)
以下の手順では、XQuery コードのこの行で発生するトランスフォーメーションについて説明します。
<address>
タグと </address>
タグは、XML 出力に直接変換します。{}
の間の文字は、XQuery エンジンによって特殊な方法で解釈されます。 つまり、中括弧で囲まれた文字は、XML には直接変換されません。具体的には、この例で、中括弧で囲まれた data メソッドは、XQuery 言語の data
関数を実行する必要があることを指定しています。concat
関数は、そのすべての引数の値を取得し、それらの値を連結して、1 つの文字列として返します。この例の場合、concat
関数は、すべての XPath 式の値を取得し、1 つの住所の文字列に連結します。また、この concat
関数のすべての引数が、表 6-1 に示すように、指定された属性の値を返す XPath 式です。
concat
関数から返される文字列は、次に示すように、XML データの次の行の <address>
タグと </address>
タグとの間に配置されます。
<address>12 Springs RdMorris Plainsnj07960</address>
</ns2:quote>
次に示すように、このクエリの最後の行が XML 出力の最後の行になります。
</quot:quote>
結果の address
要素には、street、city、state、zip code の各フィールドの間に区切り文字がないため、住所がわかりにくくなることがあります。このクエリに区切り文字を追加する手順については、このチュートリアルの主節にある「簡単なクエリを編集して再テストするには」を参照してください。
繰り返しノードとは、この 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>
</priceRequests>
<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>
</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
を繰り返し要素として定義しています。
![]() ![]() ![]() |