ドラッグ・アンド・ドロップを使用してxsl:for-each文を追加するには:

  1. 「コンポーネント」ウィンドウで、「XSLT要素」ページを選択します。

  2. 「フロー制御」セクションを開きます。セクションを開くには、「フロー制御」の隣にあるプラス記号(+)をクリックします。

  3. 緑色のハイライト表示が表示されるまで「for-each」アイコンをターゲット・ノードの右側にドラッグします(図41-21を参照)。

    図41-21 ターゲット・ノードへの「for-each」アイコンのドラッグ

    図41-21の説明が続きます
    「図41-21 ターゲット・ノードへの「for-each」アイコンのドラッグ」の説明
  4. 緑色のハイライト表示が表示されている間に「for-each」アイコンをドロップします。xsl:for-eachノードが、ターゲット・ノードの親ノードとして追加されます。

  5. ソース・ノードセットがループ処理するように設定するには、ソース・ノードを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要素にコピーされます。

図41-22 QuantityへのQtyのマッピング

図41-22の説明が続きます
「図41-22 QuantityへのQtyのマッピング」の説明

次の例は、作成されたコードをソース・ビューで示しています。さらに、ソース・ドキュメントおよび出力ドキュメントのスニペットのサンプルも示しています。

<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