ドラッグ・アンド・ドロップを使用してxsl:for-each文を追加するには:
-
「コンポーネント」ウィンドウで、「XSLT要素」ページを選択します。
-
「フロー制御」セクションを開きます。セクションを開くには、「フロー制御」の隣にあるプラス記号(+)をクリックします。
-
緑色のハイライト表示が表示されるまで「for-each」アイコンをターゲット・ノードの右側にドラッグします(図41-21を参照)。
-
緑色のハイライト表示が表示されている間に「for-each」アイコンをドロップします。
xsl:for-each
ノードが、ターゲット・ノードの親ノードとして追加されます。 -
ソース・ノードセットがループ処理するように設定するには、ソース・ノードを
xsl:for-each
文にドラッグ・アンド・ドロップします(図41-20を参照)。
ソース・ビューで表示すると、xsl:for-each文は次のようになります。
<ShippedItems> <xsl:for-each select="/ns0:PurchaseOrder/Items/HighPriorityItems/Item"> <Item/> </xsl:for-each> </ShippedItems>
xsl:for-each文内で作成されたItemノードが、空のノードであることに注意してください。ターゲットのItemノードの下に要素をマッピングして、値を設定できます。
たとえば、図41-22に示すように、QtyをQuantityにドラッグ・アンド・ドロップすると、Qty要素の値が出力のQuantity要素にコピーされます。
次の例は、作成されたコードをソース・ビューで示しています。さらに、ソース・ドキュメントおよび出力ドキュメントのスニペットのサンプルも示しています。
<ShippedItems> <xsl:for-each select="/ns0:PurchaseOrder/Items/HighPriorityItems/Item"> <Item> <Quantity> <xsl:value-of select="Qty"/> </Quantity> </Item> </xsl:for-each> </ShippedItems>
ソース・ドキュメントのサンプル値の一部を次のスニペットに示します。
<HighPriorityItems> <Item PartNum="000-AA"> <Qty>20</Qty> </Item> <Item PartNum="000-AB"> <Qty>24</Qty> </Item> </HighPriorityItems>
前述のソース・ドキュメントに対応する出力値を次のスニペットに示します。
<ShippedItems> <Item> <Quantity>20</Quantity> </Item> <Item> <Quantity>24</Quantity> </Item> </ShippedItems>
xsl:for-each
文で、XPath式は通常、xsl:for-each
文で選択したノードに対して相対的なものです。たとえば、前の例で、Qty
は現在のItemノード/ns0:PurchaseOrder/Items/HighPriorityItems/Item:
に対して相対的なものです。
<xsl:for-each select="/ns0:PurchaseOrder/Items/HighPriorityItems/Item"> <Item> <Quantity> <xsl:value-of select="Qty"/> </Quantity> </Item> </xsl:for-each>
xsl:for-each文で絶対パスを使用すると意図しない結果が発生する可能性があります。たとえば、前の例で、相対パスのかわりに絶対パスを使用した場合、コードは次のようになります。
<ShippedItems> <xsl:for-each select="/ns0:PurchaseOrder/Items/HighPriorityItems/Item"> <Item> <Quantity> <xsl:value-of select="/ns0:PurchaseOrder/Items/HighPriorityItems/Item/Qty"/> </Quantity> </Item> </xsl:for-each> </ShippedItems>
この結果として生成される出力ドキュメントは次のようになります。
<ShippedItems> <Item> <Quantity>20</Quantity> </Item> <Item> <Quantity>20</Quantity> <!-- repeating incorrect value! --> </Item> </ShippedItems>
絶対パスは、Item
ノードセット内で最初のQty
要素を常に選択するため、出力の各Item
要素に繰返し値が配置されることがわかります。
XSLTマップ・エディタは、可能な場合は、for-each文の下にノードをマッピングする際に相対パスを作成します。xsl:for-each
文は、for-eachの下に表示されるノードをマッピングする前に作成することをお薦めします。for-eachを追加する前にQuantity
などのノードをマッピングすると、エディタによって警告が表示され、そのfor-eachに対してノードセットをマッピングするときに、絶対XPath式から相対パス式へのリファクタが試みられます。
ノート:
-
自動マップを実行すると、必要に応じて
xsl:for-each
文が自動的に挿入されます。 -
設計には無限ループが含まれていないことが必要です。無限ループがあると、アプリケーションのデプロイメントおよび起動時に、次のようなエラーが表示されます。
ORAMED-04001: . . . oracle.tip.mediator.service.BaseActionHandler requestProcess SEVERE: failed reference BPELProcess1.bpelprocess1_client operation = process