ヘッダーをスキップ
Oracle Fusion Middleware Oracle SOA Suite開発者ガイド
11g リリース1 (11.1.1.5.0)
B56238-04
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

37 XSLTマッパーを使用したトランスフォーメーションの作成

この章ではXSLTマッパーの使用方法を説明します。XSLTマッパーを使用すると、Oracle BPEL Process ManagerまたはOracle Mediatorでソース・スキーマ要素とターゲット・スキーマ要素の間のデータ・トランスフォーメーションを作成できます。バージョン1.0のXSLTがサポートされています。

項目は次のとおりです。

Oracle BPEL Process ManagerからXSLTマッパーを起動する方法は、第37.2.1項「Oracle BPEL Process ManagerでXSLマップ・ファイルを作成する方法」を参照してください。Oracle MediatorからXSLTマッパーを起動する方法は、第37.2.3項「Oracle MediatorでXSLマップ・ファイルを作成する方法」を参照してください。

37.1 XSLTマッパーの概要

マップ・ファイルの内容は、XSLTマッパーを使用して作成します。図37-1に、XSLTマッパーのレイアウトを示します。

図37-1 XSLTマッパーのレイアウト

図37-1の説明が続きます
「図37-1 XSLTマッパーのレイアウト」の説明

「ソース」および「ターゲット」スキーマはツリーとして表され、ツリー内のノードは様々なアイコンを使用して表されます。表示されているアイコンは、スキーマまたはノードのプロパティを示します。例:

要素または属性を選択すると、要素および属性の様々なプロパティ(タイプ、カーディナリティなど)が、XSLTマッパーの右下にある「プロパティ・インスペクタ」に表示されます。図37-1の右上にある「コンポーネント・パレット」には、XSLTマッパーで提供されるすべての関数が表示されます。XSLTマッパーは、関数をドロップして、ソース・ノードおよびターゲット・ノードに接続するための実際の描画領域です。

XSLTマップを最初に作成したとき、ターゲット・ツリーにターゲットXSDの要素と属性構造が示されます。XSLTマップは、XSLTコンストラクトとXPath式をターゲット・ツリーの適切な位置に挿入して作成します。実行すると、XSLTマップは適切な要素と属性をターゲットXSDに生成します。

設計ビューまたはソース・ビューで編集できます。マップを最初に作成したときには、設計ビューが開きます。設計ビューはグラフィカルに表示され、マップの編集が可能です。作成したXSLTのテキスト表現を確認するには、ソース・ビューに切り替えます。ビューを切り替えるには、XSLTマッパーの下部にある「ソース」または「設計」タブをクリックします。

設計ビュー使用時は、「コンポーネント・パレット」の次のページを使用できます。


注意:

XSLTマッパーでは、次の関数はOracle Mediatorでのみ使用できます。Oracle BPEL Process Managerでは使用できません。
  • getProperty(propertyName as string)

  • setCompositeInstanceTitle(titleElement)

  • getComponentInstanceID()

  • getComponentName()

  • getCompositeInstanceID()

  • getCompositeName()

  • getECID()

Oracle BPEL Process Managerの場合は、これらの関数をassignアクティビティで使用できます。


ソース・ビュー使用時は、「XML」「http://www.w3.org/1999/XSL/Transform」ページを使用できます。

XSLTマッパーには、次に示す3つの個別のコンテキスト依存メニューがあります。

3つの個別パネルでそれぞれ右クリックすると、各コンテキスト・メニューを確認できます。

デフォルトでは、設計ビューにはソースおよびターゲット・ツリーの全ノードに対する定義済の接頭辞がすべて表示されます。設計ビューの中央のパネルにあるコンテキスト・メニューから「接頭辞の非表示」を選択すると、接頭辞の非表示を選択できます。接頭辞が非表示のときに「接頭辞の表示」を選択すると再度表示されます。

37.1.1 XSLT作成の概要

マップの設計ビューの表示が、ソース・ビュー内で生成されたXSLTとどのように関連するかを理解することが重要です。この項では、簡単な例を紹介します。

初期マップを作成すると、図37-2に示すように、XSLTマッパーによってソース・スキーマとターゲット・スキーマがグラフィカルに表示されます。

図37-2 ソース・スキーマとターゲット・スキーマ

図37-2の説明が続きます
「図37-2 ソース・スキーマとターゲット・スキーマ」の説明

この時点では、マップされたターゲット・フィールドはありません。ソース・ビューに切り替えると、空のXSLTマップが表示されます。XSLT文を設計ビューでグラフィカルに作成すると、XSLTテキストが生成されます。設計ビューでのマッピング操作の例を図37-3に示します。

図37-3 設計ビューでのマッピング

図37-3の説明が続きます
「図37-3 設計ビューでのマッピング」の説明

設計ビューにより、ソース・ビューに次のXSLT文が生成されます。

  • ソース・ツリーの「OrderDate」属性は、図37-3中のターゲット・ツリーの「InvoiceDate」属性に線でリンクしています。この結果、例37-1に示すように、XSLT形式のvalue-of文が生成されます。

    例37-1 value-of文

    <xsl:attribute name="InvoiceDate">
      <xsl:value-of select="/ns0:PurchaseOrder/@OrderDate"/>
    </xsl:attribute>
    
  • 図37-3に示すソース・ツリーの「First」「Last」の名前フィールドは、XPathのconcat関数によって連結されます。この結果は、ターゲット・ツリーの「Name」フィールドにリンクされます。これによって、例37-2に示すXSLT文が生成されます。

    例37-2 concat関数

    <Name>
        <xsl:value-of select="concat(/ns0:PurchaseOrder/ShipTo/Name/First,
        /ns0:PurchaseOrder/ShipTo/Name/Last)"/>
    </Name>
    
  • 図37-3に示したターゲット・ツリーに挿入されたXSLT for-eachコンストラクトに注意します。ソース・ツリーのHighPriorityItems/Item要素ごとにShippedItems/Item要素がターゲット・ツリーに作成され、ProductNameQuantityがそれぞれにコピーされています。例37-3に示すXSLT構文が生成されます。

    例37-3 for-eachコンストラクト

    <xsl:for-each 
     select="/ns0:PurchaseOrder/Items/HighPriorityItems/Item">
      <Item>
        <ProductName>
          <xsl:value-of select="ProductName"/>
        </ProductName>
        <Quantity>
          <xsl:value-of select="Quantity"/>
        </Quantity>
       </Item>
    </xsl:for-each>
    

    図37-3に示したソース・ツリーの「Item」とターゲット・ツリーの「for-each」コンストラクトをリンクする線が、for-each選択属性に使用されるXPath式を決定します。一般的に、XSLTコントラクトには、主にソース・ツリー要素を参照するXPath文により移入された選択属性またはテスト属性があります。

    for-eachコンストラクトの下のvalue-of文のXPath式は、for-eachに参照されるXPathに関連があることに注意してください。通常、XSLTマッパーは、for-each文の中に相対パスを作成します。

    for-eachコンストラクトの中に絶対パスを作成する必要がある場合は、ソース・ビュー内で行う必要があります。設計ビューに戻ったときに、パスが絶対パスであり、XSLTマッパーで変更されないことに注意します。


    注意:

    例37-3で、ProductNameおよびQuantityのフィールドは、ソースとターゲットの両方で必要なフィールドです。これらのフィールドがソースおよびターゲットでオプションである場合は、これらのマッピングの前後に、ソース・ノードの存在をテストするxsl:if文を挿入することをお薦めします。この文を挿入しないと、入力ドキュメントにソース・ノードが存在しない場合は、ターゲット・ドキュメントに空のノードが作成されます。たとえば、ProductNameがソースとターゲットの両方でオプションの場合は、これらを次のようにマップします。
    <xsl:if test="ProductName">
        <ProductName>
          <xsl:value-of select="ProductName"/>
        </ProductName>
    </xsl:if>
    

    この例で生成されたXSLTマップ全体を例37-4に示します。

    例37-4 XSLTマップ全体

    <xsl:template match="/">
      <tns1:Invoice>
        <xsl:attribute name="InvoiceDate">
          <xsl:value-of select="/ns0:PurchaseOrder/@OrderDate"/>
        </xsl:attribute>
        <ShippedTo>
          <Name>
            <xsl:value-of select="concat
    (/ns0:PurchaseOrder/ShipTo/Name/First,/ns0:PurchaseOrder/ShipTo/Name/Last)"/>
          </Name>
        </ShippedTo>
        <ShippedItems>
          <xsl:for-each select="/ns0:PurchaseOrder/Items/HighPriorityItems/Item">
            <Item>
              <ProductName>
                <xsl:value-of select="ProductName"/>
              </ProductName>
              <Quantity>
                <xsl:value-of select="Quantity"/>
              </Quantity>
            </Item>
          </xsl:for-each>
        </ShippedItems>
      </tns1:Invoice>
    </xsl:template>
    

    この章の以降の各項では、ソース要素とターゲット要素をリンクする方法、XSLTコンストラクトを追加する方法、および設計ビューでXPath式を作成する方法を説明します。

37.1.2 XSLTマッパー使用のガイドライン

  • ターゲット・ツリーの1つのノードは、1回のみリンクできます(つまり、ターゲット・ツリー内の1つのノードに2つのリンクは接続できません)。

  • 不完全な関数および式は、ソース・ビューのXPath式には表示されません。不完全な式が1つ以上ある状態で設計ビューからソース・ビューに切り替えると、「マッパー・メッセージ」ウィンドウに警告メッセージが表示されます。

  • XSLTマッパーで重複する要素をマップすると、スタイルシートが無効になり、設計ビューで作業できなくなります。重複する名前の要素をマップした場合は、「ログ」ウィンドウにエラー・メッセージが表示されます。例37-5に詳細を示します。

    例37-5 名前の重複によるエラー・メッセージ

    Error: This Node is Already Mapped  : 
    "/ns0:rulebase/for-each/ns0:if/ns0:atom/ns0:rel" 
      Error: This Node is Already Mapped  : 
    "/ns0:rulebase/for-each/ns0:if/ns0:atom/choice_1/ns0:ind" 
      Error: This Node is Already Mapped  : 
    "/ns0:rulebase/for-each/ns0:if/ns0:atom/choice_1/ns0:var"
    

    設計ビューで重複ノードを作成するには、1回実行されるfor-each文を各重複ノードの前後に記述します。

37.2 XSLマップ・ファイルの作成

トランスフォーメーションはXSLマップ・ファイル内で実行されます。このファイル内で、ソース・スキーマ要素をターゲット・スキーマ要素にマップします。この項では、XSLマップ・ファイルの作成方法について説明します。


注意:

XSLマップ・ファイルは、XSLスタイルシートからも作成できます。Oracle JDeveloperの「ファイル」メイン・メニューで、「新規」「SOA層」「トランスフォーメーション」「XSLスタイルシートからのXSLマップ」の順にクリックします。

37.2.1 Oracle BPEL Process ManagerでXSLマップ・ファイルを作成する方法

transformアクティビティにより、Oracle BPEL Process ManagerのXSLTマッパーを使用してトランスフォーメーションを作成できます。このツールを使用すると、1つ以上のソース要素をターゲット要素にマップできます。たとえば、受信したソース注文書スキーマ・データを、送信する請求書スキーマ・データにマップできます。

Oracle BPEL Process ManagerでXSLマップ・ファイルを作成する手順は、次のとおりです。

  1. 「コンポーネント・パレット」から、transformアクティビティをBPELプロセス・ダイアグラムにドラッグします。図37-4に例を示します。

    図37-4 transformアクティビティ

    図37-4の説明が続きます
    「図37-4 transformアクティビティ」の説明

  2. transformアクティビティをダブルクリックします。

    図37-5に示す「Transform」ダイアログが表示されます。

    図37-5 「Transform」ダイアログ

    図37-5の説明が続きます
    「図37-5 「Transform」ダイアログ」の説明

  3. 次の情報を指定します。

    1. 要素のマップ元となるソース変数を追加します。追加するには、「追加」アイコンをクリックして、変数と、必要に応じて変数のパート(たとえば、注文書リクエストで構成されるペイロード・スキーマ)を選択します。


      注意:

      複数の入力変数を選択できます。定義されている最初の変数が、XSLマップへのメインXML入力を表します。ここで追加される他の変数は、XSLマップでは入力パラメータとして定義されます。

    2. 要素のマップ先となるターゲット変数を追加します。

    3. マップ先となる変数のターゲット・パート(たとえば、請求書で構成されるペイロード・スキーマ)を追加します。

  4. 「マッパー・ファイル」フィールドで、マップ・ファイル名を指定するか、デフォルト名をそのまま使用します。マップ・ファイルは、XSLTマッパーを使用して、マッピングを作成するファイルです。

  5. 「追加」アイコン(「マッパー・ファイル」フィールドの右側にある2番目のアイコン)をクリックして、マッピングを作成します。ファイルが存在する場合は、「編集」アイコン(3番目のアイコン)をクリックしてマッピングを編集します。

    XSLTマッパーが表示されます。

  6. 第37.1項「XSLTマッパーの概要」に移動して、XSLTマッパーの使用方法の概要を確認します。

37.2.2 Oracle BPEL Process Managerでインポートされたソースとターゲット・スキーマ・ファイルからXSLマップ・ファイルを作成する方法


注意:

拡張子が.xsltの既存のファイル(たとえば、xform.xslt)を選択すると、xform.xsltファイルを使用するつもりでもXSLTマッパーが開き、xform.xslt.xslという名前のXSLファイルが作成されます。拡張子が.xslではないすべてのファイルに.xsl拡張子が追加され、新規ファイルでマッピングを作成する必要が発生します。回避策として、ファイル名には必ず拡張子.xslを付けるようにします。XSLファイルの拡張子が.xsltである場合は、.xslに変更します。

次の手順では、po.xsdファイルとinvoice.xsdファイルを使用して、Oracle BPEL Process ManagerでXSLマップを作成する方法の概要を説明します。

Oracle BPEL Process Managerで、インポートされたソースとターゲット・スキーマ・ファイルからXSLマップ・ファイルを作成する手順は、次のとおりです。

  1. Oracle JDeveloperで、新規XSLマップを作成するアプリケーション・プロジェクトを選択します。

  2. po.xsdファイルとinvoice.xsdファイルをプロジェクトにインポートします(たとえば、Oracle JDeveloperの「構造」ウィンドウで「スキーマ」を右クリックして、「スキーマのインポート」を選択します)。

  3. 選択したプロジェクトを右クリックし、「新規」を選択します。

    「新規ギャラリ」ダイアログが表示されます。

  4. 「カテゴリ」ツリーで、「SOA層」を開いて「トランスフォーメーション」を選択します。

  5. 「項目」リストで、「XSLマップ」をダブルクリックします。

    「XSLマップ・ファイルの作成」ダイアログが表示されます。このダイアログでは、ターゲットのスキーマ・ファイルまたはWeb Services Description Language(WSDL)ファイルのルート要素にソースのスキーマ・ファイルまたはWSDLファイルのルート要素をマップする、XSLマップ・ファイルを作成できます。次の点に注意してください。

      • プロジェクトに追加されたWSDLファイルは、「プロジェクトのWSDLファイル」の下に表示されます。

      • プロジェクトに追加されたスキーマ・ファイルは、「プロジェクトのスキーマ・ファイル」の下に表示されます。

      • プロジェクトの一部ではないスキーマ・ファイルは、スキーマ・ファイルのインポート機能を使用してインポートできます。「スキーマ・ファイルのインポート」アイコン(スキーマ・ファイル・リストの右上にある1番目のアイコン)をクリックしてください。

      • プロジェクトの一部ではないWSDLファイルは、WSDLファイルのインポート機能を使用してインポートできます。「WSDLファイルのインポート」アイコン(スキーマ・ファイル・リストの右上にある2番目のアイコン)をクリックしてください。

  6. 「ファイル名」フィールドにXSLマップ・ファイル名を入力します。

  7. ソース・ツリーとターゲット・ツリーでルート要素を選択します。図37-6の例では、ソース・ルート要素にPurchaseOrder要素が選択され、ターゲット・ルート要素にInvoice要素が選択されています。

    図37-6 展開された「ターゲット」セクション

    図37-6の説明が続きます
    「図37-6 展開された「ターゲット」セクション」の説明

  8. 「OK」をクリックします。

    図37-7に示すように、新しいXSLマップが作成されます。

    図37-7 新規XSLマップ

    図37-7の説明が続きます
    「図37-7 新規XSLマップ」の説明

  9. この時点でファイルを保存して閉じるか、トランスフォーメーションの設計を開始します。XSLTマッパーの使用方法は、第37.1項「XSLTマッパーの概要」を参照してください。

  10. 「コンポーネント・パレット」からtransformアクティビティをBPELプロセスにドラッグします。

  11. transformアクティビティをダブルクリックします。

  12. 次の情報を指定します。

    1. 要素のマップ元となるソース変数を追加します。追加するには、「追加」アイコンをクリックして、変数と、必要に応じて変数のパート(たとえば、注文書リクエストで構成されるペイロード・スキーマ)を選択します。


      注意:

      複数の入力変数を選択できます。定義されている最初の変数が、XSLマップへのメインXML入力を表します。ここで追加される他の変数は、XSLマップでは入力パラメータとして定義されます。

    2. 要素のマップ先となるターゲット変数を追加します。

    3. マップ先となる変数のターゲット・パート(たとえば、請求書で構成されるペイロード・スキーマ)を追加します。

  13. 「マッパー・ファイル」フィールドの右側にある「検索」アイコン(1番目のアイコン)をクリックし、ステップ6で指定したファイル名を参照します。

  14. 「開く」をクリックします。

  15. 「OK」をクリックします。

    XSLTマッパーにXSLマップ・ファイルが表示されます。

  16. 第37.1項「XSLTマッパーの概要」に移動して、XSLTマッパーの使用方法の概要を確認します。

37.2.3 Oracle MediatorでXSLマップ・ファイルを作成する方法

XSLTマッパーを使用すると、Oracle Mediatorで、XMLスキーマ間でデータを変換するためのXSLファイルを作成できます。XSLファイルを定義した後は、そのファイルを複数のルーティング・ルール仕様で再利用できます。この項では、XSLTマッパーを使用してトランスフォーメーション・マップXSLファイルを作成する方法の概要を示します。

XSLTマッパーは、Oracle JDeveloperの「アプリケーション・ナビゲータ」でXSLファイルをクリックするか、メディエータ・エディタで「トランスフォーメーション」アイコンをクリックすると使用できます。手順については次に説明します。新規のトランスフォーメーション・マップを作成するか、既存のトランスフォーメーション・マップを更新できます。

メディエータ・エディタでXSLTマッパーを起動してデータ・トランスフォーメーションXSLファイルを作成または更新するには、次の手順に従います。

メディエータ・エディタでXSLマップ・ファイルを作成する手順は、次のとおりです。

  1. メディエータ・エディタを開きます。

  2. 「ルーティング・ルール」の左側の「+」アイコンをクリックして「ルーティング・ルール」パネルを開きます。

    「ルーティング・ルール」パネルにトランスフォーメーション・マップ・アイコンが表示されます。

  3. 図37-8に示すように、「次を使用して変換」フィールドの右側にある適切なトランスフォーメーション・マップ・アイコンをクリックして、トランスフォーメーション・マップ・ダイアログを表示します。

    図37-8 ルーティング・ルール

    図37-8の説明が続きます
    「図37-8 ルーティング・ルール」の説明

    このトランスフォーメーション・マップ・ダイアログには、既存のトランスフォーメーション・マップ(XSL)ファイルを選択するか、新規のマップ・ファイルを作成するオプションが表示されます。たとえば、「同期リプライ」セクションのトランスフォーメーション・マップ・アイコンを選択すると、図37-9に示すダイアログが表示されます。

    図37-9 「リプライ・トランスフォーメーション・マップ」ダイアログ

    図37-9の説明が続きます
    「図37-9 「リプライ・トランスフォーメーション・マップ」ダイアログ」の説明

    ルーティング・ルールに同期リプライまたはフォルトが含まれている場合、「リプライ・トランスフォーメーション・マップ」ダイアログまたは「フォルト・トランスフォーメーション・マップ」ダイアログには、「リクエストをリプライ・ペイロードに含める」オプションが表示されます。 このオプションを有効化すると、リクエスト・メッセージから情報を取得できます。リクエスト・メッセージ、リプライおよびフォルト・メッセージは、複数のパートで構成できるため、複数のソース・スキーマを指定できます。コールバックとコールバック・タイムアウト・トランスフォーメーションも、複数のパートで構成できます。

    各メッセージ・パートには変数が入ります。リプライ・トランスフォーメーションでは、リプライ・メッセージにはメイン・パート(検出される最初のパート)のスキーマ、およびそれに続く各パートのin.partname変数が含まれます。インクルード・リクエスト・メッセージには、各パートのinitial.partname変数が含まれます。

    たとえば、リプライのメイン・パートがout1.HoustonStoreProductスキーマで、変数として処理される他の2つのパートがin.HoustonStoreProductin.HoustonStoreProduct2であるとします。リクエスト・メッセージには、変数として処理されるinitial.expenseinitial.expense2およびinitial.expense3の3つのパートが含まれます。図37-10に例を示します。

    図37-10 リプライ・パート

    図37-10の説明が続きます
    「図37-10 リプライ・パート」の説明

  4. 次のいずれかのオプションを選択します。

    • 「既存のマッパー・ファイルの使用」を選択し、「検索」アイコンをクリックして既存のXSLTマッパー・ファイルを参照(またはデフォルト値をそのまま使用)します。

    • 「新規マッパー・ファイルの作成」を選択し、ファイル名を入力(またはデフォルト値をそのまま使用)します。ステップ3で説明したように、WSDLファイルのソース・メッセージに複数のパートがある場合は、各パートに変数が使用されます。トランスフォーメーションのターゲットに複数のパートがある場合は、複数のトランスフォーメーション・ファイルがこれらのターゲットにマップされます。この場合、メディエータの「トランスフォーメーション」ダイアログには、各ターゲット・パートごとに別々のパネルが表示されます。たとえば、ターゲットが3つのパートのリクエストがあるとします。

    図37-11に例を示します。

    図37-11 「リクエスト・トランスフォーメーション・マップ」ダイアログ

    図37-11の説明が続きます
    「図37-11 「リクエスト・トランスフォーメーション・マップ」ダイアログ」の説明

  5. 「OK」をクリックします。

    「新規マッパー・ファイルの作成」を選択した場合は、XSLTマッパーが開き、ソース・スキーマ要素をターゲット・スキーマ要素に関連付けることができます。

  6. 第37.1項「XSLTマッパーの概要」に移動して、XSLTマッパーの使用方法の概要を確認します。

37.2.4 XSLマップ・ファイルの作成に関する注意事項

基本的なフォーマット・データ以外の既存のマッピング・エントリをすべてXSLファイルから手動で削除した場合、XSLファイルのエラーは、実行時のトランスフォーメーション中には表示されません。マッピング・エントリは必ず指定してください。たとえば、次の処理を実行するとします。

  1. XSLTマッパーで、入力データから出力データへのトランスフォーメーション・マッピングを作成します。

  2. 出力データをファイル・アダプタを使用してファイルに書き込むように、アプリケーションを設計します。

  3. XSLファイルを手動で変更し、基本的なフォーマット・データ以外のマッピング・エントリをすべて削除します。例:

    <?xml version="1.0" encoding="UTF-8" ?> 
    <xsl:stylesheet version="1.0" 
    xmlns:xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.fu 
    nctions.Xpath20" 
    xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/" 
    xmlns:ns0="http://xmlns.oracle.com/pcbpel/adapter/file/MediaterDemo/Validation 
    UsingSchematron/WriteAccounInfoToFile/" 
    xmlns:orcl="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.fu 
    nctions.ExtFunc" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:dvm="http://www.oracle.com/XSL/Transform/java/oracle.tip.dvm.LookupValue 
    " 
    xmlns:hwf="http://xmlns.oracle.com/bpel/workflow/xpath" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:mhdr="http://www.oracle.com/XSL/Transform/java/oracle.tip.mediator.servi 
    ce.common.functions.GetRequestHeaderExtnFunction" 
    xmlns:ids="http://xmlns.oracle.com/bpel/services/IdentityService/xpath" 
    xmlns:imp1="http://www.mycompany.com/MyExample/NewAccount" 
    xmlns:tns="http://oracle.com/sca/soapservice/MediaterDemo/ValidationUsingSchem 
    atron/CreateNewCustomerService" 
    xmlns:xref="http://www.oracle.com/XSL/Transform/java/oracle.tip.xref.xpath.XRe 
    fXPathFunctions" 
    xmlns:plt="http://schemas.xmlsoap.org/ws/2003/05/partner-link/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:ora="http://schemas.oracle.com/xpath/extension" 
    xmlns:inp1="http://www.mycompany.com/MyExample/NewCustomer" 
    exclude-result-prefixes="xsi xsl tns xsd inp1 ns0 imp1 plt xp20 bpws orcl dvm 
    hwf mhdr ids xref ora"> 
    </xsl:stylesheet> 
    

    この場合でも、ファイルのコンパイルは可能ですが、XSLマッピングは無効になっています。

  4. SOAコンポジット・アプリケーションのインスタンスをデプロイおよび作成します。

    インスタンスの作成中に、書込み操作が入力を受信しなかったために失敗し、例外エラーが発生します。ただし、XSLトランスフォーメーション中にエラーは表示されないことに注意してください。

37.2.5 XSLファイルを使用したコンポジットのインポートに関する注意事項

「ファイル」「インポート」「SOAアーカイブをSOAプロジェクトへ」を選択して、Oracle Enterprise Manager Fusion Middleware ControlからOracle JDeveloperにエクスポートされたSOAアーカイブをインポートする場合、マップ・ハンドラが削除済のため、XSLマップ・ファイルを開けません。

これを解決するには、次の手順を実行します。

  1. 「ファイル」「新規」「SOA層」「トランスフォーメーション」「XSLスタイルシートからのXSLマップ」を選択し、「OK」をクリックします。

    「XSLスタイルシートからのXSLマップ・ファイルの作成」が表示されます。

  2. 「ファイル名」フィールドで、新しいマップ名(Transformation_new.xslなど)を入力します。

  3. 「作成元のXSLスタイルシート」フィールドで、マップ・ヘッダーのないマップ・ファイル名(この例ではTransformation_old.xsl)を入力します。

  4. ソースとターゲットには、マップ・ヘッダーのリカバリに使用するための正しいマップ・ソースおよびターゲット・スキーマ情報を入力します。

  5. 新規マップ・ファイルを正常に作成した後、古いマップ・ファイル(Transformation_old.xsl)を削除します。

  6. 参照が壊れないようにするため、リカバリされたヘッダーを持つ新規マップ・ファイルの名前を古いマップ・ファイル名に変更します(この例では、Transformation_new.xsltTransformation_old.xslに名前を変更します)。

37.2.6 XSLマップ・ファイルを作成せずにOracle Mediatorを介してペイロードを渡した場合の実行時の処理内容

トランスフォーメーション・マッピングを定義せずに、Oracle Mediatorを介してペイロードを渡すようにSOAコンポジット・アプリケーションを設計した場合、ペイロードはOracle Mediatorを介して渡されます。ただし、ペイロードが正しく渡されるには、ソース・メッセージとターゲット・メッセージのパート名とタイプを必ず同じにする必要があります。これらが同じでない場合、ターゲット参照は実行に失敗し、「入力ソースがNullですまたは「Partが見つかりませんなどのエラー・メッセージが表示される場合があります。

37.2.7 空のネームスペース・タグがある出力メッセージを受信した場合の処理内容

XSLファイルのXML表現と、シナリオで使用するXML表現(このシナリオでは、トランスフォーメーションを実行するか、assignアクティビティを使用してメッセージを渡します)は、XMLが構文的およびセマンティク的に同じであっても異なる場合があります。たとえば、メディエータ・サービス・コンポーネントを使用して、ネームスペースのない要素が含まれたインバウンド・ペイロードをアウトバウンド・ペイロードにマップした場合は、空のネームスペース・タグが含まれた出力メッセージを受信する場合があります。

<Country xmlns="">US</Country> 

これは正常な動作です。空のネームスペースxmlns=""は自動的に追加されます。

37.3 XSLTマッパーを使用したトランスフォメーション・マップの設計

次の各項では、Oracle BPEL Process ManagerまたはOracle MediatorでXSLTマッパーを使用する方法を説明します。

37.3.1 追加ソースを追加する方法

追加ソースを既存のXSLTマップに追加できます。これらのソースはグローバル・パラメータとして定義され、その構造を定義するスキーマを持っています。マップのロジックによっては、複数のソース文書が必要となる場合があります。たとえば、請求書を作成するには、マップの入力として注文書と顧客データ文書の両方にアクセスする必要がある場合があります。

XSLには、BPEL変数の認識機能はないことに注意してください。XSL設計時に複数のソースを追加する場合は、これらの複数のソースをBPELプロセスのtransformアクティビティ内でも必ず追加してください。

追加ソースを追加する手順は、次のとおりです。

  1. ソース・パネルを右クリックして、コンテキスト・メニューを表示します。図37-12に詳細を示します。

    図37-12 コンテキスト・メニュー

    図37-12の説明が続きます
    「図37-12 コンテキスト・メニュー」の説明

  2. 「ソースの追加」を選択します。

    図37-13に示す「ソースの追加」ダイアログが表示されます。

  3. ソースのパラメータ名を入力します(名前はネームスペースや接頭辞で修飾することもできます)。

    図37-13 「ソースの追加」ダイアログ

    図37-13の説明が続きます
    「図37-13 「ソースの追加」ダイアログ」の説明

  4. 「ソース・スキーマ」セクションで、「選択」をクリックして、新しいソースのスキーマを選択します。

    「タイプ・チューザ」ダイアログが表示されます。

  5. 新規XSLTマップを作成する場合と同じ方法で、パラメータに対して適切なスキーマまたはWSDLファイルを選択またはインポートします。この例では、サンプルのcustomer.xsdファイルの「Customer」要素を選択しています。

  6. 「OK」をクリックします。

    「パラメータとしてソースを作成」ダイアログの「ソース・スキーマ」セクションに、スキーマの定義が表示されます。

  7. 「OK」をクリックします。

    選択したスキーマがインポートされ、ソース・パネルのメイン・ソースの上にパラメータが表示されます。図37-14に示すように、パラメータを展開して、基礎となるスキーマの構造を表示できます。

    図37-14 展開されたパラメータ

    図37-14の説明が続きます
    「図37-14 展開されたパラメータ」の説明

    パラメータは、先頭に$を付けることで、XPath式で参照できます。たとえば、CUSTという名前のパラメータは、XPath式では$CUSTと表示されます。パラメータの下のノードも参照できます(たとえば、$CUST/customer/Header/customerid)。

37.3.2 ノードのリンクによる単純コピーの実行方法

ソースの属性またはリーフ要素をターゲットの属性またはリーフ要素にコピーするには、ソースをターゲットにドラッグします。たとえば、図37-15に示すように、要素PurchaseOrder/IDInvoice/IDにコピーし、属性PurchaseOrder/OrderDateInvoice/InvoiceDateにコピーします。

図37-15 ノードのリンク

ノードのリンク
「図37-15 ノードのリンク」の説明

37.3.3 定数値の設定方法

次の手順に従って、定数値を設定します。

定数値を設定する手順は、次のとおりです。

  1. ターゲット・ツリーでノードを選択します。

  2. マウスを右クリックして、コンテキスト・メニューを起動します。

  3. 「テキストの設定」メニュー・オプションを選択します。

    メニューには次の選択項目があります。

    • <空>: 空のノードを作成できます。

    • テキストの入力: テキストを入力できます。

  4. 「テキストの入力」を選択します。

    「テキストの設定」ダイアログが表示されます。

  5. 「テキストの設定」ダイアログでテキストを入力します(たとえば、図37-16に示す「Discount Applied」)。

    図37-16 「テキストの設定」ダイアログ

    「テキストの設定」ダイアログ・ボックス
    「図37-16 「テキストの設定」ダイアログ」の説明

  6. 「OK」をクリックして、テキストを保存します。

    テキストが関連付けられたノードの横に「T」のアイコンが表示されます。入力したテキストの先頭の文字がノード名の横に表示されます。

  7. ノードに関連付けられているテキストを変更するには、ノードを右クリックして「テキストの編集」を選択し、「テキストの設定」ダイアログを再度起動します。

  8. テキストを変更して「OK」をクリックします。

    フィールドの詳細は、「テキストの設定」ダイアログのオンライン・ヘルプを参照してください。

  9. ノードに関連付けられているテキストを削除するには、ノードを右クリックして「テキストの削除」を選択します。

37.3.4 関数の追加方法

標準のXPath 1.0関数に加え、XSLTマッパーでは、多くのビルトイン拡張関数を使用できます。また、マッパーはユーザー定義関数や名前付きテンプレートにも対応しています。これらの拡張関数には、接頭辞oraextまたはorclが付加されており、XPath 2.0関数に類似しています。

次の手順に従って、関数定義を表示し、関数を使用します。

関数を追加する手順は、次のとおりです。

  1. 「コンポーネント・パレット」で関数のカテゴリ(たとえば、「String Functions」)を選択します。

  2. 個別の関数(lower-caseなど)を右クリックします。

  3. 「ヘルプ」を選択します。図37-17に示すように、関数の説明があるダイアログが表示されます。下部のリンクをクリックして、World Wide Web Consortium(www.w3.org)にあるこの関数の説明にアクセスすることもできます。

    図37-17 関数の説明

    図37-17の説明が続きます
    「図37-17 関数の説明」の説明

  4. 「コンポーネント・パレット」からXSLTマッパーの中央のパネルに、関数をドラッグします。次に、ソース・ツリーのソース・パラメータを関数に接続し、関数の出力をターゲット・ツリーのノードに接続できます。次の例では、「コンポーネント・パレット」の「String」セクションから「concat」関数を中央のパネルにドラッグします。

  5. PurchaseOrder/ShipTo/Name/FirstPurchaseOrder/ShipTo/Name/Lastを連結します。姓および名からスレッドをドラッグし、concat関数の入力(左)側にドロップして、Invoice/ShippedTo/Nameに結果を設定します。

  6. ShippedTo名からスレッドをドラッグし、concat関数の出力(右)側に接続します。図37-18を参照してください。

図37-18 concat関数の使用

関数の使用
「図37-18 concat関数の使用」の説明

37.3.4.1 関数パラメータの編集

関数のパラメータを編集するには、関数アイコンをダブルクリックして「関数の編集」ダイアログを起動します。たとえば、新規パラメータのカンマを追加して、前述の例で使用したconcat関数の出力をLast, Firstとするには、「追加」をクリックしてカンマを追加し、この出力となるようにパラメータを並べ替えます。図37-19に詳細を示します。

図37-19 関数パラメータの編集

関数パラメータの編集
「図37-19 関数パラメータの編集」の説明

関数パラメータを追加、削除および順序変更する方法の詳細は、「関数の編集」ダイアログのオンライン・ヘルプを参照してください。

37.3.4.2 関数の連鎖

関数の連鎖(ある関数の出力を別の関数の入力にマップすること)によって、複雑な式を作成できます。たとえば、concat関数の出力から先頭と末尾の空白をすべて削除するには、次の手順を実行します。

  1. left-trim関数とright-trim関数をconcat関数の枠線の領域にドラッグします。

  2. 図37-20に示すように、一方の関数の出力側から次の関数の入力側に線をドラッグして、2つの関数を連鎖します。

連鎖は、関数を接続リンクにドラッグ・アンド・ドロップして実行することもできます。

図37-20 関数の連鎖

関数の連鎖
「図37-20 関数の連鎖」の説明

37.3.4.3 名前付きテンプレートの使用

一部の複雑なマッピング・ロジックは、ビジュアル・マッピングで表現したり、実現できません。このような場合は、名前付きテンプレートが便利です。名前付きテンプレートを使用すると、共通のマッピング・ロジックを共有できます。共通のマッピング・ロジックを名前付きテンプレートとして定義すると、そのテンプレートは必要に応じて何度でも使用できます。

名前付きテンプレートは2つの方法で定義できます。

  • ソース・ビューのXSLマップに直接テンプレートを追加します。

  • XSLマップに組み込む外部ファイルにテンプレートを追加します。

定義したテンプレートは、「コンポーネント・パレット」の「ユーザー定義」ページにある「User Defined Named Templates」リストに表示されます。名前付きテンプレートは、他の関数とほぼ同じ方法で使用できます。唯一異なる点は、名前付きテンプレートの出力は関数または別の名前付きテンプレートにリンクできないことです。名前付きテンプレートの出力をリンクできるのは、ターゲット・ツリー内のターゲット・ノードのみです。

名前付きテンプレートの作成には、XSLT言語の知識が必要です。名前付きテンプレートの作成方法の詳細は、XSLTに関する書籍を参照するか、次のURLにアクセスしてください。

http://www.w3.org/TR/xslt

外部ファイルに定義されたテンプレートの組込み方法の詳細は、第37.3.6.7項「xsl:includeを使用した外部テンプレートのインクルード」を参照してください。

37.3.4.4 ユーザー定義関数のインポート

XSLTまたはXPath式で実行できない複雑な機能がある場合は、ユーザー定義のJava関数を作成し、インポートできます。

次の手順に従って、ユーザー独自の関数を作成して使用します。ロジックが複雑すぎるためにXSLマップ内で実行できない場合は、外部のユーザー定義関数が必要になる場合があります。

ユーザー定義関数をインポートする手順は、次のとおりです。

  1. 関数をコーディングし、作成します。

    XSLTマッパーの拡張関数のコード方法は、Oracle BPELプロセス・マネージャの拡張関数とは異なります。mapper-107-extension-functionsサンプル・シナリオのSampleExtensionFunctions.javaファイルには、2つの例があります。例37-6に、これらの関数のテキストを示します。これらのサンプルおよび他のサンプルは、次のURLからダウンロードできます。

    https://soasamples.samplecode.oracle.com/
    

    各関数は、静的関数として宣言する必要があります。入力パラメータと戻り値は、次のいずれかのタイプで宣言する必要があります。

    • java.lang.String

    • int

    • float

    • double

    • boolean

    • oracle.xml.parser.v2.XMLNodeList

    • oracle.xml.parser.v2.XMLDocumentFragment

    例37-6 XSLTマッパー拡張関数

    // SampleExtensionFunctions.java
    package oracle.sample;
    /*
    This is a sample XSLT Mapper User Defined Extension Functions implementation
    class.
    */
    public class SampleExtensionFunctions
    {
       public static Double toKilograms(Double lb)
       {
          return new Double(lb.doubleValue()*0.45359237);
       }
       public static String replaceChar(String inputString, String oldChar, String
          newChar )
       {
          return inputString.replace(oldChar.charAt(0), newChar.charAt(0));
       }
    }
    
  2. XML拡張関数構成ファイルを作成します。このファイルは関数とそのパラメータを定義します。

    このファイルの名前は、ext-mapper-xpath-functions-config.xmlに設定する必要があります。このファイルのフォーマットに関する詳細は、B.7項「ユーザー定義XPath拡張関数の作成」を参照してください。例37-7に示されているファイルは、例37-6でコーディングされたtoKilograms関数とreplaceChar関数を表しています。

    例37-7 XML拡張関数構成ファイル

    <?xml version="1.0" encoding="UTF-8"?>
    <soa-xpath-functions version="11.1.1"
     xmlns="http://xmlns.oracle.com/soa/config/xpath" xmlns:sample=
    "http://www.oracle.com/XSL/Transform/java/oracle.sample.SampleExtensionFunctions"
     >
          <function name="sample:toKilograms">
                 <className>oracle.sample.SampleExtensionFunctions</className>
                 <return type="number"/>
                 <params>
                        <param name="pounds" type="number"/>
                 </params>
                 <desc>Converts a value in pounds to kilograms</desc>
          </function>
          <function name="sample:replaceChar">
                 <className>oracle.sample.SampleExtensionFunctions</className>
                 <return type="string"/>
                 <params>
                        <param name="inputString" type="string"/>
                        <param name="oldChar" type="string"/>
                        <param name="newChar" type="string"/>
                 </params>
                 <desc>Returns a new string resulting from replacing all occurrences
                       of oldChar in this string with newChar</desc>
          </function>
    </soa-xpath-functions>
    

    XSLT拡張関数の定義には、他にいくつかのルールが適用されます。

    • 関数にはネームスペースの接頭辞とネームスペースが必要です。この例では、samplehttp://www.oracle.com/XSL/Transform/java/oracle.sample.SampleExtensionFunctionsとなります。

    • Oracle XSLTプロセッサと連携する拡張関数の場合、関数ネームスペースはhttp://www.oracle.com/XSL/Transform/java/で始まる必要があります。

    • ネームスペースの後半部は、この例ではoracle.sample.SampleExtensionFunctionsですが、拡張関数を実装したJavaクラスの完全な修飾名である必要があります。

    • 表37-1に示したタイプおよび等価のJavaタイプは、パラメータと戻り値に対して使用できます。

      表37-1 タイプおよび等価のJavaタイプ

      XML構成ファイルのタイプ名 Javaタイプ

      string

      java.lang.String

      boolean

      boolean

      number

      intfloatdouble

      node-set

      oracle.xml.parser.v2.XMLNodeList

      tree

      oracle.xml.parser.v2.XMLDocumentFragment


  3. XML構成ファイルとコンパイル済クラスの両方が含まれたJARファイルを作成します。構成ファイルは、JARファイル用のMETA-INFディレクトリに格納される必要があります。この項の例の場合、ディレクトリ構造は、JARファイルにoracleディレクトリとMETA-INFディレクトリが追加され、次のようになります。

    • oracle

      • sample(クラス・ファイルが格納されます。)

    • META-INF

      • ext-mapper-xpath-functions-config.xml

    次に、JARファイルをOracle JDeveloperに登録する必要があります。

  4. 「ツール」「プリファレンス」「SOA」の順に選択します。

  5. 「追加」ボタンをクリックし、JARファイルに移動して選択します。

  6. Oracle JDeveloperを再起動します。

    新しい関数は、「コンポーネント・パレット」で、「ユーザー定義」ページの「User Defined Extension Functions」グループに表示されます。

  7. 関数をランタイム環境で使用できるようにする方法の詳細は、B.7.3項「ユーザー定義関数のランタイムへのデプロイ方法」を参照してください。

37.3.5 XPath式の編集方法

XPath式をトランスフォーメーション・マッピングに使用するには、コンポーネント・パレットで「拡張」ページを選択し、次に「Advanced Function」グループを選択して、「xpath-expression」をリストからXSLTマッパーにドラッグします。図37-21を参照してください。

図37-21 XPath式の編集

図37-21の説明が続きます
「図37-21 XPath式の編集」の説明

アイコンをダブルクリックすると、図37-22に示すように、「XPath式の編集」ダイアログが表示されます。[Ctrl]キーを押しながら[Space]キーを押してXPathビルディング・アシスタントを起動します。

図37-22 「XPath式の編集」ダイアログ

図37-22の説明が続きます
「図37-22 「XPath式の編集」ダイアログ」の説明

図37-23は、XPathビルディング・アシスタントを示しています。

図37-23 XPathビルディング・アシスタント

図37-23の説明が続きます
「図37-23 XPathビルディング・アシスタント」の説明

XPathビルディング・アシスタントの使用に関する詳細は、「XPath式の編集」ダイアログのオンライン・ヘルプおよびB.6項「Oracle JDeveloperでのXPath式の構築」を参照してください。

37.3.6 XSLTコンストラクトの追加方法

複雑なスキーマのマッピングでは、XSLTコンストラクトを追加できる必要があります。たとえば、特定の条件が存在する場合に、ターゲットにノードを作成する必要がある場合があります。この場合は、xsl:if文またはxsl:choose文を使用する必要があります。また、受注の品目リストなど、ソースでnode-setをループ処理し、受注の各品目に対してターゲットXMLにノードを作成する必要がある場合もあります。この場合は、xsl:for-each文を使用する必要があります。XSLTマッパーには、このようなタスクを実行するためのXSLTコンストラクトが用意されています。

for-eachifchooseなどのXSLTコントラクトをターゲットXSLTツリーに追加する方法は2種類あります。

「コンポーネント・パレット」からXSLTコントラクトを追加する手順は、次のとおりです。

  1. 「一般」ページを選択して「XSLT Constructs」グループを開きます。図37-24に詳細を示します。

    図37-24 「コンポーネント・パレット」から使用可能なXSLTコンストラクト

    図37-24の説明が続きます
    「図37-24 「コンポーネント・パレット」から使用可能なXSLTコンストラクト」の説明

  2. XSLTコンストラクトをグループからターゲット・ツリーのノードにドラッグします。XSLTコントラクトがそのノードに適用できる場合は、ターゲット・ツリーに挿入されます。whenおよびotherwiseコンストラクトは、あらかじめ挿入されたchooseノードに適用する必要があることに注意してください。

XSLTコンストラクトをターゲット・ツリーのコンテキスト・メニューを使用して追加する手順は、次のとおりです。

  1. XSLTコンストラクトを挿入するターゲット・ツリーの要素を右クリックします。コンテキスト・メニューが表示されます。図37-25に詳細を示します。

    図37-25 コンテキスト・メニューから使用可能なXSLTコンストラクト

    図37-25の説明が続きます
    「図37-25 コンテキスト・メニューから使用可能なXSLTコンストラクト」の説明

  2. 「XSLノードの追加」を選択し、次に、挿入するXSLTコンストラクトを選択します。

XSLTコンストラクトが挿入されます。ほとんどの場合、最初はエラー・アイコンがコンストラクトの横に表示されます。これは、コンストラクトにXPath式を定義する必要があることを示しています。

たとえば、for-eachコンストラクトの場合、XPath式はfor-each文のループ対象となるノードセットを定義します。ifコンストラクトの場合、XPath式はifコントラクトの内容の実行可否を決定するために評価されるブール式を定義します。

XPath式は、ターゲット・ツリーの要素や属性のマッピングと同じ方法で作成できます。次の方法は、XSLTで基礎となるXPath式を作成する方法です。これらの方法はすべて、XPath式を設定するためにターゲット・ツリーのXSLTコンストラクトで実行できます。

  • ノードのリンクによる単純コピーの作成

  • 関数の追加

  • XPath式の追加

次の各項では、サポートされている各XSLTコンストラクトを挿入する具体的な手順を説明します。

37.3.6.1 xsl:ifを使用した条件付き処理の使用

図37-26で、HQAccountBranchAccountは、PurchaseOrderスキーマのchoice要素の一部であり、実際のインスタンスにはそのいずれか1つが出現します。ここでは、条件付きマッピングの具体例として、PurchaseOrder/HQAccount/AccountNumberが存在する場合のみ、Invoice/BilledToAccount/AccountNumberにコピーします。

xsl:ifを使用した条件付き処理を使用する手順は、次のとおりです。

  1. ターゲット・ツリーでInvoice/BilledToAccount/AccountNumberを選択し、右クリックしてコンテキスト依存メニューを起動します。

  2. 「XSLノードの追加」「if」の順に選択し、PurchaseOrder/HQAccount/AccountNumberInvoice/BilledToAccount/ifに接続します。

  3. PurchaseOrder/HQAccount/AccountNumberInvoice/BilledToAccount/if/AccountNumberに接続します。

図37-26に結果を示します。

図37-26 xsl:ifを使用した条件付き処理

条件付き処理
「図37-26 xsl:ifを使用した条件付き処理」の説明

オプションのソース・ノードをオプションのターゲット・ノードにマップする場合は、ソース・ノードが存在するかどうかをテストするxsl:if文でマッピングを囲むことが重要です。このように処理しないと、入力文書にソース・ノードが存在しない場合は、ターゲット文書に空のノードが作成されます。たとえば、例37-8に示すマッピングがあるとします。

例37-8 xsl:Ifを使用しない文

<ProductName>
  <xsl:value-of select="ProductName"/>
</ProductName>

ProductNameフィールドがソースおよびターゲットの両方でオプションであり、その要素がソース文書に存在しない場合は、ターゲット文書に空のProductName要素が作成されます。この状況を回避するには、例37-9に示すように、ターゲット・ノードの作成前に、ソース・ノードが存在するかどうかをテストするif文を追加します。

例37-9 xsl:Ifを使用した文

<xsl:if test="ProductName">
    <ProductName>
      <xsl:value-of select="ProductName"/>
    </ProductName>
</xsl:if>

37.3.6.2 xsl:chooseを使用した条件付き処理の使用

この同じ例で、PurchaseOrder/HQAccount/AccountNumberが存在する場合は、Invoice/BilledToAccount/AccountNumberにコピーできます。存在しない場合は、PurchaseOrder/BranchAccountInvoice/BilledToAccount/AccountNumberにコピーします。

xsl:chooseを使用した条件付き処理を使用する手順は、次のとおりです。

  1. ターゲット・ツリーでInvoice/BilledToAccount/AccountNumberを選択し、右クリックしてコンテキスト依存メニューを起動します。

  2. メニューから「XSLノードの追加」「choose」の順に選択します。

  3. PurchaseOrder/HQAccount/AccountNumberInvoice/BilledToAccount/choose/whenに接続して、条件を定義します。

  4. PurchaseOrder/HQAccount/AccountNumberInvoice/BilledToAccount/choose/when/AccountNumberに接続します。

  5. ターゲット・ツリーでXSL追加ノード「choose」の順に選択し、右クリックしてコンテキスト依存メニューを起動します。

  6. メニューから「XSLノードの追加」→「otherwise」の順に選択します。

  7. PurchaseOrder/BranchAccount/AccountNumberInvoice/BilledToAccount/choose/otherwise/AccountNumberに接続します。

図37-27に結果を示します。

図37-27 xsl:chooseを使用した条件付き処理

条件付き処理
「図37-27 xsl:chooseを使用した条件付き処理」の説明

37.3.6.3 xsl:for-eachを使用したループの作成

XSLTマッパーでは、xsl:for-eachコマンドを使用したループを作成できます。例として、PurchaseOrder/Items/HighPriorityItems/ItemInvoice/ShippedItems/Itemにコピーします。

xsl:for-eachを使用してループを作成する手順は、次のとおりです。

  1. ターゲット・ツリーでInvoice/ShippedItems/Itemを選択し、右クリックしてコンテキスト依存メニューを起動します。

  2. 「XSLノードの追加」「for-each」の順に選択し、PurchaseOrder/Items/HighPriorityItems/ItemInvoice/ShippedItems/for-eachに接続して繰返しを定義します。

  3. PurchaseOrder/Items/HighPriorityItems/Item/ProductNameInvoice/ShippedItems/for-each/Item/ProductNameに接続します。

  4. PurchaseOrder/Items/HighPriorityItems/Item/QuantityInvoice/ShippedItems/for-each/Item/Quantityに接続します。

  5. PurchaseOrder/Items/HighPriorityItems/Item/USPriceInvoice/ShippedItems/for-each/Item/PriceChargedに接続します。

図37-28に結果を示します。

図37-28 xsl:for-eachを使用したループの作成

繰返しまたは配列の処理
「図37-28 xsl:for-eachを使用したループの作成」の説明


注意:

  • 自動マップを実行すると、xsl:for-eachが自動的に挿入されます。自動マップの動作を参照する場合、PurchaseOrder/Items/LowPriorityItemsInvoice/UnShippedItemsにドラッグすると、for-eachが自動的に作成されます。

  • 設計には無限ループが含まれていないことが必要です。このようなループがあると、アプリケーションのデプロイメントおよび起動時に、次のようなエラーが表示されます。

    ORAMED-04001: 
    . . .
    oracle.tip.mediator.service.BaseActionHandler requestProcess 
    SEVERE: 
    failed reference BPELProcess1.bpelprocess1_client operation = process
    

37.3.6.4 xsl:for-eachのクローニング

既存のxsl:for-eachをクローニングして追加のループを作成できます。たとえば、HighPriorityItemsに加えて、LowPriorityItemsをすべてShippedItemsにコピーします。

xsl:for-eachをクローニングする手順は、次のとおりです。

  1. Invoice/ShippedItemsの下のfor-eachを選択します。

  2. 右クリックして、「XSLノードの追加」「'for-each'のクローニング」の順に選択します。

    これで、for-eachノードのコピーがオリジナルのfor-eachの下に挿入されます。

  3. PurchaseOrder/Items/LowPriorityItems/Itemをコピーしたfor-eachにドラッグし、繰返しを定義します。

  4. PurchaseOrder/Items/LowPriorityItems/Item/ProductNameをコピーしたfor-eachItem/ProductNameに接続します。

  5. PurchaseOrder/Items/LowPriorityItems/Item/Quantityをコピーしたfor-eachItem/Quantityに接続します。

  6. PurchaseOrder/Items/LowPriorityItems/Item/USPriceをコピーしたfor-eachItem/PriceChargedに接続します。

37.3.6.5 xsl:for-eachへのxsl:sortの適用

XSLTマッパーを使用すると、xsl:sort文をxsl:for-eachコマンドに追加できます。

xsl:sort文を追加する手順は、次のとおりです。

  1. ターゲット・ツリーのfor-each文を右クリックします。

    コンテキスト・メニューが表示されます。

  2. 「XSLノードの追加」「sort」を選択します。図37-29で示されるように、「ソート編集ダイアログ」が表示されます。

    図37-29 「ソート編集ダイアログ」

    図37-29の説明が続きます
    「図37-29 「ソート編集ダイアログ」」の説明

  3. 必要に応じて、sort文に追加するオプションを選択します。オプションの詳細は、オンライン・ヘルプを参照してください。

  4. 「OK」をクリックします。for-eachの後にsort文が追加されます。

  5. ソート対象のフィールドを設定するには、ソース・ツリーの必要なソート・フィールド・ノードをターゲット・ツリーのソート・ノードへドラッグします。これによって、単純なリンクが作成され、xsl:sortの選択属性に対してXPath式が設定されます。

  6. sort文をさらに追加するには、「for-each」を右クリックして別のsortを追加するか、既存のソート・ノードを右クリックして、選択したソート・ノードの前に新しいsort文を挿入します。

  7. ソート・ノードを編集するには、ソート・ノードをダブルクリックするか、右クリックして、コンテキスト・メニューから「ソートの編集」を選択します。この結果、「ソート編集ダイアログ」が起動され、ソート・オプションを変更できます。

37.3.6.6 xsl:copy-ofを使用したノードのコピー

ノードをその子ノードと一緒にソース・ツリーからターゲット・ツリーにコピーする場合に、XSLT copy-ofコンストラクトを使用できます。この方法は、通常anyTypeany要素ノードを処理する場合に行われます。anyTypeany要素ノードおよび属性ノードは、直接マップできないことに注意してください。copy-of、または要素置換およびタイプ置換を使用してください。

xsl:copy-ofを使用してノードをコピーする手順は、次のとおりです。

  1. copy-ofコマンドで作成するノードをターゲット・ツリーで選択します。

  2. 右クリックして、「XSLノードの追加」「copy-of」の順に選択します。

    選択したノードがany要素ノードでない場合は、ダイアログが表示され、選択したノードを置換するか、その子ノードを置換するように求められます。

  3. アプリケーションに対して正しいオプションを選択して、「OK」をクリックします。

    copy-ofを使用して選択したノードを置換を選択すると、copy-ofに続いて、XSL内に処理ディレクティブが即座に作成され、どのノードがcopy-ofによって置換されたかが示されます。XSLに処理ディレクティブがないと、設計ビューへの変換が不正に解釈されます。このため、ソース・ビュー使用中に、この処理命令を削除または編集しないでください。

  4. ソース・ツリーからドラッグ・アンド・ドロップするか、またはXPath式を作成することでcopy-ofのソース・ノードを設定します。


    注意:

    copy-ofコマンドは必ず設計ビューで作成し、正しい処理ディレクティブがXSLTマッパーに作成され、copy-ofコマンドのターゲット・ツリーの中の正しい場所が指示できるようにします。


    警告:

    XSLTマッパーでは、現在、copy-ofコマンドを使用して実行されたデータのマッピングを検証しません。必ずcopy-ofがターゲット・ツリーに要素を正しくマップするために使用され、その結果ターゲットのXML文書に有効なデータが含まれるようにします。テスト・ツールを使用して有効性をテストできます。


37.3.6.7 xsl:includeを使用した外部テンプレートのインクルード

外部XSLファイルに定義されたテンプレートをinclude文を使用して現在のマップに含めることにより、テンプレートを再利用できます。

xsl:includeを使用して外部テンプレートをインクルードする手順は、次のとおりです。

  1. ターゲット・ツリーのルート・ノードを選択し、右クリックします。

  2. メニューから、「インクルード・ファイルの追加」を選択します。

    インクルード・ファイル名を選択するダイアログが表示されます。

  3. ファイルを選択して「OK」をクリックします。

    ファイルは既存のマップ・ファイルと同じプロジェクト・ディレクトリにコピーされます。相対パス名が作成され、include文指示がターゲット・ツリーに挿入されます。

    インクルード・ファイルには名前付きのテンプレート定義しか入りません。これらは解析された後、設計ビュー内で、「コンポーネント・パレット」の「ユーザー定義」ページの「User Defined Named Templates」カテゴリから使用できます。


    注意:

    oramds://共有ロケーションは、ユーザー定義の名前付きテンプレート・インクルード・ファイルでは参照できません。

37.3.7 ノードを自動的にマップする方法

リーフ以外のノードのマッピングでは、自動マップ機能が起動します。選択したソースとターゲットの下にあるすべての関連ノードの自動リンクが試行されます。例として、PurchaseOrder/ShipTo/AddressInvoice/ShippedTo/Addressにマップして自動マップ機能を確認してください。図37-30のように、「Address」のすべてのノードが自動的にマップされます。

図37-30 自動マッピング

自動マッピング
「図37-30 自動マッピング」の説明

自動マップの動作は、Oracle JDeveloperのプリファレンスの設定を変更するか、XSLTマッパーを右クリックし、「自動マップ・プリファレンス」を選択して調整できます。図37-31に示すダイアログが表示されます。

図37-31 「自動マップ・プリファレンス」

「自動マップ・プリファレンス」
「図37-31 「自動マップ・プリファレンス」」の説明

このダイアログでは、自動マッピングを次のようにカスタマイズできます。

  • 自動マッピング機能を起動できます。この機能では、選択したソースとターゲットの下にあるすべての関連ノードの自動リンクが試行されます。この機能が無効の場合は、関連ノードを個別にマップする必要があります。

  • XSLTマッパーで検出されたソースからターゲットへの考えられるすべてのマッピングを表示および確認してから、作成を確定できます。

  • 自動マップの起動前に、自動マップのプリファレンスをカスタマイズするかどうかを尋ねるプロンプトを表示できます。

  • ソース・ノードおよびターゲット・ノードの自動マッピングに対して、「標準」または「詳細」のいずれかの方法を選択できます。この処理によって、選択したソースとターゲットの下にあるすべての関連ノードの自動リンクを、XSLTマッパーでどのように試行するかをカスタマイズできます。

  • ディクショナリを管理できます。XSLTマッパーでは、ソース要素とターゲット要素の自動マップの試行時に、ディクショナリで定義されているルールが使用されます。

    フィールドの詳細は、「自動マップ・プリファレンス」ダイアログのオンライン・ヘルプを参照してください。

次の手順に従って、ターゲット・ノードの潜在的なソース・マッピング候補を検索します。

ノードを自動的にマップする手順は、次のとおりです。

  1. ターゲット・ノードを右クリックして、「一致アイテムの表示」を選択します。

  2. 「自動マップ・プリファレンス」ダイアログで「OK」をクリックします。

    図37-32に示すように、「自動マップ」ダイアログが表示されます。

図37-32 自動マッピング候補

図37-32の説明が続きます
「図37-32 自動マッピング候補」の説明

フィールドの詳細は、「自動マップ」ダイアログのオンライン・ヘルプを参照してください。

37.3.7.1 確認を伴う自動マップの使用

図37-31に示した「自動マップの結果を確認」チェック・ボックスが選択されている場合は、確認ダイアログが表示されます。一致が検出された場合は、図37-33に示すように、XSLTマッパーで検出されたソースからターゲットへの考えられるマッピングが表示されます。このダイアログでは、1つ以上のマッピングをフィルタリングできます。

図37-33 確認を伴う自動マップ

確認を伴う自動マップ
「図37-33 確認を伴う自動マップ」の説明

フィールドの詳細は、「自動マップ」ダイアログのオンライン・ヘルプを参照してください。

37.3.8 自動マッピングに関する注意事項

自動マッピング・アルゴリズムは、ソース・ノードとターゲット・ノード間の既存のマップに依存します。自動マッピングの実行前に、ソース・ノードとターゲット・ノード間にマップが存在する場合は、これらの既存のマップを使用して、アルゴリズムで使用される有効なシノニムが定義されます。

たとえば、図37-34に示すように、単純なソース・ツリーとターゲット・ツリーがあり、それぞれにtest1test2という2つの要素があるとします。

図37-34 2つの要素があるソース・ツリーとターゲット・ツリー

図37-34の説明が続きます
「図37-34 2つの要素があるソース・ツリーとターゲット・ツリー」の説明

ノードがマップされていない場合、自動マッピング・アルゴリズムで名前test1test2が照合されることはありません。ただし、test1ノードとtest2ノードの間にマッピングが存在する場合は、追加のマッピングに対して、名前test1test2がシノニムとして事前定義されます。

図37-34の例で、exampleElementをソースからターゲットにドラッグすると、自動マッピング・アルゴリズムによって、ソースのtest1ノードがターゲットのtest2ノードにマップされます。これは、この2つの名前が、マップで以前にリンクされたためです。この結果、マップは図37-35のようになります。

図37-35 exampleElementのドラッグ結果

図37-35の説明が続きます
「図37-35 exampleElementのドラッグ結果」の説明

37.3.9 マップされていないターゲット・ノードの表示方法

ソース・ノードに現在マップされていないターゲット・ノードのリストを表示できます。

マップされていないターゲット・ノードを表示する手順は、次のとおりです。

  1. XSLTマッパーの中央のパネルで右クリックして、「完了ステータス」を選択します。

    このダイアログの下部には、マップされていないターゲット・ノードの数に関する統計が示されます。このダイアログを使用すると、「XSLマップのテスト」ダイアログでトランスフォーメーション・マッピングのロジックをテストする前に、マップされていないノードを識別し、修正できます。

  2. リストからターゲット・ノードを選択します。そのノードがハイライト表示されます。チェック・マークは、ターゲット・ノードがマップされる必要があることを示しています。マップされる必要がない場合、そのチェック・ボックスは空です。


    注意:

    「完了ステータス」ダイアログでは、ノードに対するXSD定義に基づいてノードが必須としてマークされます。ノードが必須としてマークされていても、その親ノードがオプションである場合やXSLマッピングの一部でない場合は、特定のマッピングに対して実際には必須でない可能性があります。

    図37-36に、「完了ステータス」ダイアログの例を示します。

    図37-36 「完了ステータス」

    図37-36の説明が続きます
    「図37-36 「完了ステータス」」の説明

37.3.10 ディクショナリの生成方法

ディクショナリは、自動マッピングで使用されるXMLファイルです。フィールド名に対するシノニムが含まれています。たとえば、要素QtyOrderedを要素Quantityにマップする必要があるとします。このとき、要素名QtyOrderedQuantityは互いにシノニムです。このマッピングがマップ間で一般的に使用される場合は、これらのシノニムをディクショナリ・ファイルに保存することをお薦めします。保存したシノニムは、自動マッピングを使用して別のマップに再度適用できます。

ディクショナリは、既存のどのXSLマップからでも作成でき、XSLTマッパーでは既存のマップに対して自動的に生成されないすべてのマッピングを格納できます。

ディクショナリを生成して使用する手順は、次のとおりです。

  1. 他のマップで再利用する特定のマッピングが含まれているXSLマップを作成します。

  2. 「ツール」「プリファレンス」「XSLマップ」「自動マップ」の順に選択し、現在の自動マッピングの設定をメモしておきます。


    注意:

    ディクショナリ・エントリは現在の自動マッピングの設定に依存しているため、将来使用するためにこれらの設定をメモしておく必要があります。ディクショナリ・マッピングを後で再度適用するには、自動マッピング・プリファレンスをディクショナリの作成時に有効だった内容に設定する方法が最善です。したがって、ディクショナリが作成された時点の自動マッピングの設定をメモしておくことが重要です。

  3. XSLTマッパーの中央のパネルを右クリックして「ディクショナリの生成」を選択します。

    この結果、ディクショナリ名とそのディクショナリを格納するディレクトリの入力を求めるプロンプトが表示されます。

  4. 「ディクショナリを開く」チェック・ボックスを選択して、作成したディクショナリを表示します。ディクショナリ・ファイルが空の場合、このチェック・ボックスは、現在の自動マッピングの設定ではフィールドがマップされていないため、マップされたフィールドがないことを示します。

  5. ディクショナリを別のマップで使用するには、「ツール」「プリファレンス」「XSLマップ」「自動マップ」の順に選択して、ディクショナリをロードします。

  6. 「ディクショナリ」リストの下の「追加」をクリックします。

  7. 類似のマップから以前に作成したディクショナリXMLファイルを参照して選択します。

  8. 「OK」をクリックします。

  9. 自動マッピング・プリファレンスを終了する前に、ディクショナリの作成時に使用した設定と一致するようにマッピングの設定を変更します。

  10. 「OK」をクリックします。

  11. 新しいマップの中で、保存済のディクショナリ・マッピングに対応するすべての部分について自動マッピングを実行します。

自動マッピングの詳細は、第37.3.7項「ノードを自動的にマップする方法」を参照してください。

37.3.11 関数が使用されている場合のディクショナリの生成に関する注意事項

関数が使用されているマッピングでは、ディクショナリを作成できません。このような状況では、自動的にマップされた要素またはXPath関数のマッピングがある要素について、ディクショナリXMLの指示が欠落します。たとえば、設計時に文字列関数を使用してXSDをマップしたとします。XSLTマッパーの中央パネルを右クリックして「ディクショナリの生成」を選択すると、ディクショナリは作成されますが、マッピング時に文字列関数を使用したすべての場所で、指示が作成されません。

単純なタイプのマッピングついては、ディクショナリを作成できます。

37.3.12 マップ・パラメータおよびマップ変数の作成方法

マップ・パラメータおよびマップ変数を作成できます。マップ・パラメータはソース・ツリーで作成し、マップ変数はターゲット・ツリーで作成します。

次の点に注意してください。

  • パラメータはソース・ツリーで作成され、グローバルであるため、マッピングのすべての場所で使用できます。

  • 変数はターゲット・ツリーで作成され、グローバルまたはローカルのいずれかです。ターゲット・ツリーのどの場所で定義されたかによって、グローバルであるか、ローカルであるかが決まります。

    • グローバル変数は<target>ノードの直下、および実際のターゲット・スキーマ(例: POAcknowledge)のすぐ上で定義されます。グローバル変数を作成するには、<target>ノードを右クリックします。

    • ローカル変数は、実際のターゲット・スキーマの下にある特定のノード(例: スキーマPOAcknowledge上のサブノードname)で定義されます。ローカル変数は、それぞれが異なるスコープ内にあれば、同じ名前を設定できます。ローカル変数はそのスコープ内でのみ使用できるのに対して、グローバル変数はマッピング内のすべての場所で使用できます。

37.3.12.1 マップ・パラメータの作成

マップ・パラメータを作成する手順は、次のとおりです。

  1. ソース・ツリーのルートを右クリックし、「パラメータの追加」を選択します。

    図37-37に示す「パラメータの追加」ダイアログが表示されます。

  2. パラメータの詳細を指定します。この例では、discountという名前のパラメータが、数値のデフォルト値0.0で指定されます。

    図37-37 「パラメータの追加」ダイアログ

    図37-37の説明が続きます
    「図37-37 「パラメータの追加」ダイアログ」の説明

  3. 「OK」をクリックします。

37.3.12.2 マップ変数の作成

マップ変数を作成する手順は、次のとおりです。

  1. ターゲット・ツリーで、ターゲット・ツリーのルートまたはいずれかのノードを右クリックして「変数の追加」を選択します。

    図37-38に示す「変数の追加」ダイアログが表示されます。

  2. 詳細を指定します。

    変数はターゲット・ツリーに表示されるため、変数を挿入した後でターゲット・ツリーの他のXSLTコンストラクトと同じようにXPath式を設定できます。このため、このダイアログで必要な情報は変数の名前のみです。変数のコンテンツを設定するには、このダイアログを使用して入力する必要があります。コンテンツは、変数上のXSLT select属性とは別に処理されます。

    図37-38 「変数の追加」ダイアログ

    図37-38の説明が続きます
    「図37-38 「変数の追加」ダイアログ」の説明

  3. 「OK」をクリックします。

    ターゲット・ツリーの選択した位置に変数が追加されます。変数の横には、最初は警告アイコンが表示されます。これは、選択XPath文が定義されていないことを示しています。他のターゲット要素やXSLTコンストラクトで行ったのと同じように、ソース・ノードのリンク、関数の作成、または明示的なXPath式の定義を通じてXPathを定義します。

37.3.13 ソース・ノードおよびターゲット・ノードの検索方法

ソース・ノードおよびターゲット・ノードを検索できます。たとえば、invoiceというソース・ノードでpriceというサブノードの出現箇所をすべて検索できます。

ソース・ノードとターゲット・ノードを検索する手順は、次のとおりです。

  1. ソース・ノードまたはターゲット・ノードを右クリックして、コンテキスト・メニューから「検索」を選択します。

    図37-39に示す「ノード検索」ダイアログが表示されます。

  2. 検索キーワードを入力します。

  3. 必要に応じて追加の詳細を指定します。例:

    • 注釈テキストも検索対象とする場合は、「注釈の検索」を選択します。

    • 検索の範囲を指定します。ソース・ツリーまたはターゲット・ツリー全体の検索、選択した位置からの検索、または選択したサブツリー内の検索を指定できます。

    図37-39 「ノード検索」ダイアログ

    図37-39の説明が続きます
    「図37-39 「ノード検索」ダイアログ」の説明

    検出された最初の一致がハイライト表示され、「検索」ダイアログが閉じます。一致が検出されない場合は、画面にメッセージが表示されます。

  4. 指定した方向の次の一致を検索するには、 [F3] キーを押します。逆方向に検索するには、 [Shift] キーを押しながら [F3] キーを押します。


    注意:

    関数、または「テキストの設定」オプションで設定したテキスト値は検索できません。

37.3.14 マップされないターゲット要素生成の制御方法

ターゲットXSL内への空要素の生成を制御する場合は、次の5つのオプションがあります。

  • マップされないノードを生成しません(デフォルトの選択)。

  • すべてのマップされていないターゲット・ノードに空ノードを生成します。

  • すべてのマップされていない必須ターゲット・ノードに空ノードを生成します。

  • すべてのマップされていないNull値可能なターゲット・ノードに空ノードを生成します。

  • すべてのマップされていない必須またはNull値可能なターゲット・ノードに空ノードを生成します。

これらのオプションは、次のように設定します。

  • グローバル・レベルの場合

    「ツール」「プリファレンス」「XSLマップ」の順に選択します。グローバル設定はマップが作成された場合のみ適用されます。

  • マップ・レベルの場合

    マップのコンテキスト・メニューから「XSL生成オプション」を選択します。次に、マップ・レベルでオプションを設定することで、各マップを別々に設定できます。

選択したマップされないノードに対して空の要素が生成されます。マップされないノードがnillableの場合は、xsi:nil="true"で生成されます。

37.3.15 XSLT文書の要素を無視する方法

ソース・スキーマまたはターゲット・スキーマで見つからない要素が、XSLTマッパーによってXSLT文書内で検出された場合、その要素は処理されず、「無効なソース・ノード・パス({0})」エラーが表示されます。XSLマップの生成は失敗します。XSLTの解析中に、これら特定の要素を無視し、保存しておくようにXSLTマッパーに指示するファイルを作成およびインポートできます。これを行うには、Oracle JDeveloperの「ツール」メイン・メニューで「プリファレンス」「XSLマップ」の順に選択します。

たとえば、事前処理によってmyElementおよびmyOtherElementWithNSという要素が作成される場合があり、これらの要素は、XSLT文書のグラフィカル表示の作成時に、XSLTマッパーによって無視されるようにするとします。無視するこれらの要素を使用し、例37-10に示す構文を記述したファイルを作成してインポートします。

例37-10 無視する要素を使用したファイル

<elements-to-ignore>
   <element name="myElement"/>
   <element name="myOtherElementWithNS" namespace="NS"/>
</elements-to-ignore>

このファイルをインポートした後は、Oracle JDeveloperを再起動する必要があります。

37.3.16 XSLTマッパーでスキーマを置換する方法

XSLTマッパーに現在表示されているマップ・ソース・スキーマとターゲット・スキーマは置換できます。

XSLTマッパーでスキーマを置換する手順は、次のとおりです。

  1. ソース・パネルまたはターゲット・パネルのいずれかで右クリックし、「スキーマの置換え」を選択します。

    図37-40に示すように、「タイプ・チューザ」ダイアログが開き、使用する新しいソース・スキーマまたはターゲット・スキーマを選択できます。

    図37-40 スキーマの置換

    図37-40の説明が続きます
    「図37-40 スキーマの置換」の説明

  2. 置換スキーマを選択して「OK」をクリックします。

    現在のマップの式を消去するかどうかを選択するプロンプトが表示されます。

  3. 「はい」または「いいえ」を選択します。式が消去されない場合は、設計ビューを再度表示する前にソース・ビューのマップを修正する必要がある場合があります。

37.3.17 ソース・ツリーとターゲット・ツリーの要素とタイプを置換する方法

ソース・ツリーとターゲット・ツリーの要素とタイプは置換できます。

要素置換は、次の場合に使用します。

  • 要素が、基礎となるスキーマ内の置換グループの先頭として定義されている場合。要素は抽象でも抽象でなくてもかまいません。置換グループの任意の要素を元の要素と置換できます。

  • 要素がany要素として定義されている場合。スキーマに定義されているすべてのグローバル要素を置換できます。

タイプ置換は、次の場合に使用します。

  • 基礎となるスキーマでグローバル・タイプを使用でき、そのタイプがソース・ツリーまたはターゲット・ツリーの要素のタイプから導出されている場合。この場合は、グローバル・タイプを要素の元のタイプと置換できます。抽象タイプから導出された任意のタイプをその抽象タイプと置換できます。

  • ソース・ツリーまたはターゲット・ツリーの要素がanyTypeタイプとして定義されている場合。この場合は、スキーマに定義されている任意のグローバル・タイプを置換できます。

タイプ置換は、XMLのxsi:type属性の使用によってサポートされます。

ソース・ツリーとターゲット・ツリーの要素またはタイプを置換する手順は、次のとおりです。

  1. ソース・ツリーまたはターゲット・ツリーで、置換を適用する要素を右クリックします。

  2. コンテキスト・メニューから「要素またはタイプの置換」を選択します。このオプションが無効な場合、基礎となるスキーマの要素またはそのタイプに対して可能な置換はありません。

    図37-41に示す「要素またはタイプの置換」ダイアログが表示されます。

    図37-41 「要素またはタイプの置換」ダイアログ

    図37-41の説明が続きます
    「図37-41 「要素またはタイプの置換」ダイアログ」の説明

  3. 要素の置換またはタイプの置換のいずれかを選択します(基礎となるスキーマによっては1つしか使用できない場合があります)。

    置換可能なグローバル・タイプまたは要素のリストがダイアログに表示されます。

  4. 置換するタイプまたは要素を選択します。

  5. 「OK」をクリックします。

    要素またはタイプが、最初に選択した要素と置換されます。この選択によって表示される結果は、この置換がタイプ置換と要素置換のいずれであるか、および対象がソース・ツリーまたはターゲット・ツリーのいずれであるかによって異なります。

    • 要素がターゲット・ツリーにあり、タイプ置換が選択された場合

      図37-42に示すように、元の要素の下にxsi:type属性が追加されます。これは設計ビューでは使用できず、選択されたタイプ値に設定されます。ノードが置換されたことを示す「S」アイコンが表示されます。置換タイプ内の任意の構造要素にマップできます。

      図37-42 要素がターゲット・ツリーにあり、タイプ置換が選択された場合

      図37-42の説明が続きます
      「図37-42 要素がターゲット・ツリーにあり、タイプ置換が選択された場合」の説明

    • 要素がソース・ツリーにあり、タイプ置換が選択された場合

      図37-43に示すように、元の要素の下にxsi:type属性が追加されます。ノードが置換されたことを示す「S」アイコンが表示されます。置換タイプ内の任意の構造要素からマップできます。

      図37-43 要素がソース・ツリーにあり、タイプ置換が選択された場合

      図37-43の説明が続きます
      「図37-43 要素がソース・ツリーにあり、タイプ置換が選択された場合」の説明

    • 要素がターゲット・ツリーにあり、要素置換が選択された場合

      図37-44に示すように、ツリー内の元の要素が置換要素で置換されます。コメントは元の要素名が追加されたことを示し、ノードが置換されたことを示す「S」アイコンが表示されます。置換要素内の任意の構造要素にマップできます。

      図37-44 要素がターゲット・ツリーにあり、要素置換が選択された場合

      図37-44の説明が続きます
      「図37-44 要素がターゲット・ツリーにあり、要素置換が選択された場合」の説明

    • 要素がソース・ツリーにあり、要素置換が選択された場合

      図37-45に示すように、ソース・ツリーの<要素置換>という新規ノードの下に、元の要素と可能な置換の両方が表示されます。ノードが追加されたことを示す「S」アイコンが表示されます。この機能を使用すると、ソース・オブジェクトに元のノードまたは置換ノードのいずれかを格納できるマップを作成できます。置換要素内の任意の構造要素にマップできます。

      図37-45 要素がソース・ツリーにあり、要素置換が選択された場合

      図37-45の説明が続きます
      「図37-45 要素がソース・ツリーにあり、要素置換が選択された場合」の説明


      注意:

      要素置換と異なり、ソース・ツリーに表示できるタイプ置換は一度に1つのみです。このために、元のタイプや置換タイプを必要に応じてソースに設定できるマップが作成できなくなるわけではありません。いつでも別のタイプに切り替えることができます。ある時点ではソース・ツリーに表示されない可能性があるノードにマップするXPath式も保持されます。

  6. 置換ノードを削除するには、「S」アイコンがあるノードを右クリックし、コンテキスト・メニューから「置換の削除」を選択します。

  7. 置換が可能なすべてのノードを表示するには、ソース・ツリーまたはターゲット・ツリーを右クリックして、「置換ノード・アイコンの表示」を選択します。

    図37-46に示すように、置換が可能なすべてのノードには、「*」アイコンが表示されます。

    図37-46 可能なすべての置換

    図37-46の説明が続きます
    「図37-46 可能なすべての置換」の説明

  8. アイコンを非表示にするには、右クリックして「置換ノード・アイコンの非表示」を選択します。

37.4 マップのテスト

XSLTマッパーには、スタイルシートまたはマップをテストするためのテスト・ツールが用意されています。テスト・ツールを起動するには、図37-47に示すように、「テスト」メニュー項目を選択します。

図37-47 テスト・ダイアログの起動

テスト・ダイアログの起動
「図37-47 テスト・ダイアログの起動」の説明

37.4.1 トランスフォーメーション・マッピングのロジックをテストする方法

図37-48に示す「XSLマップのテスト」ダイアログでは、XSLTマッパーで設計したトランスフォーメーション・マッピングのロジックをテストできます。指定したテスト設定は保存されるため、次回のテスト時に再度入力する必要はありません。Oracle JDeveloperを閉じて再度開いた場合は、テスト設定をもう一度入力する必要があります。

図37-48 「XSLマップのテスト」ダイアログ

テスト・ダイアログ
「図37-48 「XSLマップのテスト」ダイアログ」の説明

トランスフォーメーション・マッピングのロジックをテストする手順は、次のとおりです。

  1. 「ソースXMLファイル」フィールドで、テスト用にサンプルのソースXMLファイルを生成するか、「参照」をクリックして別のソースXMLファイルを指定します。

    「OK」をクリックすると、ソースXMLファイルが検証されます。検証に合格するとトランスフォーメーションが実行され、ターゲットXMLファイルが作成されます。

    検証に失敗した場合、トランスフォーメーションは実行されず、画面にメッセージが表示されます。

  2. マップ・ソースXSDスキーマに基づいてサンプルのXMLファイルを作成するには、「ソースXMLファイルの生成」チェック・ボックスを選択します。

  3. テスト用のソースXMLファイルを表示するには、「ソースXMLファイルの表示」チェック・ボックスを選択します。ソースXMLファイルがOracle JDeveloperのXMLエディタに表示されます。

    マップに定義済のパラメータがある場合は、「スキーマのあるパラメータ」または「スキーマのないパラメータ」表が表示されます。

    1. 「スキーマのあるパラメータ」表が表示された場合は、「参照」ボタンを使用してそのパラメータの入力XMLファイルを指定できます。ファイルを生成する場合は「ファイルの生成」チェック・ボックスを選択します。

    2. 「スキーマのないパラメータ」表が表示された場合は、「値の指定」チェック・ボックスを選択し、「タイプ」列と「値」列を適切に編集して値を指定します。

  4. 「ターゲットXMLファイル」フィールドにファイル名を入力するか、トランスフォーメーションからの結果XML文書が格納されるファイルの名前を参照します。

  5. テスト用のターゲットXMLファイルを表示するには、「ターゲットXMLファイルの表示」チェック・ボックスを選択します。ターゲットXMLファイルがOracle JDeveloperのXMLエディタに表示されます。

  6. ソースとターゲット両方のXMLを表示する場合は、XMLエディタのレイアウトをカスタマイズできます。右上隅にある「自動レイアウトの有効化」を選択してパターンの1つをクリックします。

  7. 「OK」をクリックします。

    図37-49に示すように、テスト結果が表示されます。

    この例では、ソースXMLとターゲットXMLが並んで表示され、その下にXSLマップが表示されています(デフォルト設定)。「スキーマのあるパラメータ」表に対応する追加のソースXMLファイルが、メイン・ソース・ファイルと同じ場所にタブとして表示されます。エディタを右クリックして「XMLの検証」を選択すると、ソースまたはターゲットのXMLを、マップのソースまたはターゲットのXSDスキーマと照合して検証できます。

    図37-49 テスト結果

    図37-49の説明が続きます
    「図37-49 テスト結果」の説明


注意:

XSLマップ・ファイルにドメイン値マップ(DVM)および相互参照(XREF) XPath関数が含まれている場合は、テストできません。これらの関数は、設計時には実行できず、実行時にのみ実行できます。

37.4.2 レポートの生成方法

次の情報を備えたHTMLレポートを生成できます。

  • XSLマップのファイル名、ソース・スキーマとターゲット・スキーマのファイル名、そのルート要素名、およびそのルート要素のネームスペース

  • ターゲット文書のマッピング

  • マップされていないターゲット・フィールド(必須フィールドを含む)

  • サンプル・トランスフォーメーション・マップの実行

次の手順に従って、レポートを生成します。

  1. 中央のパネルで右クリックして、「レポートの生成」を選択します。

    図37-50に示すように、「レポートの生成」ダイアログが表示されます。マップのパラメータが定義されている場合は、適切なパラメータ表が表示されることに注意してください。

    図37-50 「レポートの生成」ダイアログ

    図37-50の説明が続きます
    「図37-50 「レポートの生成」ダイアログ」の説明

    フィールドの詳細は、「レポートの生成」ダイアログのオンライン・ヘルプを参照してください。

37.4.2.1 レポート生成時のメモリー・エラーの修正

レポートを生成しようとしたときにメモリー不足のエラーが発生した場合は、次のように、JVMのヒープ・サイズを増やします。

JVMのヒープ・サイズを増やす手順は、次のとおりです。

  1. JDev_Oracle_Home\jdev\bin\jdev.confファイルを開きます。

  2. 次のセクションに移動します。

    # Set the maximum heap to 512M
    #
    AddVMOption     -Xmx512M
    
  3. 次のように、ヒープのサイズを増やします(例: 1024に変更)。

    AddVMOption     -Xmx1024M
    

また、レポートの生成前に「レポートの生成」ダイアログの「レポートを開く」オプションの選択を解除することもできます。

37.4.3 サンプルXML生成のカスタマイズ方法

サンプルXMLの生成は、次のパラメータを指定してカスタマイズできます。Oracle JDeveloperの「ツール」メイン・メニューで、「プリファレンス」「XSLマップ」の順に選択し、「プリファレンス」ダイアログを表示します。

  • 繰返し要素の数

    この数は、要素の属性maxOccurs1より大きい値に設定されている場合に、要素の繰返し作成数を指定します。指定した値が特定の要素に対するmaxOccurs属性の値より大きい場合、その特定の要素に対する繰返し作成数は、指定した数ではなく、このmaxOccursの値となります。

  • オプション要素の生成

    選択されている場合は、オプション要素(その属性minOccursが値0に設定されている)が必須要素(その属性minOccurs0より大きい値に設定されている)と同様に生成されます。

  • 最大の深さ

    サンプルXMLの生成において、オプション要素による再帰の発生を回避するために、オプション要素の生成限度であるXML文書階層ツリーの最大の深さを指定します。

37.5 XSLTマッパーの機能のデモンストレーション

このサンプルでは、XSLTマッパーの次の機能について具体的な例を示します。

このサンプルに加えて、Oracle Technology Network(OTN)からダウンロード可能な他のトランスフォーメーション・サンプルがあります。表37-2で、これらのサンプルについて説明します。これらのサンプルにアクセスするには、次のURLを参照してください。

https://soasamples.samplecode.oracle.com/

表37-2 トランスフォーメーション・サンプル

サンプル 説明

mapper-101-basic-mapping

XSLTマップの作成および基本的な編集方法を説明します。

mapper-102-import-and-test

次のXSLマッパー機能について説明します。

  • 外部XSLのインポート

  • テスト実行とXMLエディタ検証の概要

  • レポートの実行

mapper-104-auto-mapping

XSLTマッパーの自動マッピング機能について説明します。

mapper-105-multiple-sources

複数ソースの使用について説明します。マップ・サンプルの作成プロセスで、次のトピックについても説明します。

  • クローニングしたfor-eachの挿入

  • XPath式への述語の追加

  • 変数の使用

mapper-107-extension-functions

ユーザー定義拡張関数の使用について説明します。

mapper-108-substitution-mapping

次の場合の要素置換の使用について説明します。

  • 要素が、基礎となるスキーマ内の置換グループの先頭として定義されている場合。要素は抽象でも抽象でなくてもかまいません。置換グループの任意の要素を元の要素と置換できます。

  • 要素がany要素として定義されている場合。スキーマに定義されているすべてのグローバル要素をany要素と置換できます。これは、any要素の定義に設定されているネームスペース制約の影響を受けます。

mapper-109-whats-new

XSLTマッパーの11gの新機能について説明します。これらの機能は、第37.5.1項「アプリケーションのオープン」から第37.5.7項「マップのテスト」で説明します。


37.5.1 アプリケーションのオープン

最初にサンプル・アプリケーションを作成します。作成したアプリケーションは、ステップ1で説明するWhatsNewApplicationディレクトリで提供されるアプリケーションと同じです。

  1. サンプルmapper-109-whats-newをOTNからダウンロードします。

    サンプルには、次のファイルとディレクトリが含まれています。

    • artifacts/schemas/po.xsdおよびAttachment.xsd: ソース・スキーマ

    • artifacts/schemas/invoice.xsdおよびReasonCodes.xsd: ターゲット・スキーマ

    • artifacts/application: このサンプルの開始アプリケーション

    • WhatsNewApplicationディレクトリ: 完了後のサンプル・マップ

  2. artifacts/applicationフォルダを別の作業領域にコピーします。

  3. Oracle JDeveloperを起動します。

  4. 別の領域にコピーしたartifacts/applicationフォルダ内のWhatsNewApplication.jwsをクリックします。

  5. ファイルを移行するかどうかを尋ねるプロンプトが表示された場合は、「はい」をクリックします。

    「アプリケーション・ナビゲータ」に、WhatsNewApplicationが表示されます。

37.5.2 BPELプロセスの新規XSLTマップの作成

ここでは、2つのソースがある新規XSLTマップを作成します。このマップは、WhatsNewApplicationアプリケーションに含まれているBPELプロセスから起動されます。

  1. 「アプリケーション・ナビゲータ」で、ProcessPO2Invoice.bpel BPELプロセスをダブルクリックします。

  2. 「コンポーネント・パレット」の「Oracle Extensions」セクションから、transformアクティビティをSetDiscontinuedProducts assignアクティビティの下にドラッグします。

  3. transformアクティビティをダブルクリックします。

  4. 「一般」タブの「名前」フィールドにPo2Invoiceと入力します。

  5. 「トランスフォーメーション」タブで、次の手順を実行します。

    1. 「追加」アイコンをクリックします。

    2. 「ソース変数」リストから、「inputVariable」を選択します。

    3. 「ソース・パート」リストから、「payload」を選択します。

      この変数には、BPELプロセスに対する入力である注文書が含まれています。

    4. 「OK」をクリックします。

    5. 「追加」アイコンを2回クリックし、「ソース変数」リストから「DiscontinuedList」を選択します。transformationアクティビティの前のSetDiscontinuedProducts assignアクティビティに変数が作成されます。

    6. 「OK」をクリックします。

    7. 「ターゲット変数」リストから、「outputVariable」を選択します。これは、BPELプロセスから戻された請求書です。

    8. 「マッパー・ファイル」フィールドで、名前をxsl/Po2Invoiceに変更します。

    9. マッパー名フィールドの右側にある「マッピングの作成」アイコンをクリックして、マッパー・ファイルを作成し、開きます。

      XSLTマッパーが開きます。

    10. 「ファイル」メニューから「すべて保存」をクリックします。作成したマップは図37-51のようになります。2番目のソースがDiscontinuedListという名前でパラメータとしてロードされていることに注意してください。

      図37-51 XSLTマッパー・ファイル

      図37-51の説明が続きます
      「図37-51 XSLTマッパー・ファイル」の説明

37.5.3 タイプ置換を使用した注文書品目のマップ

ここでは、タイプ置換と要素置換を使用して、注文書の品目を請求書の品目にマップします。

  1. ターゲット・ツリーで、ツリーを開いてInvoice/Items/Itemを表示します。「Item」要素の横にエラー・アイコンが表示されていることに注意してください。

  2. 要素の上にマウスを移動して、この要素が抽象タイプとして定義されていることを示すツールのヒントを表示します。

    Item要素にマップするには、最初に、最終的なXML出力で要素に使用されるタイプを示す必要があります。

  3. 次の手順を実行して、要素で使用するタイプを示します。

    1. 「Item」要素を右クリックして、「要素またはタイプの置換」を選択します。

      「要素またはタイプの置換」ダイアログが表示されます。

    2. リストから「ShippedItemType」を選択して「OK」をクリックします。

      Item要素の構造がすべて挿入されます。xsi:type属性によって、ターゲットXMLのItem要素のタイプが設定されます。


      注意:

      invoice.xsdを表示した場合は、ShippedItemTypeが、Item要素のタイプである抽象タイプItemTypeから導出されていることに注意してください。

  4. PurchaseOrder/ItemsInvoice/Itemsにドラッグして自動マッパーを起動し、これらのノードをマップします。自動マッピング機能を確認するには、サンプルのmapper-104-auto-mappingを参照してください。

    完了すると、マップ内のItem要素は、図37-52のようになります。

    図37-52 XSLTマッパー内のItem要素

    図37-52の説明が続きます
    「図37-52 XSLTマッパー内のItem要素」の説明

  5. 「ファイル」メニューから「すべて保存」を選択して、マップ・ファイルを保存します。

37.5.4 追加のソース要素の参照

ここでは、追加のソース変数であるDiscontinuedListの情報を使用して、製造が中止された品目を削除します。品目の製品名がDiscontinuedListに含まれている場合、その品目は出荷できず、最終出荷品目リストに掲載することはできません。

  1. ターゲット・ツリーの「Item」ノードの上に「if」文を追加します。追加するには、「Item」ノードを右クリックして、「XSLノードの追加」「if」の順に選択します。

    if文では、現在の品目名を使用して、製造中止の製品が「DiscontinuedList」に存在しているかどうかをテストする必要があります。品目が出荷品目に追加されるのは、その品目が「DiscontinuedList」に含まれていない場合のみです。if文に対するテスト式を定義する方法は多数あります。その中の1つの方法を次の手順で説明します。

  2. 次のように選択してif文のテスト式を定義します(変数の設定方法が、以前のバージョンのOracle JDeveloperから変更されていることに注意してください)。

    1. 「Invoice」ノードを右クリックして「変数の追加」を選択し、ターゲット・ツリーにグローバル変数を追加します。

      「変数の追加」ダイアログが表示されます。

    2. 「ローカル名」フィールドに、DelimitedListと入力します。以降の手順で、この変数には、製造中止製品名の区切りリストを含む文字列が設定されます。

    3. 「OK」をクリックします。

      変数が追加され、横に警告アイコンが表示されます。

    4. 変数の値を設定するには、「コンポーネント・パレット」の「String」セクションから「create-delimited-string」関数を中央のパネルにドラッグします。

    5. DiscontinuedList/ProductName「create-delimited-string」関数の入力側にドラッグします。

    6. 「create-delimited-string」関数の出力側を「DelimitedList」という新規変数にドラッグします。

    7. 「create-delimited-string」関数をダブルクリックして、「関数の編集」ダイアログを開きます。

    8. 「デリミタ」フィールドに、パイプ(|)文字を追加します。

    9. 「OK」をクリックします。

      入力ソースは、XPath式では$DiscontinuedListで参照されることに注意してください。このソースは、XPath式で入力パラメータとして参照されます。

  3. if文のXPath式を設定するには、「コンポーネント・パレット」の「String」セクションから「contains」関数を中央のパネルにドラッグします。

  4. 「コンポーネント・パレット」の「Logical Functions」セクションの「not」関数を、ステップ3で追加した「contains」関数を囲む影付きの領域にドラッグします。

  5. 「contains」関数の出力側の線を「not」関数の入力側にドラッグします。

  6. 「not」関数の出力側の線を「if」文にドラッグします。

  7. 「contains」関数をダブルクリックして、「関数の編集」ダイアログを開きます。

  8. 「inputString」および「searchString」に値を入力し、「OK」をクリックします。

  9. 「ファイル」メニューから「すべて保存」を選択して、マップ・ファイルを保存します。

    マップ・ファイルは図37-53のようになります。

    図37-53 マッパー・ファイル

    図37-53の説明が続きます
    「図37-53 マッパー・ファイル」の説明

37.5.5 要素置換を使用した出荷先住所のマップ

ここでは、ソースの置換された出荷連絡先要素をターゲットのShippedTo要素にマップします。

  1. ソースのPurchaseOrder/CustomerContacts要素を開いて「Contact」要素を表示します。

    この要素の横にエラー・アイコンが表示されていることに注意してください。

  2. 要素の上にマウスを置き、この要素が抽象であることを示すツールのヒントを表示します。

    この状態で、要素置換を実行して要素をマップする必要があります。

  3. ソース・ツリーの「Contact」要素を右クリックして、「要素またはタイプの置換」を選択します。

    「要素またはタイプの置換」ダイアログが表示され、抽象要素Contactの置換グループの要素リストが示されます。

  4. 「ShipToContact」を選択し、「OK」をクリックします。

    これは、入力XMLに使用する要素です。ソース・ツリーに「ShipToContact」要素の構造が表示されます。

  5. ソース・ツリーのShipToContact/InternationalAddress要素を開いて、住所のフィールドを表示します。

  6. ターゲット・ツリーの「ShippedTo」要素を開いて、ターゲットの住所のフィールドを表示します。

    ここでは、自動マッパーを使用できることを示すフィールド名の類似度に注意してください。

  7. ソース・ツリーの「InternationalAddress」要素をターゲット・ツリーの「ShippedTo」要素にドラッグし、自動マッパーを使用して、これらの要素の下の住所フィールドをマップします。

  8. マップのこのセクションが図37-54に示すとおりになるように、自動マッパーで照合されない残りの要素をマップします。

    図37-54 XSLTマッパー

    図37-54の説明が続きます
    「図37-54 XSLTマッパー」の説明

  9. 「ファイル」メニューから「すべて保存」を選択して、マップ・ファイルを保存します。

37.5.6 残りのフィールドのマップ

  1. PurchaseOrder/IDInvoice/IDにマップします。

  2. Invoice/Dataを開いて「any」要素を表示します。

  3. copy-of xsl文を使用して、ソースからターゲットの「any」要素に添付ファイル・データをコピーします。

    1. Invoice/Data/any要素を右クリックして、「XSLノードの追加」「copy-of」の順に選択します。

      copy-of文が追加され、元の「any」要素はグレー表示になります。これは、この要素がcopy-of文で選択されたノードで置換されることを示します。

    2. copy-ofの選択内容を設定するには、ソース・ツリーのPurchaseOrder/Attachments要素を「copy-of」文にドラッグします。

  4. 次の手順を実行して、PurchaseOrder/CommentフィールドをInvoice/Commentフィールドにマップします。Invoice/CommentフィールドがanyType要素であることに注意してください。

    1. Invoice/Commentフィールドを右クリックして、「要素またはタイプの置換」を選択します。

    2. 提供されているタイプ・リストから「xsd:string」を選択します。

    3. PurchaseOrder/CommentフィールドをInvoice/Commentフィールドにドラッグしてフィールドをマップします。

  5. XSL sort文をfor-each文に追加します。

    1. ターゲット・ツリーの「for-each」文を右クリックして、「XSLノードの追加」「sort」の順に選択します。

      「ソート編集ダイアログ」が表示されます。

    2. 「データ型に従ってソート」で「数値」を選択します。

    3. ソート順で「降順」を選択します。

    4. 「OK」をクリックします。sortノードがターゲット・ツリーに追加されます。

    5. ソース・ツリーのPurchaseOrder/Items/Item/Priceをターゲット・ツリーの「sort」ノードにドラッグします。

      この操作で、ソート対象のフィールドが設定されます。

  6. 「ファイル」メニューから「すべて保存」を選択して、マップ・ファイルを保存します。マップは図37-55のようになります。

    図37-55 XSLTマッパー

    図37-55の説明が続きます
    「図37-55 XSLTマッパー」の説明

37.5.7 マップのテスト

XSLマップは、XSLTマッパーを使用して、Oracle JDeveloperのBPELプロセスとは別にテストできます。XMLファイルはマップに対する各ソース入力の入力にできます。

  1. 中央のパネルを右クリックし、「テスト」を選択します。

    警告ダイアログが表示された後、「XSLマップのテスト」ダイアログが表示されます。警告では、独自のサンプル入力XMLを作成してマップをテストできることが通知されます。サンプルXMLジェネレータでは、ソース・ツリーの置換に対するサンプル・データは生成できません。

    サンプル入力XMLファイルartifacts/xml/POInput.xmlが用意されています。

  2. 次の手順に従って、テスト用のサンプル入力ファイルを選択します。

    1. 「ソースXMLファイルの生成」チェック・ボックスの選択を解除します。

    2. 「ソースXMLファイル」フィールドの「参照」ボタンをクリックします。

    3. artifacts/xml/POInput.xmlファイルに移動して選択します。

    製造中止品目データが含まれた2番目のサンプル・ファイルが作成されています。このファイルはartifacts/xml/DiscontinuedItems.xmlです。

  3. 次の手順に従って、このファイルを2番目のソース入力として使用します。

    1. ダイアログの「スキーマのあるパラメータ」セクションで、「DiscontinuedList」パラメータ名の左側にある「ファイルの生成」チェック・ボックスの選択を解除します。

    2. 「DiscontinuedList」パラメータの「参照」をクリックし、artifacts/xml/DiscontinuedItems.xmlファイルを選択します。

  4. XSLマッパーのテスト・ダイアログで「OK」をクリックして、テストを実行します。

    マップの実行によってPO2Invoice-Target.xmlファイルが生成されます。PO2Invoice-Target.xmlファイルで、xsi:type属性の使用、copy-of文で作成されたAttachmentsノード、sort文による品目の順序を確認してください。