プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle SOA SuiteでのSOAアプリケーションの開発
12c (12.2.1.2.0)
E82771-02
目次へ移動
目次

前
次

40 XSLTマップ・エディタを使用したトランスフォーメーションの作成

この章では、XSLTマップ・エディタを使用して、ソース・スキーマ要素とターゲット・スキーマ要素の間のデータ・トランスフォーメーションを作成、設計およびテストする方法について説明します。

この章の内容は次のとおりです。

40.1 XSLTマップ・エディタの概要

XSLTマップ・エディタでは、グラフィック表示のエディタを使用して、XSLTスタイルシートを編集できます。また、XSLTソースを直接編集する機能もあります。

図40-1に、XSLTマップ・エディタを示します。エディタ下部のタブを使用して、グラフィック表示のエディタとソース・ビューを切り替えることができます。グラフィック表示のエディタを使用して編集するには、「設計」をクリックします。ソース・エディタを使用して編集するには、「ソース」をクリックします。

図40-1 XSLTマップ・エディタ

図40-1の説明が続きます
「図40-1 XSLTマップ・エディタ」の説明

「ソース」タブと「設計」タブを行き来できます。一方のタブで変更を加えると、もう一方のタブでも反映されます。「履歴」タブを使用して、リビジョンの履歴を表示し、編集履歴の任意の時点に戻ることも可能です。

XSLTマップ・エディタはXSLT 1.0およびXPath 1.0を完全にサポートしています。

XSLT 2.0を使用する場合は、ソース・ビューのXSLTのバージョンを変更し、JDeveloperを再起動します。

XSLT 2.0固有のすべてのコンストラクトをソース・ビューで追加する必要があります。その後、設計ビューへの切替えを選択して、引き続きマップを編集できます。XSLT 2.0固有のコンストラクトは設計ビューに表示されますが、ソース・ビューでのみ変更できます。XPath 2.0のコンストラクトも設計ビューで追加できます。ただし、XPath 2.0のコンストラクトは解析して、設計ビューの個別のグラフィカル要素にはできません。完全なXPath文をテキスト形式で編集する必要があります。ソースで「XSLTバージョン」が2.0に設定されている場合は、「コンポーネント」ウィンドウにXPath 2.0の機能が表示され、JDeveloperが再起動されます。

XSLTマップ・エディタでは、設計ビューで次の編集ビューを使用できます。

  • マップ・ビュー

  • XSLTビュー

XSLTエディタの右上隅にあるボタンを使用して、2つのビューを切り替えられます。XSLTエディタの従来のマップ・ビューを使用するには、「マップ」をクリックします。より複雑なXSLTマップ向けのXSLTビューを使用するには、「XSLT」をクリックします。

40.1.1 マップ・ビューの使用

図40-1に、XSLTマップ・エディタのマップ・ビューを示します。左側のペインには、受信ソースXMLドキュメントを表すソース・ツリーが含まれています。このソース・ツリーはXSDスキーマ・ファイルまたはサンプルXMLファイルから作成できます。

中央のペイン、またはキャンバスは、XSLT要素にマッピング可能なXPath式および関数をドロップする場所です。

右側のペインは、作成するXSLTのマージ済ビューを表すターゲット・ペインと、ターゲット・スキーマを表すターゲット・ツリーです。このターゲット・ツリーはXSDスキーマ・ファイルまたはサンプルXMLファイルから作成できます。

ターゲット・ツリーにイタリック体でグレー表示されたノードは、まだマッピングされていないノードを表します。これらのノードはXSLTの一部ではなく、便宜上表示されています。グレー表示のノードはマッピングされると、通常のフォントになり、XSLTマップに表示されます。

マップ・ビューでは、ソース・ツリーからターゲット・ツリーへのドラッグ・アンド・ドロップ・マッピングがサポートされます。さらにマップ・ビューでは、XPath関数のコールおよび、xsl:ifxsl:for-eachなどのXSLT文もサポートされます。

マップ・ビューではXSLT文がターゲット・ツリーから分離されないため、次の制限事項があります。

  • match='/'属性を含むXSLTテンプレート・ルールが1つのみサポートされます。

  • サポートされるXSLT文は、xsl:for-each、xsl:value-of、xsl:text、xsl:if、xsl:choose/when、xsl:variableおよびxsl:paramです。

XSLT文をターゲット・ツリーから分離する必要がある複雑なXSLT文には、XSLTビューを使用します。

40.1.2 XSLTビューの使用

XSLTビューはより高度なモードで、XSLT文をターゲット・ツリー・ドキュメントから分離できます。これにより、設計ビューのまま、複雑なXSLT文を作成できます。ソース・スキーマおよびターゲット・スキーマは、XSLTビューではオプションです。

XSLTビューにはマップ・ビューと同じペインが含まれますが、右側のターゲット・ペインは2つに分かれています。上のペインはXSLTペイン、下のペインはターゲット・ペインと呼びます。ターゲット・スキーマが定義されていない場合、下のペインは表示されません。ソース・スキーマが定義されていない場合でも、ソース・ペインはそのまま表示され、そこでXSLTから参照可能なパラメータおよび変数を追加できます。

XSLTビューでは、連続したXSLT文をいくつでも作成でき、これらの文をターゲット・ツリー・ノードに挿入する必要はありません。たとえば11gのマッパーでは、すべてのxsl:if文にターゲット出力ノードを1つ含める必要がありました。XSLTビューでは、xsl:if文を任意の場所で使用でき、他のXSLT文を含めることができます。

XSLTビューでは、すべてのXSLT 1.0文がサポートされます。また、XSLTビューは、ソース・スキーマおよびターゲット・スキーマを含む、または含まない複数のテンプレート・ルールもサポートしています。XSLTビューでは、複雑さに関係なく、任意のXSLTスタイルシートをグラフィック表示して編集できます。

40.1.3 「コンポーネント」ウィンドウの使用

「コンポーネント」ウィンドウには、XSLTマップで使用できるすべてのXPath関数と、XSLT要素およびテンプレートが含まれています。

「コンポーネント」ウィンドウは、デフォルトではOracle JDeveloperの右上隅にあります。「コンポーネント」ウィンドウが表示されない場合は、「ウィンドウ」メニューの「コンポーネント」をクリックすると、「コンポーネント」ウィンドウが表示されます。オプションで、「JDeveloper」ウィンドウの使いやすい場所に「コンポーネント」ウィンドウをドラッグする選択ができます。また、「コンポーネント」ウィンドウは必要に応じてサイズを変更できます。

「コンポーネント」ウィンドウではこれらの関数、要素およびテンプレートを次のカテゴリにまとめます。

  • 拡張XPath:

  • 一般XPath:

  • XML:

  • XSLT要素:

  • XSLTテンプレート:

  • すべてのページ:

  • ユーザー定義:

  • コンポーネント:

40.1.4 「プロパティ」ウィンドウの使用

「プロパティ」ウィンドウは、XSLTマップ・エディタで選択されたアイテムの内容およびプロパティを示します。これらのプロパティの一部は、編集も可能です。

「プロパティ」ウィンドウは、デフォルトではXSLTマップ・エディタの下にあります。「プロパティ」ウィンドウが表示されない場合は、「ウィンドウ」メニューの「プロパティ」をクリックすると、「プロパティ」ウィンドウが表示されます。オプションで、「JDeveloper」ウィンドウ内の使いやすい場所に「プロパティ」ウィンドウをドラッグする選択ができます。また、「プロパティ」ウィンドウは必要に応じてサイズを変更できます。

「プロパティ」ウィンドウは、通常、次のアイテムのプロパティの表示および編集に使用できます。

エディタで選択された要素 「プロパティ」ウィンドウの表示内容 編集の可否(はい/いいえ)

ソース・ツリー・ノード

選択された要素または属性のスキーマ情報

いいえ

ターゲット・ツリー・ノード

選択された要素または属性のスキーマ情報

いいえ

XSLTツリー・ノード: XSLT要素

XSLT要素の属性およびその値

はい

XSLTツリー・ノード: リテラル要素または属性

リテラル要素または属性の名前およびネームスペース

はい

「キャンバス」ペインのXPath式フォルダ

全文XPath式

はい

「キャンバス」ペインの式フォルダ内の「関数」アイコン

関数の各パラメータのXPathフィールド

はい

ソースおよびターゲット・ノードをつなぐ線

全文XPath式

はい

40.2 XSLTマップの作成

XSLT1マップは一から作成するか、BPEL、BPM、メディエータなど、他のエディタから作成できます。

40.2.1 XSLTマップの作成方法

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

  1. 「ファイル」メイン・メニューから、「新規」「XSLマップ」を選択します。または、プロジェクト・フォルダを右クリックして、「新規」「XSLマップ」の順に選択します。

    「XSLマップ・ファイルの作成」ダイアログが開きます。

  2. 「ファイル名」で、.xslマップ・ファイルの名前を指定します。
  3. 「ディレクトリ名」で、.xslファイルの宛先ディレクトリを選択します。
  4. 「ソース」で、「ソース・スキーマの使用」を選択してマップのソース・スキーマを指定します。
  5. 「プライマリ・ソース」で、「参照」をクリックしてソース・スキーマを選択します。「スキーマの選択」ダイアログ・ボックスが表示されます。
  6. XSDスキーマ・ファイルまたはWSDLファイルをソース・スキーマに使用する場合は、「スキーマの選択」を選択します。

    注意:

    または、サンプルXMLファイルをスキーマ・ソースとして使用できます。

    XMLファイルからスキーマを生成するには、「XMLから生成」を選択します。サンプル・ファイルを選択して、「開く」をクリックします。手順9に進みます。

  7. 「参照」をクリックして、ソース・スキーマのスキーマ・ファイルおよび要素を選択します。「タイプ・チューザ」ダイアログが表示されます。
  8. スキーマ・ファイルと対応する要素を、プロジェクト・スキーマ・ファイルまたはプロジェクトWSDLファイル・ツリーから選択します。「OK」をクリックします。

    必要なスキーマ・ファイルまたはWSDLファイルがツリーで使用できない場合は、ダイアログの右上隅にある「スキーマ・ファイルのインポート」ボタンまたは「WSDLファイルのインポート」ボタンをクリックして、スキーマ・ファイルまたはWSDLファイルをインポートできます。

  9. 「スキーマの選択」ダイアログで「OK」をクリックします。

    注意:

    「その他のソース」で緑色のプラス記号アイコン(+)で表示される「スキーマの追加」ボタンをクリックして、追加のソースをパラメータ形式で追加できます。

  10. 「ターゲット・スキーマの使用」を選択して、XSLマップのターゲット・スキーマを指定します。
  11. 「参照」をクリックしてターゲット・スキーマを選択します。「スキーマの選択」ダイアログが表示されます。
  12. ターゲット・スキーマの選択後、「スキーマの選択」ダイアログで「OK」をクリックします。

    注意:

    「ターゲット・スキーマ」を使用すると、現在の「プリファレンス」設定によっては、最初の要素および属性のノードがXSLTペインに生成される場合があります。

    デフォルト設定では、ターゲット・スキーマで必要なすべての要素および属性の後に、match=''/''属性を含むルート・テンプレートが生成されます。

  13. 「OK」をクリックして、XSLマップ・ファイルを作成します。

    注意:

    • XSLTマップの作成後、キャンバス・ペインのコンテキスト・メニューで適切なオプションを選択して、ソースおよびターゲット・スキーマを追加または置換できます。

      たとえば、ソース・ペインのコンテキスト・メニューで「パラメータの追加」を選択して、追加のソースをパラメータとして追加できます。

    • JDeveloperを使用して、XSLTマップで使用されているソースまたはターゲット・スキーマ・ファイルを編集できます。スキーマ・ファイルを保存すると、XSLTエディタのソースまたはターゲット・ツリーが自動的に更新されます。

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

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

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

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

    図40-2 transformアクティビティ

    図40-2の説明が続きます
    「図40-2 transformアクティビティ」の説明
  2. XSLT transformアクティビティをダブルクリックします。

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

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

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

      注意:

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

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

      注意:

      図40-3は、BPEL 2.0での「変換の編集」ダイアログを示しています。BPEL 1.1の「変換の編集」ダイアログは少し異なります。BPEL 1.1の「変換の編集」ダイアログでは、変数のリストから「ターゲット変数」を選択できます。

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

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

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

    XSLTマップ・エディタが表示されます。

    注意:

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

  6. XSLTマップ・エディタの使用方法の概要は、「XSLTマップ・エディタの概要」を参照してください。

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

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

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

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

  2. プロジェクトにpo.xsdおよびinvoice.xsdファイルをインポートします。次に例を示します。

    1. Oracle JDeveloperの「構造」ウィンドウで、「スキーマ」を右クリックします。

    2. 「スキーマのインポート」を選択します。

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

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

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

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

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

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

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

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

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

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

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

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

    図40-4の説明が続きます
    「図40-4 展開された「ターゲット」セクション」の説明
  8. 「OK」をクリックします。

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

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

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

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

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

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

      注意:

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

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

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

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

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

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

    XSLTマップ・エディタにXSLマップ・ファイルが表示されます。

  16. XSLTマップ・エディタの使用方法の概要は、「XSLTマップ・エディタの概要」を参照してください。

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

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

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

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

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

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

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

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

    図40-6 ルーティング・ルール

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

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

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

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

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

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

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

    図40-8 リプライ・パート

    図40-8の説明が続きます
    「図40-8 リプライ・パート」の説明
  4. 次のいずれかのオプションを選択します。
    • 「検索」アイコンを選択し、既存のXSLTマップ・ファイルを参照(またはデフォルト値をそのまま使用)します。

    • 「追加」アイコンをクリックして、新しいXSLTマップ・ファイルを作成し、そのファイルの名前を入力(またはデフォルト値をそのまま使用)します。

      ステップ3で説明したように、WSDLファイルのソース・メッセージに複数のパートがある場合は、各パートに変数が使用されます。トランスフォーメーションのターゲットに複数のパートがある場合は、複数のトランスフォーメーション・ファイルがこれらのターゲットにマップされます。この場合、Oracle Mediatorの「トランスフォーメーション」ダイアログには、ターゲット・パートごとに別々のパネルが表示されます。たとえば、図40-9はターゲットに3つのパートがあるリクエストを示しています。

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

    図40-9の説明が続きます
    「図40-9 「リクエスト・トランスフォーメーション・マップ」ダイアログ」の説明
  5. 「OK」をクリックします。

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

  6. XSLTマップ・エディタの使用方法の概要は、「XSLTマップ・エディタの概要」を参照してください。

40.2.5 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トランスフォーメーション中にエラーは表示されません。

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

トランスフォーメーション・マッピングの定義または値の割当てを行わずに、Oracle Mediatorを介してペイロードを渡すようにSOAコンポジット・アプリケーションを設計した場合、ペイロードはOracle Mediatorを介して渡されます。

ただし、ペイロードが正しく渡されるには、ソース・メッセージとターゲット・メッセージのパート名およびタイプが同じである必要があります。それ以外の場合、SOAプロジェクトのコンパイルが失敗します。11gからアップグレードされたプロジェクトでは、プロジェクトはコンパイルされますが、入力ソースがNullのようですまたはパートが見つかりませんというエラー・メッセージが表示されて、ターゲット参照の実行に失敗する可能性があります。

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

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

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

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

40.3 マップ・ビューでのXSLTマップの編集

この項では、マップ・ビューで使用できる基本的な機能について説明します。残りの各項では、XSLTビューでの編集について、注意や制限事項も含めて説明しますが、これは説明する特定のアクティビティにマップ・ビューで適用される可能性があります。

40.3.1 ノードのリンクによる値のコピーの実行方法

ソースの属性の値またはリーフ要素をターゲットの属性またはリーフ要素にコピーするには、ソース・ノードからターゲット・ノードに線をドラッグします。ドラッグ・アンド・ドロップすると、緑色にハイライト表示された線が表示されます。ドロップし終わると、ソース・ノードとターゲット・ノードをつなぐ線が描画されます。

図40-10は、ソース要素PurchaseOrder/IDがターゲット要素Invoice/IDにマッピングされたマップ・ビューを示しています。ソース・ノードとターゲット・ノードが線でつながれていることを確認してください。また、ターゲット・ツリーのID要素がグレー表示でなくなり、通常のフォントで表示されます。これは、ID要素がXSLTマップに追加されたことを示しています。

図40-10 マップ・ビューでのリーフ・ノードのコピー

図40-10の説明が続きます
「図40-10 マップ・ビューでのリーフ・ノードのコピー」の説明

40.3.2 出力ドキュメントでの空ノードの作成方法

出力ドキュメントで空ノードを作成する手順は次のとおりです。

  1. ターゲット・ペインでグレー表示のノードを選択します。
  2. ノードを右クリックし、コンテキスト・メニューで「XSLT内のノードの作成」を選択します。

40.3.3 ターゲット・ノードのリテラル・テキスト値の設定方法

出力ノードまたはターゲット・ノードにリテラル・テキスト値を設定する手順は、次のとおりです。

  1. ターゲット・ペインでノードを右クリックします。表示されるコンテキスト・メニューから「テキスト値の編集」を選択します。

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

  2. ノードに割り当てられるテキスト値を入力します。テキストを一重引用符で囲まないでください。
  3. 「OK」をクリックします。

    テキスト値が項目に設定されたことを示す黄色の「T」アイコンがノードの隣に表示されます。マウス・カーソルをノードに合せると、対応するテキストが表示されます。ノードが以前はグレー表示されていた場合、ノードがXSLTマップに追加されたため、今後はグレー表示されることはありません。

40.3.4 XSLT文の追加方法

条件文(if-then-else)や反復(for-each)などのコンストラクトを処理するために、XSLT文を追加できます。

40.3.4.1 XSLT文を追加する手順:

  1. ターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」を選択します。追加可能な様々なXSL文が含まれたサブメニューが表示されます。

  2. サブメニューから、目的のXSL文(if、choosefor-eachなど)を選択します。

XSLT文xsl:textおよびxsl:variableは、既存のノードにのみ追加できます。

40.3.4.2 xsl:textまたはxsl:variable文を追加する手順:

  1. ターゲット・ノードがXSLTに存在することを確認します。

    ターゲット・ノードがグレー表示されている場合は、そのターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「XSLT内のノードの作成」を選択します。今後このノードはグレー表示されることはなく、XSLTマップに追加されています。

  2. ターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」を選択します。追加可能な様々なXSL文が含まれたサブメニューが表示されます。

  3. サブメニューから「テキスト」または「変数」を選択します。

    注意:

    xsl:copy-of文は、マップ・ビューではサポートされていません。これはXSLTビューでサポートされています。

「コンポーネント」ウィンドウからXSLT文をドラッグ・アンド・ドロップすることも選択できます。

40.3.4.3 XSLT文をターゲット・ノードにドラッグ・アンド・ドロップする手順:

  1. 「コンポーネント」ウィンドウから「XSLT要素」ページを選択します。文カテゴリのリストが表示されます。

  2. サポートされている文を特定しますが、マップ・ビューの場合、カテゴリにあります。たとえば、for-each文は、「フロー制御」カテゴリに表示されます。

    マップ・ビューでは、XSLT文のサブセットのみがサポートされます。これらの文については、後続の項で個別に説明します。

  3. 文を、緑色のハイライト表示がノードに表示される(文をドロップできることを示します)まで目的のターゲット・ノードにドラッグします。

  4. 文をドロップして、XSLTマップに挿入します。

この後の各項には、マップ・ビューを使用して追加できる様々なXSLT文が列挙されています。

40.3.4.4 xsl:ifを使用した条件付き処理の追加方法

それぞれのスキーマで、ソース・ノードおよびターゲット・ノードがオプションの場合、通常、xsl:if文は、対応するターゲット・ノードを作成する前にソース・ノードの存在をテストするために使用されます。

図40-11では、「コメント」ノードは、ソースとターゲットの両方でオプションです。「コメント」ノードを囲んでいる大カッコは、これがオプションのノードであることを示しています。

図40-11 ソース・ツリーおよびターゲット・ツリーでのオプション・ノード

図40-11の説明が続きます
「図40-11 ソース・ツリーおよびターゲット・ツリーでのオプション・ノード」の説明

実行時にソースの「コメント」ノードがソース・ドキュメントに存在しない場合、この値は空になります。これによって、ターゲット・ドキュメントに「コメント」ノードが作成され、空の値が設定されます。

ソース・ノードが存在しない場合に空のノードが作成されないようにするには、ターゲットの「コメント」ノードの上にxsl:if文を追加します。xsl:if文は、ターゲット・ノードを作成する前に、ソース・ノードの存在をテストします。

40.3.4.4.1 コンテキスト・メニューを使用してxsl:if文を追加する手順:
  1. ターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」→「if」の順に選択します。xsl:ifノードが、ターゲット・ノードの親ノードとして追加されます。

  2. xsl:ifノードの条件を設定するには、ソース・ノードをxsl:ifノードにドラッグ・アンド・ドロップします。

    図40-12 xsl:ifノードへのソース・ノードのドラッグ

    図40-12の説明が続きます
    「図40-12 xsl:ifノードへのソース・ノードのドラッグ」の説明
40.3.4.4.2 ドラッグ・アンド・ドロップを使用してxsl:if文を追加する手順:
  1. 「コンポーネント」ウィンドウで、「XSLT要素」ページを選択します。

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

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

  4. 緑色のハイライト表示が表示されている間に「if」アイコンをドロップします。xsl:ifノードが、ターゲット・ノードの親ノードとして追加されます。

  5. xsl:ifノードの条件を設定するには、ソース・ノードをxsl:ifノードにドラッグ・アンド・ドロップします。

ソース・ビューで表示すると、xsl:if文は次のようになります。

<xsl:if test="/ns0:PurchaseOrder/ns0:Comment">
    <tns1:Comment>
       <xsl:value-of select="/ns0:PurchaseOrder/ns0:Comment"/>
    </tns1:Comment>
</xsl:if>

前述のxsl:if文では、ソース・ノードが存在する場合にのみターゲット・ノードが作成されることを確認しています。

40.3.4.5 xsl:chooseを使用した条件付き処理の追加方法

xsl:choose文はxsl:ifコンストラクトと似ています。評価する条件が複数ある場合に、xsl:choose XSLT文を使用できます。

図40-14に、ソース・スキーマとターゲット・スキーマのサンプルが含まれたXSLTマップ・エディタを示します。ソース・スキーマには、xsd:choiceコンストラクトが定義されています。ソース・スキーマには、HQAccountノードまたはBranchAccountノードのいずれかを含めることができますが、両方は含めません。ターゲット・スキーマには、定義する必要のあるBilledToAccountノードおよびAccountNumberノードがあります。

HQAccountノードが存在する場合は、このAccountNumberをターゲットのBilledToAccountおよびAccountNumberにコピーする必要があります。HQAccountノードが存在しない場合は、BranchAccountノードからAccountNumberをコピーする必要があります。xsl:choose文を使用してこのタスクを実行できます。

図40-14 ソース・スキーマおよびターゲット・スキーマのサンプルが含まれたXSLTマップ・エディタ

図40-14の説明が続きます
「図40-14 ソース・スキーマおよびターゲット・スキーマのサンプルが含まれたXSLTマップ・エディタ」の説明
40.3.4.5.1 コンテキスト・メニューを使用してxsl:choose文を追加する手順:
  1. ターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」→「choose」の順に選択します。

    choose文が、xsl:when文とともにターゲット・ノードの親ノードとして追加されます。図40-15に、AccountNumberノードにxsl:choose文を追加した結果を示します。

    図40-15 xsl:choose文の追加

    図40-15の説明が続きます
    「図40-15 xsl:choose文の追加」の説明

    xsl:choose文には、複数のxsl:when文の後にオプションのxsl:otherwise文を含めることができます。

  2. xsl:otherwiseノードをxsl:chooseノードに追加するには、ターゲット・ツリーで「xsl:choose」を右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」→「otherwise」の順に選択します。

    図40-16に、xsl:choose文にxsl:otherwise文を追加した結果を示します。AccountNumberノードがxsl:choose文の各セクションにコピーされることに注意してください。

    図40-16 xsl:choose文へのxsl:otherwise文の追加

    図40-16の説明が続きます
    「図40-16 xsl:choose文へのxsl:otherwise文の追加」の説明
  3. 存在がテストされるソース・ノードにxsl:whenノードをマッピングします。現在の例では、ソースのHQAccountノードからターゲットのxsl:whenノードへ線をドラッグします。

  4. xsl:whenケースとxsl:otherwiseケースをマッピングします。現在の例では、HQAccount/AccountNumberノードからxsl:choose/xsl:when/AccountNumberノードへ線をドラッグします。同様に、BranchAccount/AccountNumberノードからxsl:choose/xsl:otherwise/AccountNumberノードへ線をドラッグします。

    図40-17に、完成したxsl:chooseコンストラクトを示します。

    図40-17 xsl:chooseコンストラクトのサンプル

    図40-17の説明が続きます
    「図40-17 xsl:chooseコンストラクトのサンプル」の説明
40.3.4.5.2 ドラッグ・アンド・ドロップを使用してxsl:choose文を追加する手順:
  1. 「コンポーネント」ウィンドウで、「XSLT要素」ページを選択します。

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

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

    図40-18 ターゲット・ノードへの「choose」アイコンのドラッグ

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

  5. otherwise句を作成するには、「コンポーネント」ウィンドウから、「otherwise」アイコンを緑色のハイライト表示が表示されるまでxsl:chooseノードの左側にドラッグします(図40-19を参照)。

    図40-19 xsl:chooseノードへの「otherwise」アイコンのドラッグ

    図40-19の説明が続きます
    「図40-19 xsl:chooseノードへの「otherwise」アイコンのドラッグ」の説明
  6. 緑色のハイライト表示が表示されている間に「otherwise」アイコンをドロップします。xsl:otherwiseノードが、xsl:chooseノードの子ノードとして追加されます。

  7. 存在がテストされるソース・ノードにxsl:whenノードをマッピングします。現在の例では、ソースのHQAccountノードからターゲットのxsl:whenノードへ線をドラッグします。

  8. xsl:whenケースとxsl:otherwiseケースをマッピングします。現在の例では、HQAccount/AccountNumberノードからxsl:choose/xsl:when/AccountNumberノードへ線をドラッグします。同様に、BranchAccount/AccountNumberノードからxsl:choose/xsl:otherwise/AccountNumberノードへ線をドラッグします。

    図40-17に、完成したxsl:chooseコンストラクトを示します。

ソース・ビューで表示すると、xsl:choose文は次のようになります。

<BilledToAccount>
   <xsl:choose>
     <xsl:when test="/ns0:PurchaseOrder/HQAccount">
       <AccountNumber>
         <xsl:value-of select="/ns0:PurchaseOrder/HQAccount/AccountNumber"/>
       </AccountNumber>
     </xsl:when>
     <xsl:otherwise>
       <AccountNumber>
         <xsl:value-of select="/ns0:PurchaseOrder/BranchAccount/AccountNumber"/>
       </AccountNumber>
     </xsl:otherwise>
   </xsl:choose>
</BilledToAccount>

40.3.4.6 xsl:for-eachを使用したループの追加方法

xsl:for-each文は、ソース・ノードセット、またはノードのセットをループ処理し、ソース・ノードセットの各ノードに出力ノードを作成するために使用できます。

40.3.4.6.1 コンテキスト・メニューを使用してxsl:for-each文を追加する手順:
  1. ターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」→「for-each」の順に選択します。xsl:for-each文が、ターゲット・ノードの親ノードとして追加されます。

  2. ソース・ノードセットがループ処理するように設定するには、ソース・ノードをxsl:for-each文にドラッグ・アンド・ドロップします。

    図40-20に、xsl:for-each文の作成例を示します。ソースのPurchaseOrderドキュメントにはItemノードが含まれています。Itemノードはそのアイコンが表すとおり、繰返しノードです。ソース・ドキュメントの各Itemノードでxsl:for-each文を使用することで、Itemノードがターゲット・ドキュメントに作成されます。

    図40-20 xsl:for-each文の作成

    図40-20の説明が続きます
    「図40-20 xsl:for-each文の作成」の説明
40.3.4.6.2 ドラッグ・アンド・ドロップを使用してxsl:for-each文を追加する手順:
  1. 「コンポーネント」ウィンドウで、「XSLT要素」ページを選択します。

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

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

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

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

  5. ソース・ノードセットがループ処理するように設定するには、ソース・ノードをxsl:for-each文にドラッグ・アンド・ドロップします(図40-20を参照)。

ソース・ビューで表示すると、xsl:for-each文は次のようになります。

<ShippedItems>
  <xsl:for-each select="/ns0:PurchaseOrder/Items/HighPriorityItems/Item">
     <Item/>
  </xsl:for-each>
</ShippedItems>

xsl:for-each文内で作成されたItemノードが、空のノードであることに注意してください。ターゲットのItemノードの下に要素をマッピングして、値を設定できます。

たとえば、図40-22に示すように、QtyをQuantityにドラッグ・アンド・ドロップすると、Qty要素の値が出力のQuantity要素にコピーされます。

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

図40-22の説明が続きます
「図40-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
    

40.3.4.7 xsl:for-each文へのxsl:sortの追加方法

xsl:sort文をxsl:for-each文に追加して、ソート実行時の基準となるフィールドを指定できます。xsl:sort命令は、xsl:for-eachに対して、定義されたノードセットの特定の順序によるループ処理を実行させます。

40.3.4.7.1 コンテキスト・メニューを使用してxsl:sort文を追加する手順:
  1. xsl:for-eachノードを右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」→「sort」の順に選択します。

    「属性の設定」ダイアログが表示されます。

  2. 必要に応じて、xsl:sort文に属性を指定します。「OK」をクリックします。

    「属性の設定」ダイアログでは、xsl:sort文に対する属性を設定できます。属性は、ソートが実行される方法を制御します。たとえば、「order」属性を選択した場合、次にソート順として「昇順」または「降順」を選択できます。ソートに必要な属性を選択します。

    注意:

    属性のデフォルト値が、「属性の設定」ダイアログで事前に選択されています。これらの値は、選択された属性が存在しない場合に使用されます。

    たとえば、ソート順序のデフォルトは昇順です。明示的に「order」属性を選択して、昇順を有効にする必要はありません。

    xsl:sort文はxsl:for-each文のすぐ下に、for-eachの下にある他のノードの前に追加されます。

  3. ソート対象の要素を設定するには、ノードをソースのノードセットの下からxsl:sortノードにドラッグ・アンド・ドロップします。たとえば、USPriceでソートするには、USPriceノードをノードセット要素Itemの下からxsl:sortノードにドラッグします(図40-23を参照)。

    図40-23 xsl:sortノードへのソースのノードセットの接続

    図40-23の説明が続きます
    「図40-23 xsl:sortノードへのソースのノードセットの接続」の説明

40.3.4.7.2 ドラッグ・アンド・ドロップを使用してxsl:sort文を追加する手順:
  1. 「コンポーネント」ウィンドウで、「XSLT要素」ページを選択します。

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

  3. 緑色のハイライト表示が表示されるまで「sort」アイコンをfor-eachノードの下の要素の一番上にドラッグします(図40-24を参照)。

    図40-24 for-eachへのソートの追加

    図40-24の説明が続きます
    「図40-24 for-eachへのソートの追加」の説明
  4. 緑色のハイライト表示が表示されている間に「sort」アイコンをドロップします。xsl:sortノードが、ハイライトされているノードの兄弟関係ノードとして追加されます。図40-24に示す例では、xsl:sortノードはItem要素の兄弟関係として追加されます。

  5. ソート対象の要素を設定するには、ノードをソースのノードセットの下からxsl:sortノードにドラッグ・アンド・ドロップします。たとえば、USPriceでソートするには、USPriceノードをノードセット要素Itemの下からxsl:sortノードにドラッグします(図40-23を参照)。

ソース・ビューで表示すると、xsl:sort文は次のようになります。

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

40.3.4.8 XSLT命令の複製方法

XSLT命令をターゲット・ツリーで複製する必要がある場合があります。たとえば、2つのfor-each文を隣り合って作成し、ソース・ドキュメント内で2つのノードセットをループ処理するか、同じノードセットで2回ループ処理する場合があります。

xsl:ifxsl:sortなどのその他のXSLT命令も複製できます。この項では、xsl:for-each文を使用した複製命令の作成について説明します。同じ手順が他のXSLT命令に適用されます。

xsl:for-each文を複製する手順は、次のとおりです。

  1. ターゲット・ツリーでxsl:for-eachノードを右クリックして、表示されるコンテキスト・メニューから「重複」を選択します。

    ノードがその子およびマッピングとともに複製されます。図40-25は、重複ノードを示しています。

    図40-25 xsl:for-each文の複製

    図40-25の説明が続きます
    「図40-25 xsl:for-each文の複製」の説明
  2. 必要に応じて、xsl:for-eachノードのマッピングを変更するか、xsl:for-eachノードの下にあるノードのマッピングを変更します。
40.3.4.8.1 例: XPath式を変更することによるマッピングの変更

この例では、重複xsl:for-each文を変更して、ソース・ドキュメントにあるLowPriorityItemsノードの下でItemノードをループ処理させます。マッピングを変更する方法は複数あります。次の例は、マッピングを変更する1つの方法を示しています。

for-each文に関連付けられているXPath式を編集する場合は、for-eachの下にあるすべての相対マッピングが自動的に更新されます。次の手順を使用して、重複for-each文に関連付けられているXPath式を変更します。

  1. XPath式を編集するには、2番目のfor-eachに接続されている線をダブルクリックします。これは、図40-25では青い線です。

    「XPathの編集」ダイアログが表示されます。「XPath式」フィールドに、このマップに対応するXPath式が表示されます。

  2. XPath式で、HighPriorityItemsLowPriorityItemsに変更します。「OK」をクリックします。

    xsl:for-each文およびそのすべての子が、LowPriorityItems/Itemノードセットを参照するようになりました。

40.3.4.8.2 例: 削除および再作成によるマッピングの変更

for-each文のマッピングを変更するために、そのマッピングを削除して再作成することも選択できます。重複for-each文のマッピングを変更する手順を次に示します。

  1. 重複xsl:for-eachノードを右クリックして、表示されるコンテキスト・メニューから「マッピングの削除」を選択します。

    「XPathのリファクタ」ダイアログが表示され、for-each文の下でXPath式をリファクタするかどうかが確認されます。

  2. リファクタするには、「いいえ」をクリックします。これによって相対パスが保持され、この相対パスを別のループに適用します。「いいえ」をクリックした後は、for-each文の下にある線が一時的にソース・ツリーから切断されます。

    前述の図では、Quantityフィールドに関連付けられている相対XPath式はQtyです。for-each文にXPath式がないと、相対的に関連付けられるItemノードがないため、ソース・ツリーには参照がなくなります。

    注意:

    通常、ソース・ツリーのノードに解決できないXPath式は、中央のパネルに示されます。これは、前述のケースのように、問題を示す場合があります。上にfor-each式がないため、解決できない相対パスがあります。

    設計時にソース参照ノードを特定するには式が複雑すぎる場合にも、XPath式が中央のペインに示されることがあります。

  3. ソース・ツリーのLowPriorityItems/Itemノードから重複xsl:for-each文に、線をドラッグ・アンド・ドロップします。

    次の図に示すように、Quantityフィールドへのマッピングは、LowPriorityItems/Itemノードの下にあるQtyフィールドに自動的に再接続されます。

40.3.5 要素の複製方法

マップ・ビューでターゲット・ノードを複製するためには、そのノードがターゲット・スキーマで繰返しノードとして定義されている必要があります。特定のケースでは、前述の項で説明したとおり、for-eachループを使用して繰返しノードを作成できます。その他の場合では、ノードの複数の独立インスタンスを作成し、ソース・ドキュメントの異なる領域を介して、データをそれらのインスタンスにマップする必要がある場合があります。

繰返しターゲット・ノードを複製する手順は、次のとおりです。

  1. ターゲット・ノードのテキストがイタリック体でグレー表示されている場合は、そのノードを右クリックして、表示されるコンテキスト・メニューから「XSLT内のノードの作成」を選択します。

    図40-26 XSLTでのノードの作成

    図40-26の説明が続きます
    「図40-26 XSLTでのノードの作成」の説明
  2. ノードを再度右クリックして、表示されるコンテキスト・メニューから「重複」を選択します。ノードが複製されます。

    図40-27 コンタクト・ノードの複製

    図40-27の説明が続きます
    「図40-27 コンタクト・ノードの複製」の説明
  3. ソース・ドキュメントから2つの重複要素に適切なフィールドをマッピングします。

    次の図では、ターゲット・ツリーの重複Contactノードが、ソース・ドキュメントの異なる領域にマップされています。最初のContactノードはShipToデータにマッピングされています。2番目のContactノードは、BillToデータにマッピングされています。

40.3.6 要素または属性の削除方法

現在のXSLTマップから要素または属性を削除するには、その要素または属性が最初にXSLTに存在している必要があります。イタリック体でグレー表示でないターゲット・ツリーにあるノードは、XSLTに存在しているノードです。イタリック体でグレー表示されているノードは、XSLTの一部ではありません。そのようなグレー表示のノードは、ターゲット・スキーマの候補の要素および属性を表し、表示から削除することはできません。

XSLTに存在するターゲット・ノードを削除するには、次のいずれかを実行します。

  • ターゲット・ノードをクリックして選択します。[Delete]キーを押します。

  • ターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「削除」を選択します。

ノードがXSLTから削除され、そのノードへのマッピングも削除されます。削除されたノードは、表示からは削除されません。削除されたノードはイタリック体でグレー表示され、現在はターゲット・スキーマからの可能なターゲット・ノードであり、XSLTの一部ではないことを示します。ただし、削除されたノードが重複ノードであったか、ターゲット・スキーマに準拠しない位置にあった場合は、このノードは表示から削除されます。

次の図は、XSLTマップの一部である2つのCommentノードを示します。

2番目のCommentノードを右クリックして、コンテキスト・メニューから「削除」を選択した場合、次の図に示すとおり、重複ノードがXSLTおよび表示から削除されます。

次に、残りのCommentノードを右クリックして削除します。このノードは表示から削除されませんが、XSLTからは削除され、次の図に示すとおり、外観がグレーのイタリック体に変わります。

40.3.7 要素または属性からマッピングを削除する方法

ターゲット・ノードへのマッピングを削除するには、ターゲット・ツリーでノードを右クリックして、表示されるコンテキスト・メニューから「マッピングの削除」を選択します。または、マッピングを表す線を選択して[Delete]キーを押すこともできます

マップ・ビューでマッピングを削除する場合、マッピングされていたノードはXSLTから削除されません。ノードを削除するには、右クリックして、表示されるコンテキスト・メニューから「削除」を選択します。マッピングのみが削除されノードは削除されない場合、XSLTは実行時に空のノードを生成します。

40.4 XSLTビューでのXSLTマップの編集

この項では、XSLTビューのXSLTペインを使用した基本的な編集機能について説明します。次のリストに、XSLTビューでの編集とマップ・ビューでの編集の主な違いを示します。

  • XSLTビューでは、XSLTノードとターゲット・スキーマのマージされたビューは提供されません。右側のターゲット・ペインは2つのペインに分割されています。上のペインはXSLTペイン、下のペインはターゲット・ペインと呼びます。ターゲット・スキーマが定義されていない場合、下のペインは表示されません。

  • ターゲット・ノードをマッピングするには、マッピングの前にこれらのノードをXSLTペインに明示的に追加する必要があります。エディタには、これを行うための複数の方法が用意されています。これらについては後続の項で説明します。

  • XSLT 1.0命令のすべての種類をXSLTビューで使用できます。これらの命令は、その位置がXSLT仕様と矛盾しない場合は、XSLTパネルの任意の場所に追加できます。

  • テンプレート・ルール(一致するテンプレート)、名前付きテンプレート、インポート/インクルードなどの多数の拡張機能をXSLTビューで使用できます。これらの拡張機能については、この章で後述します。

40.4.1 マップ前にターゲットの要素または属性を追加する方法

ターゲット要素および属性にマッピングする前に、その要素または属性をXSLTペインに明示的に追加する必要があります。この項では、次の項目について説明します。

40.4.1.1 ターゲット・スキーマからの要素および属性の追加方法

ターゲット・スキーマがある場合は、要素および属性をターゲット・ツリーからXSLTペインに追加できます。

XSLT要素または属性のコンテキスト・メニューを使用して関連要素/属性を追加するか、または目的の要素/属性をターゲット・ツリーからXSLTツリーにドラッグ・アンド・ドロップします。

要素がターゲット・スキーマと矛盾した位置にある場合、またはXSLTマップが不完全なため、その要素がその場所で有効かどうかをエディタで判別できていない場合、要素のアイコンの上に疑問符が表示されます。次の図は、アイテム要素が疑問符付きで表示されているXSLTツリーを示しています。

40.4.1.1.1 ターゲット・スキーマがある場合に要素および属性を追加する手順:
  1. XSLTペインで、子要素または属性を含めようとする要素を右クリックします。コンテキスト・メニューが表示されます。

    注意:

    選択したノードがXSLTに存在する場合は、このアクションはマップ・ビューからも実行できます。

    マップ・ビューでは、「XSLT内のノードの作成」を選択することで、空のXSLTノードを追加することもできます。詳細は、「出力ドキュメントでの空ノードの作成方法」を参照してください。

  2. 「スキーマからの子の追加」を選択します。サブメニューが表示され、ターゲット・スキーマと一貫性のある選択肢が示されます。図40-28は、「スキーマからの子の追加」サブメニューを示しています。

    図40-28 追加する子要素/属性の選択

    図40-28の説明が続きます
    「図40-28 追加する子要素/属性の選択」の説明
  3. 追加する要素名または属性名を選択します。すべての子要素または属性を追加するには、「すべての要素」または「すべての属性」を選択します。必要な子要素または属性をすべて追加するには、「すべての必須」を選択します。

40.4.1.1.2 ターゲット・スキーマ・ツリーから要素および属性をドラッグ・アンド・ドロップする手順:
  • 要素を既存の要素の子として挿入する手順は次のとおりです。

    ターゲット要素または選択範囲の要素を、ターゲット・ペインからXSLTツリーの目的の要素の左側にドラッグします。緑色のハイライト表示が、その要素が子として挿入されることを示します。ドロップすると、その子が子のリストに追加されます。

    緑色のハイライト表示が特定の位置に表示されない場合は、その要素をその位置に挿入するのは無効であることを示します。

  • 要素を既存の要素の後に兄弟として挿入する手順は次のとおりです。

    ターゲット要素または選択範囲の要素を、ターゲット・ペインからXSLTツリーの既存の要素の下部にドラッグします。緑色のハイライト表示が、その要素が兄弟として挿入されることを示します。ドロップすると、その兄弟が既存の要素の後に追加されます。

  • 要素を既存の要素の前に兄弟として挿入する手順は次のとおりです。

    ターゲット要素または選択範囲の要素を、ターゲット・ペインからXSLTツリーの既存の要素の上部にドラッグします。緑色のハイライト表示が、その要素が兄弟として挿入されることを示します。ドロップすると、その兄弟が既存の要素の前に追加されます。

  • 要素を既存の要素の親として挿入する手順は次のとおりです。

    ターゲット要素または選択範囲の要素を、ターゲット・ペインからXSLTツリーの既存の要素の右側にドラッグします。緑色のハイライト表示が、その要素が親として挿入されることを示します。ドロップすると、その要素が既存の要素の親として挿入されます。

40.4.1.2 ターゲット・スキーマがない場合のリテラル要素および属性の追加方法

この項は、XSLTビューとマップ・ビューの両方に適用されます。

40.4.1.2.1 ターゲット・スキーマがない場合にリテラル要素を追加する手順:
  1. XSLTペインで要素を右クリックします。要素のコンテキスト・メニューが表示されます。

  2. 既存の要素に関連付けられる新規リテラル要素の相対位置を選択します。リテラル要素は、既存の要素の子、兄弟または親として作成できます。図40-29は、使用可能なオプション(「子の追加」、「親の挿入」、「兄弟を前に挿入」、「兄弟を後に挿入」)を示しています。

    図40-29 XSLTペインへのリテラル要素の追加

    図40-29の説明が続きます
    「図40-29 XSLTペインへのリテラル要素の追加」の説明
  3. サブメニューから「リテラル要素」を選択します。「要素の定義」ダイアログが表示されます。

  4. 「ローカル名」に、リテラル要素の名前を入力します。オプションで、要素のネームスペースを指定できます。

  5. 「OK」をクリックして、「要素の定義」ダイアログを閉じます。

40.4.1.2.2 ターゲット・スキーマがない場合にリテラル属性を追加する手順:
  1. XSLTペインで既存のリテラル要素を右クリックします。リテラル要素のコンテキスト・メニューが表示されます。

  2. 「子の追加」「リテラル属性」を選択します。「要素の定義」ダイアログが表示されます。

  3. 「ローカル名」に、リテラル属性の名前を入力します。オプションで、属性のネームスペースを指定できます。

  4. 「OK」をクリックして、「属性の定義」ダイアログを閉じます。

40.4.1.3 出力ドキュメントでの空ノードの作成方法

前述の項(「ターゲット・スキーマからの要素および属性の追加方法」および「ターゲット・スキーマがない場合のリテラル要素および属性の追加方法」)で説明した方法を使用してノードをXSLTペインに追加する場合、これらのノードをソース・ノードにマッピングしないかぎり、空のノードとして作成されます。また、複合ノードをXSLTペインに追加する場合は、複合ノードの下の必要なすべてのノードが自動的に作成されます。

「XSLマップ: XSLエディタ・プリファレンス」ページでXSLマップの初期化オプションを設定して、マップの作成時に空のノードを生成することもできます。詳細は、「XSLエディタのプリファレンスの設定方法」を参照してください。

40.4.2 ノードのリンクによる値のコピーの実行方法

ソースの属性の値またはリーフ要素をXSLTペインの属性またはリーフ要素にコピーするには、ソース・ノードからXSLTノードに線をドラッグします。ドラッグ・アンド・ドロップすると、緑色にハイライト表示された線が表示されます。ドロップし終わると、ソース・ノードとターゲット・ノードをつなぐ線が描画されます。

図40-30は、PurchaseOrder/IDソース要素がInvoice/ID XSLT要素にマッピングされているXSLTビューを示しています。ソースとXSLTノードが線でつながれます。

図40-30 値のコピーの実行

図40-30の説明が続きます
「図40-30 値のコピーの実行」の説明

40.4.3 xsl:valueof文の挿入方法

前述の項の説明に従ってソース要素をXSLT要素にマッピングすると、暗黙的なxsl:valueof文がXSLTに作成されます。

XSLTビューでは、1つのXSLT要素に複数のxsl:valueof要素を明示的に作成できます。XSLT要素の結果の値は、個々のxsl:valueofの値を連結したものです。

XSLT要素のxsl:valueof要素を作成する手順は、次のとおりです。

  1. XSLTペインでリテラル要素を右クリックします。コンテキスト・メニューが表示されます。
  2. コンテキスト・メニューから「子の追加」→「XSL」→「value-of」の順に選択します。「属性の設定」ダイアログ・ボックスが表示されます。
  3. オプションで、'disable output escaping'属性を選択します。「OK」をクリックします。

    xsl:value-of要素が挿入されます。

  4. xsl:value-of要素を、リテラル要素のマッピングと同様に、ソース要素にマッピングします。これは前述の項で説明しています。

xsl:value-of要素がマッピングされていないリテラル要素に追加された場合、マッピングされるまでxsl:value-of文がリテラル要素の下に表示されます。xsl:value-of要素をマッピングした後、エディタによってリテラル要素の下のxsl:value-of文が非表示にされ、マッピングを示す線のみが表示されます。

複数のxsl:value-of文をそのリテラル要素に追加した場合は、すべてのxsl:value-of文がリテラル要素の下に明示的に表示され、マッピングの線が各xsl:value-of要素に対して個別に表示されます。

40.4.4 XSLTノードのリテラル・テキスト値の設定方法

XSLTノードにリテラル・テキスト値を設定する手順は、次のとおりです。

  1. XSLTペインでノードを右クリックします。表示されるコンテキスト・メニューから「テキスト値の編集」を選択します。

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

  2. ノードに割り当てられるテキスト値を入力します。テキストを一重引用符で囲まないでください。
  3. 「OK」をクリックします。

    テキスト値が項目に設定されたことを示す黄色の「T」アイコンがノードの隣に表示されます。マウス・カーソルをノードに合せると、対応するテキストが表示されます。

40.4.5 xsl:text命令を使用したリテラル・テキスト値の設定方法

xsl:text命令を使用してリテラル要素の値を設定する手順は次のとおりです。

  1. XSLTペインでリテラル要素を右クリックします。コンテキスト・メニューが表示されます。
  2. コンテキスト・メニューから「子の追加」→「XSL」→「text」の順に選択します。「属性の設定」ダイアログ・ボックスが表示されます。
  3. オプションで、'disable output escaping'属性を選択します。「OK」をクリックします。

    xsl:text要素が挿入されます。

  4. 新しく挿入されたxsl:text要素を右クリックし、表示されるコンテキスト・メニューから「テキスト値の編集」を選択します。

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

  5. ノードに割り当てられるテキスト値を入力しますが、テキストを一重引用符で囲まないでください。
  6. 「OK」をクリックします。

    テキスト値が要素に設定されたことを示す黄色の「T」アイコンがxsl:textノードの隣に表示されます。マウス・カーソルをノードに合せると、対応するテキストが表示されます。

  7. 任意の時点でテキスト値を変更するには、xsl:text要素を再度右クリックして、表示されるコンテキスト・メニューから「テキスト値の編集」を選択します。

40.4.6 XSLT文の追加方法

この手順はXSLTビューにのみ適用されます。XSLTは、「コンポーネント」ウィンドウまたはコンテキスト・メニューを使用して追加できます。

40.4.6.1 コンテキスト・メニューを使用してXSLT要素を追加する手順:

  1. XSLTペインで要素を右クリックします。要素のコンテキスト・メニューが表示されます。

  2. 既存の要素に関連付けられる新規要素の相対位置を選択します。リテラル要素は、既存の要素の子、兄弟または親として作成できます。使用可能なオプションは、「子の追加」、「親の挿入」、「兄弟を前に挿入」および「兄弟を後に挿入」です。

  3. サブメニューから「XSL」を選択します。その位置で有効なXSLT要素のリストが表示されます。図40-31は、XSLの選択例を示しています。

  4. 目的のXSLT要素を選択します。

    選択した要素によっては、ダイアログで属性値の入力を求められる場合があります。その場合は、属性値を入力して「OK」をクリックします。

  5. XSLT要素がツリーに追加されます。

    追加された要素の属性は、XSLTツリーに明示的に表示されません。マウス・カーソルを要素の上に置き、ツールチップ・テキストに属性を表示します。または、XSLT要素を選択して、「プロパティ」ウィンドウで要素のプロパティを表示して編集します。

40.4.6.2 「コンポーネント」ウィンドウからXSLT要素を追加する手順:

  1. 「コンポーネント」ウィンドウが表示されていることを確認します。デフォルト位置はOracle JDeveloperの右上隅です。

  2. 「コンポーネント」ウィンドウが表示されていない場合は、「ウィンドウ」メニューから「コンポーネント」を選択します。

  3. 「XSLT要素」ページを選択します。

  4. 「XSLT要素」の目的のセクションを選択します。目的のXSLT要素をXSLTペインにドラッグします。

    • XSLT要素を既存の要素の子として挿入する手順は次のとおりです。

      XSLT要素を、「コンポーネント」ウィンドウからXSLTツリーの既存の要素の左側にドラッグします。緑色のハイライト表示が、XSLT要素が子として挿入されることを示します。ドロップすると、XSLT要素が既存の子の末尾に追加されます。

      緑色のハイライト表示が特定の位置に表示されない場合は、その要素をその位置に挿入するのは無効であることを示します。

    • XSLT要素を既存の要素の後に兄弟として挿入する手順は次のとおりです。

      XSLT要素を、「コンポーネント」ウィンドウからXSLTツリーの既存の要素の下部にドラッグします。緑色のハイライト表示が、XSLT要素が兄弟として挿入されることを示します。ドロップすると、XSLT要素が既存の要素の後に追加されます。

    • XSLT要素を既存の要素の前に兄弟として挿入する手順は次のとおりです。

      XSLT要素を、「コンポーネント」ウィンドウからXSLTツリーの既存の要素の上部にドラッグします。緑色のハイライト表示が、XSLT要素が兄弟として挿入されることを示します。ドロップすると、XSLT要素が既存の要素の前に追加されます。

    • XSLT要素を既存の要素の親として挿入する手順は次のとおりです。

      XSLT要素を、「コンポーネント」ウィンドウからXSLTツリーの既存の要素の右側にドラッグします。緑色のハイライト表示が、XSLT要素が親として挿入されることを示します。ドロップすると、XSLT要素が既存の要素の親として追加されます。

    選択したXSLT要素によっては、ダイアログで属性値の入力を求められる場合があります。その場合は、属性値を入力して「OK」をクリックします。

  5. XSLT要素がツリーに追加されます。

    追加された要素の属性は、XSLTツリーに明示的に表示されません。マウス・カーソルを要素の上に置き、ツールチップ・テキストに属性を表示します。または、XSLT要素を選択して、「プロパティ」ウィンドウで要素のプロパティを表示して編集します。

40.4.7 XSLT式属性の値の設定方法

多くのXSLT命令には、XPath式として解析される特殊な属性が含まれています。これらの式属性は、通常、selectまたはtestという名前です。たとえば、xsl:for-each要素にはselect属性が、xsl:if要素にはtest属性が含まれます。

こうした属性はXPath式で定義できます。これらの属性の値は、XSLTペイン(XSLTビューの場合)またはターゲット・ペイン(マップ・ビューの場合)のXSLT要素に、ドラッグ・アンド・ドロップを使用して設定できます。

ソース・ツリーからのドラッグ・アンド・ドロップを使用してXSLT式属性の値を設定するには、ソース・ツリーの目的のノードからXSLTペインの目的のXSLT要素に、線をドラッグします。ソース・ツリーのノードとXSLT要素をつなぐ線が表示されます。

ソース・ビューではXSLT命令に適切な式属性が挿入されます。次に例を示します。

<xsl:if test="/ns0:PurchaseOrder/BillTo/Address/@country">

前述の例のコードは、ソース・スキーマのcountry属性をXSLTツリーのxsl:if文にドラッグすることにより作成されます。このコードは、if条件でソース・スキーマ内にcountry属性があるかどうかをテストします。

40.4.8 要素の複製方法

ターゲット・スキーマで繰返しノードとして定義されているXSLTペインにリテラル要素を複製するには、「要素の複製方法」の手順を使用します。この手順はマップ・ビューでの手順と同じです。

ターゲット・スキーマが定義されていない場合は、ルート・ノードを除くすべてのノードをXSLTビューで複製できます。

ノードは複製する必要があるが、ターゲット・スキーマで繰返しノードとして定義されていない場合は、次のように、リテラル要素を明示的に作成することで重複ノードを作成できます。

ターゲット・スキーマで繰返しノードとして定義されていないリテラル要素を複製する手順は、次のとおりです。

  1. XSLTペインで、複製する要素を右クリックします。コンテキスト・メニューが表示されます。
  2. コンテキスト・メニューから「兄弟を後に挿入」→「リテラル要素」の順に選択します。「要素の定義」ダイアログが表示されます。
  3. 複製するノードの要素名およびネームスペースを入力します。「OK」をクリックします。

40.4.9 要素または属性の削除方法

この機能はXSLTビューとマップ・ビューの両方で使用できます。マップ・ビューを使用する場合、処理はターゲット・ペインで実行されます。

XSLTに存在するターゲット・ノードを削除するには、次のいずれかを実行します。

  • XSLTペインでノードを右クリックします。表示されたコンテキスト・メニューから「削除」を選択します。

  • XSLTペインでノードをクリックして選択します。[Delete]キーを押します。

そのノードに対するマッピングとともにノードがXSLTペインから削除されます。

40.4.10 要素の移動方法

XSLTペインで、ある位置からドラッグして別の位置へドロップすることで要素を移動できます。要素を移動して、別の要素の兄弟、親または子にすることもできます。マップ・ビューでは要素を移動できません。

図40-32では、XSLTペインで正しくない位置にあるAccountNumber要素を示しています。ターゲット・スキーマで一貫性のあるようにするには、AccountNumber要素をBilledToAccount要素の下に移動する必要があります。

図40-32 AccountNumber要素

図40-32の説明が続きます
「図40-32 AccountNumber要素」の説明

XSLTペインで、AccountNumber要素をBilledToAccount要素の左側に緑色のハイライト表示が表示されるまでドラッグします(図40-33を参照)。緑色のハイライト表示は、AccountNumber要素がBilledToAccountの子としてドロップされることを示しています。

図40-33 AccountNumberノードのドラッグ

図40-33の説明が続きます
「図40-33 AccountNumberノードのドラッグ」の説明

緑色のハイライトが表示されている間に要素をドロップします。AccountNumberノードの位置がBilledToAccountノードの下に変わります(図40-34を参照)。

図40-34 位置が変更されたAccountNumberノード

図40-34の説明が続きます
「図40-34 位置が変更されたAccountNumberノード」の説明

40.4.11 要素または属性からマッピングを削除する方法

XSLTノードからマッピングを削除するには、ノードを右クリックし、コンテキスト・メニューで「マッピングの削除」を選択します。または、マッピングを表す線を選択して[Delete]キーを押すこともできます前述の方法は、マップ・ビューとXSLTビューの両方で使用できます。

40.5 XPath式の使用

「ノードのリンクによる値のコピーの実行方法」および「ノードのリンクによる値のコピーの実行方法」では、ドラッグ・アンド・ドロップ操作を使用して、ソースの要素または属性とターゲットの要素または属性との間のマッピングを作成する方法について説明しました。ドラッグ・アンド・ドロップではXSLTにXPath式が作成され、この式はソース・ドキュメントの特定のノードを参照します。

たとえば、次のXSLTコードは、ソース要素をターゲット要素にマッピングすることで生成されます。

<ID>
 <xsl:value-of select="/ns0:PurchaseOrder/ID"/>
</ID>

前述のコードにはxsl:value-of文が含まれています。この文のselect属性にはXPath式(/ns0:PurchaseOrder/ID)が含まれており、これはマッピングされるソース・ノードを参照します。

このXPath式は、ロケーション・パス式を表します。XPath式は複雑にでき、XPath関数および演算子を含むこともできます。

たとえば、次のコードは、ソース要素/PurchaseOrder/IDの値を属性/PurchaseOrder/@PONumberの値に連結します。その後、その結果がターゲット要素<ID>に割り当てられます。

<ID>
 <xsl:value-of select="concat(/ns0:PurchaseOrder/ID,/ns0:PurchaseOrder/@PONumber )"/>
</ID>

前述のコードで、select属性の値はXPath式です。XPath式では、concat関数を使用して、2つのソース・ノードの値を連結します。

XSLTマップ・エディタには、簡単なドラッグ・アンド・ドロップ・アクションによって作成されるよりも複雑なXPath式を入力するための多数の方法が用意されています。XPath式を作成するための次の方法は、マップ・ビューとXSLTビューの両方で使用できます。

40.5.1 既存のソースとターゲットのマッピングの変更方法

ソースとターゲットのノード間にドラッグ・アンド・ドロップ・アクションで作成されたマッピングのXPath式を変更できます。

40.5.1.1 「XPathの編集」ダイアログを使用してXPath式を編集する手順

  1. ソースからターゲットへのマッピングを表す線をダブルクリックします。「XPathの編集」ダイアログが表示されます。

  2. 「XPathの編集」を必要に応じて編集します。

    たとえば、「説明」フィールドにソースで最初に発生するコメントを含める場合は、最初のコメントのインデックスを持つ式に条件を追加します。

    XPath式の編集に関するその他の情報が必要な場合は、「ヘルプ」をクリックします。

  3. 「XPathの編集」ダイアログで「OK」をクリックします。

40.5.1.2 「プロパティ」ウィンドウを使用してXPath式を編集する手順

  1. 「プロパティ」ウィンドウが表示されていない場合は、Oracle JDeveloperのメニュー・バーから「ウィンドウ」→「プロパティ」の順に選択します。

    「プロパティ」ウィンドウのデフォルトの場所は、XSLTマップ・エディタの下です。

  2. ソースからターゲットへのマッピングを表す線をクリックして選択します。「プロパティ」ウィンドウには、選択したマップ線に対応するXPath式が表示されます。

  3. 「XPathの編集」を必要に応じて編集します。

    たとえば、「説明」フィールドにソースで最初に発生するコメントを含める場合は、最初のコメントのインデックスを持つ式に条件を追加します。

    XPath式の編集に関するその他の情報が必要な場合は、「プロパティ」ウィンドウで「ヘルプ」アイコンをクリックします。

  4. 変更内容でXSLTを更新するには、「プロパティ」ウィンドウの左上隅にある「変更の適用」アイコンをクリックします。または、XSLTマップ・エディタの任意の場所をクリックします。

40.5.1.3 XPath関数の既存のXPath式への追加方法

既存のソースからターゲットへのマッピングの上に関数をドラッグ・アンド・ドロップできます。マップ上に関数をドロップすると、ドロップされた関数の最初のパラメータを移入するために既存のロケーション・パス式が使用されます。

次の手順では、前述の項(「既存のソースとターゲットのマッピングの変更方法」)で編集した式を変更します。concat関数を使用して、ソースの最初のコメントをソースの説明を連結します。

XPath関数を既存のXPath式に追加する手順は、次のとおりです。

  1. 「コンポーネント」ウィンドウが表示されていない場合は、Oracle JDeveloperのメニュー・バーから「ウィンドウ」→「コンポーネント」の順に選択します。
  2. 「コンポーネント」ウィンドウで、「一般XPath」を選択します。隣にあるプラス記号(+)をクリックして「文字列関数」セクションを開きます。
  3. 「concat」関数アイコンを、「文字列関数」セクションから編集する既存のマップを表す線にドラッグします。線が、関数をドロップできることを示す緑色に変わります。
  4. 「concat」関数を線の上にドロップします。関数がマップに挿入され、concat関数の最初のパラメータが既存のXPath式の値に設定されます。

    注意:

    関数をマップに追加しない場合、その関数はパラメータを持たない可能性があります。たとえば、「xp20:current-date」関数を既存の線にドロップした場合に、「xp20:current-date」関数はパラメータをとらないため、効果がありません。

40.5.2 キャンバス・ペインでの既存の関数XPath式の変更方法

XPath関数はキャンバス・ペインに表示され、いくつかの方法で編集できます。前述の項(「XPath関数の既存のXPath式への追加方法」)の例から引き続き、concat関数の2番目のパラメータの値をいくつかの方法で設定します。

40.5.2.1 ドラッグ・アンド・ドロップを使用して関数パラメータを設定する手順:

  1. ソース・ツリーのDescription要素からキャンバス・ペインの「concat」関数アイコンの左側まで線をドラッグします。関数のそれぞれの可能なパラメータに対するコネクタが含まれているポップアップ・パネルが表示されます。

  2. 目的のコネクタに線をドロップします。前述の図では、2番目に必要なパラメータを示す2番目のコネクタ上に線をドロップしています。3番目のオプションのパラメータ上に線をドロップして、2番目のパラメータ値を後で入力することも選択できます。

    パラメータが関数に追加されます。必要なすべてのパラメータを追加すると、警告アイコンが表示されなくなります。

40.5.2.2 関数パラメータを削除する手順:

関数パラメータを削除するには、関数パラメータへの入力を示す線を選択して、[Delete]キーを押します。または、線を右クリックして、コンテキスト・メニューから「削除」を選択します。

40.5.2.3 完全XPath式としての関数の編集方法

「XPathパスの編集」ダイアログまたは「プロパティ」ウィンドウの「XPathパスの編集」パネルを使用して、XPath関数をテキストのXPath式として編集できます。

40.5.2.3.1 XPathの編集ダイアログを使用して関数をテキストのXPath式として編集する手順:
  1. キャンバス・ペインの関数のアイコンの境界領域で式フォルダをダブルクリックします。「XPathの編集」ダイアログが表示されます。

    かわりに中央のアイコンをダブルクリックすると、「関数の編集」ダイアログが表示されます。

  2. 「XPath式」を必要に応じて編集します。DescriptionノードにXPathのロケーション・パスを追加するには、たとえば、最初のパラメータの後ろにカーソルを置きます。[Ctrl]を押しながら[Space]を押して、「/ns0:PurchaseOrder」をダブルクリックして選択します。

    /ns0:PurchaseOrderが式の挿入され、/ns0:PurchaseOrderノードの可能な子がドロップダウン・メニューに移入されます。

  3. 「Description」エントリをダブルクリックして選択します。マウス・カーソルをエントリ上に置き、[Enter]キーを押して選択することもできます。

  4. 「XPathの編集」ダイアログで「OK」をクリックします。

40.5.2.3.2 「プロパティ」ウィンドウを使用して関数をテキストのXPath式として編集する手順:
  1. 「プロパティ」ウィンドウが表示されていない場合は、Oracle JDeveloperのメニュー・バーから「ウィンドウ」→「プロパティ」の順に選択します。

    「プロパティ」ウィンドウのデフォルトの場所は、XSLTマップ・エディタの下です。

  2. キャンバス・ペインの関数のアイコンの境界領域で式フォルダをクリックします。「プロパティ」ウィンドウの右側のペインに、関数の完全な「XPath式」が表示されます。

  3. 「XPath式」を必要に応じて編集します。前述の手順の手順2から3も参照してください。

  4. 変更内容でXSLTを更新するには、「プロパティ」ウィンドウの左上隅にある「変更の適用」アイコンをクリックします。または、XSLTマップ・エディタの任意の場所をクリックします。

40.5.2.4 関数の個々のパラメータの編集方法

各パラメータのXSLTを別の「XPath式」フィールドで編集できるように、XPathマップ・エディタでは関数を対応するパラメータに解析できます。

40.5.2.4.1 「関数の編集」ダイアログを使用して関数のパラメータを編集する手順:
  1. キャンバス・ペインで関数のアイコンをダブルクリックします。「関数の編集」ダイアログが表示されます。

    中央の関数のアイコンをダブルクリックしてください。関数のアイコンの境界領域をダブルクリックすると、「XPathの編集」ダイアログが表示されます。

  2. 必要に応じて、関数パラメータをそれぞれ編集します。「ヘルプ」をクリックして、パラメータの編集に関する情報を確認することもできます。

  3. 必要に応じて、新しいパラメータを追加するには、緑色のプラス記号(+)で表される「追加」アイコンをクリックします。

  4. パラメータの編集が終了したら「OK」をクリックします。

40.5.2.4.2 「プロパティ」ウィンドウを使用して関数のパラメータを編集する手順:
  1. 「プロパティ」ウィンドウが表示されていない場合は、Oracle JDeveloperのメニュー・バーから「ウィンドウ」→「プロパティ」の順に選択します。

    「プロパティ」ウィンドウのデフォルトの場所は、XSLTマップ・エディタの下です。

  2. キャンバス・ペインで関数のアイコンの中央領域をクリックします。「プロパティ」ウィンドウの右側のペインに、関数パラメータが表示されます。

  3. 必要に応じて、関数パラメータを編集します。「ヘルプ」アイコンをクリックして、パラメータの編集に関する情報を確認することもできます。

  4. 必要に応じて、新しいパラメータを追加するには、緑色のプラス記号(+)で表される「追加」アイコンをクリックします。

  5. 変更内容でXSLTを更新するには、「プロパティ」ウィンドウの左上隅にある「変更の適用」アイコンをクリックします。または、XSLTマップ・エディタの任意の場所をクリックします。

40.5.3 キャンバス・ペインでの新しい関数の作成方法

XSLTキャンバス・ペインで新しい関数を作成するには、いくつかの方法があります。これらについては、後続の各項で説明します。

40.5.3.1 キャンバスのコンテキスト・メニューを使用してXPath関数を作成する手順

  1. キャンバス・ペインの中央の空白領域を右クリックします。表示されるコンテキスト・メニューで「XPathの作成」を選択します。

  2. 「XPathの作成」のサブメニューから、必要な関数を選択します。たとえば、「日付関数」カテゴリから「current-date」関数を選択します。

    関数をターゲット・ノードに接続するように求める「情報」ダイアログが表示される場合があります。「OK」をクリックします。

    キャンバス・ペインに関数のアイコンが表示されます。

  3. 関数からターゲット・ノードに線をドラッグすることで、関数をターゲット・ノードにマッピングします。

  4. 関数でパラメータが必要な場合は、「キャンバス・ペインでの既存の関数XPath式の変更方法」で説明する方法の1つを使用してパラメータを編集します。

40.5.3.2 「コンポーネント」ウィンドウを使用してXPath関数を作成する手順

  1. 「コンポーネント」ウィンドウが表示されていない場合は、Oracle JDeveloperのメニュー・バーから「ウィンドウ」→「コンポーネント」の順に選択します。

  2. 「コンポーネント」ウィンドウで、「一般XPath」または「拡張XPath」を選択します。関数のカテゴリ(たとえば「文字列関数」)を選択します。

  3. 「コンポーネント」ウィンドウからXSLTマップ・エディタのキャンバス・ペインの中央に目的の関数をドラッグします。

  4. 関数からターゲット・ノードに線をドラッグすることで、関数をターゲット・ノードにマッピングします。

  5. 関数でパラメータが必要な場合は、「キャンバス・ペインでの既存の関数XPath式の変更方法」で説明する方法の1つを使用してパラメータを編集します。

40.5.3.3 ターゲット・ツリーのコンテキスト・メニューを使用してXPath関数を作成する手順

  1. XPath関数を割り当てる必要のあるターゲット・ツリー・ノード(マップ・ビュー)またはXSLTツリー・ノード(XSLTビュー)を右クリックします。コンテキスト・メニューが表示されます。

  2. 「XPathの作成」を選択します。表示されるサブメニューから、必要なXPath関数を選択します。

    関数がキャンバス・ペインで作成され、作成されたターゲット・ノードまたはXSLTノードにリンクされます。

  3. 関数でパラメータが必要な場合は、「キャンバス・ペインでの既存の関数XPath式の変更方法」で説明する方法の1つを使用してパラメータを編集します。

40.5.3.4 ターゲット・ツリーにドラッグすることでXPath関数を作成する手順

  1. 「コンポーネント」ウィンドウが表示されていない場合は、Oracle JDeveloperのメニュー・バーから「ウィンドウ」→「コンポーネント」の順に選択します。

  2. 「コンポーネント」ウィンドウで、「一般XPath」または「拡張XPath」を選択します。関数のカテゴリ(たとえば「文字列関数」)を選択します。

  3. 目的の関数を「コンポーネント」ウィンドウから、関数を割り当られるターゲット・ツリー・ノード(マップ・ビュー)またはXSLTツリー・ノード(XSLTビュー)にドラッグします。ターゲットまたはXSLTのツリー・ノードの左側に緑色のハイライト表示が表示されます。

  4. 緑色のハイライト表示が表示されている間に関数をドロップします。

    関数がキャンバス・ペインで作成され、関数がドロップされたターゲット・ノードまたはXSLTノードにリンクされます。

  5. 関数でパラメータが必要な場合は、「キャンバス・ペインでの既存の関数XPath式の変更方法」で説明する方法の1つを使用してパラメータを編集します。

40.5.4 関数をまとめて連鎖させる方法

関数を別の関数と連鎖させる手順は次のとおりです。

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

  1. left-trim関数とright-trim関数をconcat関数の枠線の領域にドラッグします。
  2. 図40-35に示すように、一方の関数の出力側から次の関数の入力側に線をドラッグして、2つの関数を連鎖します。

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

40.5.5 XPath式の削除方法

XPath式を削除する手順は次のとおりです。

  1. キャンバス・ペインでXPath式/関数のアイコンを選択します。
  2. アイコンを右クリックして、コンテキスト・メニューから「削除」を選択します。

40.5.6 ユーザー定義関数のインポート方法

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

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

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

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

    XSLTマップ・エディタの拡張関数のコード方法は、Oracle BPELプロセス・マネージャの拡張関数とは異なります。mapper-107-extension-functionsサンプル・シナリオのSampleExtensionFunctions.javaファイルには、2つの例があります。これらのサンプルやその他のサンプルをダウンロードするには、Oracle SOA Suiteサンプルを参照してください。

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

    • java.lang.String

    • int

    • float

    • double

    • boolean

    • oracle.xml.parser.v2.XMLNodeList

    • oracle.xml.parser.v2.XMLDocumentFragment

    これらの関数のテキストは、次のとおりです。

    // SampleExtensionFunctions.java
    package oracle.sample;
    /*
    This is a sample XSLT Map Editor 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に設定する必要があります。このファイルのフォーマットの詳細は、「ユーザー定義XPath拡張関数の作成」を参照してください。次の構文は、手順1でコードされている関数toKilogramsおよびreplaceCharを表します。

    <?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クラスの完全な修飾名である必要があります。

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

      表40-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を再起動します。

    新しい関数は、「コンポーネント」ウィンドウで、「ユーザー定義」ページの「ユーザー定義拡張関数」グループに表示されます。

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

40.6 自動マップを使用した複合ノードのマッピング

非リーフ・ソース要素を非リーフ・ターゲット要素にマッピングする際は、自動マップ機能により、子ソース要素がそれに対応するターゲット要素に自動的に一致します。自動マップでは要素の名前、タイプおよびパスを確認して、正しいマッピングを提示します。また、自動マップでは、プリファレンスに応じてオプションのノードのxsl:if文を挿入できます。

自動マップ機能は、ターゲット・スキーマが使用される場合にのみ使用できます。マップ・ビューとXSLTビューの両方で、自動マップを使用できます。

40.6.1 自動マップのプリファレンスの設定方法

「プリファレンス」ダイアログを使用して、自動マップ機能の動作を指定できます。「ツール」メニューで「プリファレンス」を選択します。左側のナビゲーション・ツリーで、「XSLマップ」の下の「自動マップ」を選択します。図40-36は、自動マップのプリファレンスのデフォルト設定を示しています。

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

図40-36の説明が続きます
「図40-36 「自動マップ・プリファレンス」」の説明

次のリストは、構成可能な「自動マップ・プリファレンス」の様々な設定について説明しています。

  • 自動マップの結果を確認: このオプションを選択すると、一致するソースおよびターゲット要素を自動的にマッピングする前に、「自動マップ」にそれらの要素のリストが表示されます。一致した組合せの中から、適用するものを選択できます。

  • 自動マップの前にプリファレンスをプロンプト: このオプションを選択すると、2つの複合ノードをマッピングしようとするたびに「自動マップ・プリファレンス」ダイアログが表示されます。

  • モード: 自動マップを基本モードまたは拡張モードのどちらで実行するかを指定します。モード選択により、このダイアログで表示される残りのオプションが決まります。

「基本モード」を選択した場合に使用できる残りのオプションは、次のとおりです。

  • 類似した名前による要素の一致: 類似した名前の要素が一致します。

  • 完全な名前による要素の一致: 完全に同じ名前の要素が一致します。

  • 完全なタイプによる要素の一致: 完全に同じデータ・タイプの要素のみが一致します。

  • 祖先名を考慮した要素の一致: 一致の際、要素名とともに要素のパスも考慮されます。

  • xsl:ifの挿入: xsl:if文を自動的に挿入するかどうかを指定します。次の設定が使用されます。

    • なし: xsl:if文は自動的には挿入されません。

    • ソース・ノードが存在していることを確認: xsl:if文は、出力でノードが作成される前に、ソース・ノードの存在を確認して挿入されます。

    • ソース・ノードが空でないことを確認: xsl:if文は、出力でノードが作成される前に、ソース・ノードが空でないことを確認して挿入されます。

「拡張モード」を選択した場合に使用できる残りのオプションは、次のとおりです。

  • 祖先の重み: 祖先の一致の重要度を示す0から5の数字です。0の数字は、基本モードでの「祖先名を考慮した要素の一致」オプションの選択解除に対応します。5の数字は、基本モードでの「祖先名を考慮した要素の一致」オプションの選択に対応します。

  • 言語の重み: 要素名の一致の重要度を示す0から5の数字です。0の数字は、要素名が一致している必要がないことを示します。5の数字は、要素名が完全に一致している必要があることを示します。

  • タイプの重み: 要素名の一致の重要度を示す0から5の数字です。0の数字は、要素タイプが一致している必要がないことを示します。5の数字は、要素タイプが完全に一致している必要があることを示します。

  • 一致のしきい値(%): 自動マップで、各マップ(祖先、言語、タイプ)の一致率を計算して、その中で最も高い割合を選択します。最も高い一致率がしきい値の割合を超える場合に、一致が作成されます。

  • ディクショナリ: 既存のディクショナリを自動マップに追加できます。ディクショナリは、既存のマップから定義し、後続のマップで使用できます。

40.6.2 自動マップの実行方法

自動マップを実行する手順は次のとおりです。

  1. 複合ソース・ノードをXSLTペインのターゲット要素にドラッグ・アンド・ドロップします。マップ・ビューを使用している場合は、ソース・ノードをターゲット・ペインのノードにドロップします。
  2. 「自動マップ・プリファレンス」によっては、「プリファレンス」ダイアログが表示されることがあります。自動マップのプリファレンスを選択し、「OK」をクリックします。
  3. 「自動マップ・プリファレンス」によっては、「自動マップ」ダイアログが表示されることがあります。自動マップで作成された一致を検証し、「OK」をクリックします。

40.7 マップの完了ステータスの確認

マップでターゲット・スキーマを使用している場合は、マップの完了ステータスをいつでも確認できます。これは、マップ・ビューとXSLTビューの両方で実行できます。完了ステータスを確認すると、次のものにフラグが付きます。

  • マップされていないすべてのターゲット要素および属性。フラグは、ターゲット要素がターゲット・スキーマで必要な要素であるかどうかを示します。

  • 不完全なXPath式でマッピングされたターゲット要素。たとえば、ターゲット・ノードにマッピングされたXPath関数のパラメータが失われている場合があります。

  • 失われたすべてのターゲット要素および属性。フラグは、失われたターゲット要素がターゲット・スキーマで必要な要素であるかどうかを示します。

マップの完了ステータスを確認するには、キャンバス・ペイン(中央)を右クリックし、コンテキスト・メニューで「完了ステータス」を選択します。「完了ステータス」ダイアログが表示され、不完全なターゲット・ノードがすべて示されます。完了ダイアログ・ステータスの行をクリックして、XSLT/ターゲット・ツリーで対応するノード位置を選択します。図40-37は、失われたノードがハイライト表示されている「完了ステータス」ダイアログを示しています。

図40-37 「完了ステータス」ダイアログ

図40-37の説明が続きます
「図40-37 「完了ステータス」ダイアログ」の説明

40.8 マップのテスト

XSLTマップ・エディタには、マップをテストするためのツールが用意されています。テスト・ツールを起動するには、キャンバス・ペインを右クリックし、コンテキスト・メニューから「テスト」を選択します。このテスト・ツールは、マップ・ビューとXSLTビューの両方で使用できます。

図40-38は、「XSLマップのテスト」ダイアログを起動する様子を示しています。

図40-38 テスト・ダイアログの起動

図40-38の説明が続きます
「図40-38 テスト・ダイアログの起動」の説明

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

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

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

図40-39の説明が続きます
「図40-39 「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」をクリックします。

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

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

40.8.1.1 DVM参照関数を使用するXSLTマップをテストする方法

DVM参照関数が含まれているXSLTマップをテストできます。ローカル・ファイルまたはMDSのファイルを参照するDVM参照関数をマップで使用する場合で、これらのファイルにJDeveloper環境からアクセスできる場合は、追加の手順を実行する必要はありません。

JDeveloper環境からアクセスできないファイルを参照するDVM参照関数をマップで使用している場合は、テスト用にローカルのDVMファイルを作成でき、XSLTのDVM参照を変更する必要はありません。次の手順に従います。

  1. XSLTテストをまだ実行していない場合は、このテスト・ツールを一度実行します。このテスト・ツールによって、XSLNonDeployedFilesフォルダにUnitTestURLs.dvmが生成され、XSLTファイルと同じフォルダに配置されます。

    UnitTestURLs.dvmファイルには、XSLTファイルのDVM参照とローカルのテスト・ファイルへのDVM参照間のマッピングが含まれています。テストするXSLTファイルにファイル(oramds:/apps/AIAMetaData/dvm/CUSTOMERPARTY_STATUSCODE.dvm)への参照があるが、JDeveloperのこのファイルへのアクセス権がない場合は、テストを実行するファイルに対してローカルのDVM参照ファイルを作成できます。

  2. JDeveloperで、XSLNonDeployedFilesフォルダにあるUnitTestURLs.dvmファイルを開きます。
  3. 「serverURL」列の下に、XSLTで参照するDVMファイルへの参照を追加します。
  4. 「testURL」列の下に、テストで使用するローカル・ファイルへの参照を追加します。
  5. UnitTestURLs.dvmファイルを保存します。
  6. テストDVMファイルにテスト・データを移入します。
  7. テスト・ツールを実行します。参照はローカル・ファイルに対して実行されます。このローカル・ファイルを指すようにXSLTを変更する必要はありません。テストでは、UnitTestURLs.dvmファイルを使用して、「serverURL」列に定義されている参照用の正しいテスト・ファイルを参照します。

40.8.1.2 XREF関数を使用するXSLTマップをテストする方法

ローカルのdvm参照ファイル(UnitTestXrefFunctionReturn.dvmという名前)を使用して、テストをエミュレートできます。このファイルは、XSLTテストを最初に実行したときに自動的に生成されます。

UnitTestXrefFunctionReturn.dvmファイルには、すべてのXREF関数に対するデフォルトのレスポンスが含まれています。これによって、関数が正しく実行されたときに予想されるレスポンスをシミュレートします。デフォルトのレスポンスは変更できます。さらに、パラメータ値が異なる場合に、同じ関数の別の呼出しに対して異なる戻り値を作成することもできます。

次の図はDVMファイルの最初の状態を表しています。

図40-41 UnitTestXrefFunctionReturn.dvmファイル

図40-41の説明が続きます
「図40-41 UnitTestXrefFunctionReturn.dvmファイル」の説明

「FunctionName」列には関数の名前を指定します。最初は、各関数にデフォルトの動作が定義された1つのエントリのみがあります。すべてのXREF関数は、このデフォルト情報を使用して実行されます。必要に応じて、指定された関数にさらにエントリを作成したり、入力パラメータに基づいて関数に別の戻り値を入力できます。

「returnValue」列には関数の戻り値を指定します。これには、関数から返される値を定義します。

その他の列には、指定されたパラメータの値に基づいて、1つの関数コールを別の関数コールと区別するために使用できる修飾子を定義します。これらの各列には、指定された関数コールで使用可能なパラメータを定義します。すべてのパラメータがすべての関数で使用できるわけではありません。パラメータが使用できない場合は、元の表にNA (使用不可)とマークされます。

40.8.1.2.1 returnValueの使用:

「returnValue」列は、SBL_001などのテキスト値として定義されるか、パラメータ名によって定義されるかのいずれかです。たとえば、最初の関数であるlookupXRefを見ると、この関数にはRefColumnValueという戻り値があります。これはパラメータの名前(RefColumnValue)であるため、このパラメータの値は、XSLTに対する関数の戻り値です。

たとえば、lookupXRef関数に対して次のようなコールを実行するとします。

lookupXRef( oramds:/apps/AIAMetaData/xref/CUSTOMERPARTY_PARTYLOCATIONID.xref",
"COMMON_ID", "COMMON_001", "SBL_ID", false())

これは渡されたRefColumnValueパラメータの値のため、値COMMON_001が返されます。

markForDelete関数では、値trueが返され、ブールに変換されます。

lookupXRef1M関数およびlookupPopulatedColumns関数では、関数によってノードセットが返されます。このノードセットには、次の書式の要素が含まれています。

<column name="columnNameHere">columnValueHere</column>

図40-41に示すとおり、lookupXRef1M関数のデフォルト値は次のとおりです。

:RefColumnName:RefColumnValue:ColumnName:RefColumnValue

これによって、関数からノードセットで返される2つの列ノードの列名と値がエンコードされます。最初の文字は、情報の解析で使用されるデリミタを定義します。データにコロン(:)が含まれている場合は、デリミタとしてテスト・データにない任意の文字を使用できますが、その文字を最初の文字として配置し、データを区切るために使用する(#abc:def#abc:ghiなど)ことで使用できます。

たとえば、lookupXRef1Mに対して次の関数コールを実行するとします。

lookupXRef1M ("oramds:/mydata", "COMMON_ID", "COMMON_001", "SAP_ID", false())

:RefColumnName:RefColumnValue:ColumnName:RefColumnValueの戻り値にデフォルト定義を使用すると、次の2つの列要素が返されます。

<column name="COMMON_ID">COMMON_001</column>
<column name="SAP_ID">COMMON_001</column>

:SAP_ID:SAP_001:SBL_ID:SBL_001:ORCL_ID:ORCL_001returnValueを持つようにDVMで行を変更した場合、関数によって次の3つの列ノードが返されます。

<column name="SAP_ID">SAP_001</column>
<column name="SBL_ID">SBL_001</column>
<column name="ORCL_ID">ORCL_001</column>
40.8.1.2.2 追加行の追加:

DVMファイルに行を追加することもできます。パラメータに別の入力値を指定することで、関数に追加の行を追加して、別の戻り値が返されるようにできます。

たとえば、同じXREFファイルに対して複数の参照が設定されているときに、参照ごとに異なる値を返したい場合に、DVMファイルのlookupXRefに次の行を追加できます。

テキストで説明します。

正しい戻り値の決定では、デザインタイム・エミュレータは、DVM表の一番下から開始して、パラメータ値の最初に一致する値を検索します。最初の一致行に対応する戻り値が返されます。

前述の図に示すとおり、たとえば、lookupXRef("oramds:/apps/AIAMetaData/xref/CUSTOMERPARTY_PARTYLOCATIONID.xref", "COMMON_ID", "COMMON_001", "SBL_ID", false()),に対するコールでは、値SBL_001が返されます。

一方、lookupXRef("oramds:/apps/AIAMetaData/xref/CUSTOMERPARTY_PARTYLOCATIONID.xref", "COMMON_ID", "COMMON_002", "SBL_ID", false())に対するコールでは、最後の3行に一致するものがないため、デフォルト値COMMON_002 (パラメータRefColumnValueの値)が返されます。

40.8.2 レポートの生成方法

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

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

  • ターゲット・ドキュメントのマッピング

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

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

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

  1. キャンバス・ペイン(中央)で右クリックして、「XSLTマップのレポートの生成」を選択します。

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

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

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

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

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

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

  • 繰返し要素の数

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

  • オプション要素の生成

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

  • 最大の深さ

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

40.9 外部XSLTマップのインポート

JDeveloper以外のエディタで開発されたXSLTマップがある場合、そのマップをJDeveloperにインポートできます。

外部マップをインポートする手順は次のとおりです。

  1. 「ファイル」メイン・メニューから、「新規」→「ギャラリから」を選択します。
  2. 「カテゴリ」で「一般」→「XML」を選択します。「アイテム」で「XSLスタイルシートからのXSLマップ」を選択します。「OK」をクリックします。「XSLTチューザ」ダイアログが表示されます。
  3. インポートするXSLTファイルを選択します。「OK」をクリックします。ファイルが開き、ソースまたはターゲット・スキーマ定義のないデフォルト・ヘッダーが挿入されます。
  4. ソースおよびターゲットのスキーマ定義を作成するには、キャンバス・ペイン(中央)を右クリックし、「ソース・スキーマの置換/追加」を選択してソース・スキーマを設定します。「ターゲット・スキーマの置換/追加」を選択して、ターゲット・スキーマを設定します。

    注意:

    インポートしたマップは、ソースおよびターゲット・スキーマが両方とも定義され、マップ・ビューでサポートされないXSLT機能がない場合にのみ、マップ・ビューを使用できます。

    すべてのマップはXSLTビューを使用できます。

40.10 変数およびパラメータの使用

変数およびパラメータをXSLTマップに追加できます。これらは、マップ・ビューとXSLTビューの両方で使用できます。

40.10.1 グローバル変数の追加方法

グローバル変数は、マップ・ビューとXSLTビューの両方で使用できます。

グローバル変数を作成するには:

  1. ソース・ペインの任意のノードを右クリックし、コンテキスト・メニューから「グローバル変数の追加」を選択します。または、XSLTツールバーに緑色のプラス記号で表示される「追加」アイコンをクリックして、「グローバル変数の追加」を選択します。このオプションは、「作成」オプションの下にあるキャンバスのコンテキスト・メニューでも使用できます。

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

  2. 変数の名前、および必要な場合はオプションのネームスペースおよび接頭辞を入力します。
  3. 「OK」をクリックします。

    XSLTビューとマップ・ビューのどちらを使用しているかに応じて、XSLTペインまたはターゲット・ペインの最上部に変数ノードが表示されます。

    この変数は、「変数」フォルダのソース・ツリーにも表示されます。これにより、変数からXPath式またはターゲット・ツリーのノードにマッピングできます。

    注意:

    現在のリリースの変数に対して構造を定義することはできません。参照している変数が複雑な構造を示す場合は、適切なXPath式を手動で入力することで、構造内のノードを参照できます。

40.10.2 マップ・ビューでのローカル変数の追加方法

マップ・ビューでローカル変数を追加する手順は、次のとおりです。

  1. ターゲット・ツリーで既存のノード(イタリック体のグレー表示でない)を右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」→「variable」の順に選択します。

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

  2. 変数の名前、および必要な場合はオプションのネームスペースおよび接頭辞を入力します。
  3. 「OK」をクリックします。

    変数が、ターゲット・ツリーの選択したノードのすぐ上に追加されます。

    この変数は、「変数」フォルダのソース・ツリーにも表示されます。これにより、変数からXPath式またはターゲット・ツリーのノードにマッピングできます。

    変数が特定のXSLTノードまたはXPath式のスコープ内にあるかどうかを判別するには、ターゲット・ツリー・ノードまたはXPath式を選択します。変数がターゲット・ツリー・ノードまたはXPath式のスコープ内にある場合、その変数はソース・ツリーに太字で表示されます。変数が選択したターゲット・ツリー・ノードまたはXPath式のスコープ内にない場合、その変数は無効化された状態でソース・ツリーに表示されます。

    スカラー変数のみを定義できます。変数の構造は定義できません。参照している変数が複雑な構造を示す場合は、適切なXPath式を手動で入力することで、構造内のノードを参照できます。

40.10.3 XSLTビューでのローカル変数の追加方法

XSLTビューでは、ローカル変数は、その他のXSLT要素と同じ方法で追加されます。コンテキスト・メニューまたは「コンポーネント」ウィンドウを使用したXSLT要素の追加の詳細は、「XSLT文の追加方法」を参照してください。

そこでたとえば、XSLTノードのコンテキスト・メニューで「兄弟を前に挿入」→「XSL」→「変数」を選択すると、「変数」ダイアログ・ボックスが表示されます。変数名を入力し、オプションでネームスペースを指定して、「OK」をクリックします。

XSLT/ターゲット・ペインの適切な場所に変数が表示されます。XPath式をその変数にマッピングして、変数の値を設定することを選択できます。

この変数は、「変数」フォルダのソース・ツリーにも表示されます。これにより、変数から他のXPath式またはXSLTノードにマッピングできます。

変数が特定のXSLTノードまたはXPath式のスコープ内にあるかどうかを判別するには、XSLTノードまたはXPath式を選択します。変数がXSLTノードまたはXPath式のスコープ内にある場合、その変数はソース・ツリーに太字で表示されます。変数が選択されたXSLTノードまたはXPath式のスコープ内にない場合、その変数はソース・ツリーに無効化して表示されます。

スカラー変数のみを定義できます。変数の構造は定義できません。参照している変数が複雑な構造を示す場合は、適切なXPath式を手動で入力することで、構造内のノードを参照できます。

注意:

XSLT 1.0を使用して、複雑な変数を使用する場合、XPath式を使用して変数内のノードにアクセスする前に、ora:node-set関数内で変数を折り返す必要がある場合があります。

たとえば、myVar変数が次のような構造になっているとします。

<xsl:variable name="myVar">
  <A>
     <B>sometext</B>
  </A>
</xsl:variable>

Bのテキストはora:node-set($myVar)/A/Bとして参照できます。このnode-set関数はXSLT 2.0では不要です。

40.10.4 グローバル・パラメータの追加方法

パラメータは、グローバル・パラメータおよび名前付きテンプレート・パラメータの両方として、XSLTマップ・エディタに追加できます。

グローバル・パラメータは、XSLTマップの作成時に追加できます。詳細は、「XSLTマップの作成方法」を参照してください。グローバル・パラメータを既存のマップに追加することもできます。

グローバル・パラメータを既存のマップに追加する手順は次のとおりです。

  1. ソース・ペインの任意のノードを右クリックし、コンテキスト・メニューから「グローバル・パラメータの追加」を選択します。

    または、XSLTツールバーに緑色のプラス記号で表示される「追加」アイコンをクリックして、「グローバル・パラメータの追加」を選択します。図40-43に、XSLTマップ・エディタの最上部にあるXSLTツールバーを示します。

    図40-43 XSLTツールバーからのグローバル・パラメータの追加

    図40-43の説明が続きます
    「図40-43 XSLTツールバーからのグローバル・パラメータの追加」の説明

    キャンバス(中央)・ペインの任意の場所を右クリックし、コンテキスト・メニューから「作成」→「グローバル・パラメータの追加」の順に選択することもできます。

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

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

    図40-44の説明が続きます
    「図40-44 「パラメータの追加」ダイアログ」の説明
  2. パラメータの「ローカル名」を入力し、オプションでネームスペースを指定します。

    パラメータが複合パラメータの場合は、パラメータにスキーマおよび要素定義を指定できます。ダイアログの「ヘルプ」ボタンをクリックすると、個々のフィールドの詳細情報が表示されます。

  3. 「パラメータの追加」ダイアログで「OK」をクリックして、パラメータを作成します。

ターゲット・ペイン(マップ・ビューの場合)またはXSLTペイン(XSLTビューの場合)の適切な場所にパラメータ・ノードが表示されます。これにより、XPath式をパラメータにマッピングして、パラメータのデフォルト値を設定できます。

このパラメータはソース・ツリーにも表示されます。これにより、パラメータをXPath式またはXSLTツリー内のノードにマッピングできます。

注意:

他のXSLT要素のように、パラメータを追加することもできます。コンテキスト・メニューまたは「コンポーネント」ウィンドウを使用したXSLT要素の追加の詳細は、「XSLT文の追加方法」を参照してください。

40.11 要素およびタイプの置換

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

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

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

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

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

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

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

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

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

  1. ソース・ツリーまたはターゲット・ツリーで、置換を適用する要素を右クリックします。XSLTペインを使用している場合は、選択した要素が、置換の前にXSLTに存在する必要があります。
  2. コンテキスト・メニューから「要素またはタイプの置換」を選択します。このオプションが無効な場合、基礎となるスキーマの要素またはそのタイプに対して可能な置換はありません。

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

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

    図40-45の説明が続きます
    「図40-45 「要素またはタイプの置換」ダイアログ」の説明
  3. 要素の置換またはタイプの置換のいずれかを選択します(基礎となるスキーマによっては1つしか使用できない場合があります)。

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

  4. 置換するタイプまたは要素を選択します。
  5. 「OK」をクリックします。

    要素またはタイプが、最初に選択した要素と置換されます。この選択によって表示される結果は、次の項で説明する、置換の種類および置換の実行場所によって異なります。

    • タイプ置換の場合

      • ソース・ツリーでのタイプ置換

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

        注意:

        要素置換とは異なり、ソース・ツリーに表示できるタイプ置換は一度に1つのみです。ただし、ソースで元のタイプと置換タイプの切換えが可能なマップが作成できなくなるわけではありません。

        ソース・ツリーでノードが表示されず、そのノードがXPath式にマッピングされている場合、ノードにマッピングされているXPath式は、中央のキャンバス・ペインには表示されます。

      • マップ・ビューのターゲット・ツリーでのタイプ置換

        前述の図に示すように、元の要素の下にxsi:type属性が追加されます。この属性はマップ・ビューでは無効化されているため、選択されたタイプ値に設定されます。ノードが置換されたことを示す「S」アイコンが要素に表示されます。置換タイプ内のxsi:type属性を除く任意の構造要素にマッピングできます。

      • XSLTビューのXSLTペインでのタイプ置換

        元の要素の下にxsi:type属性が追加されます。その値は選択されたタイプ値に設定されますが、マッピングされる可能性があります。ノードが置換されたことを示す「S」アイコンが要素に表示されます。「スキーマからの子の追加」コンテキスト・メニュー・オプションを使用して、任意の構造要素を追加できます。

        XPath文を使用して「xsi:type」フィールドの値を動的に設定する必要がある場合があります。xsi:typeの値を動的に設定する必要がある場合は、タイプ置換を使用して、実行時に予想される値が必要な構造要素に対して一時的なアクセス権を提供できます。

        必要な要素を追加し、目的のXPath文をxsi:type属性にマッピングして、値を動的に設定します。xsi:typeのランタイム値はデザインタイムには使用できないため、その値が動的に設定されている場合に、タイプ値に依存する要素上に疑問符アイコン(?)が表示されます。

      • XSLTビューのターゲット・ペインでのタイプ置換

        XSLTビューのターゲット・ペインでも置換を実行できます。このペインは、ターゲット・スキーマ・ドキュメントを表します。ターゲット・ペインでタイプ置換を実行後、次の図に示すとおり、元の要素の下にxsi:type属性がそのタイプに関連付けられている構造要素とともに追加されます。

        必要に応じて、これらの要素を選択して、XSLTペインにドロップできます。これらの要素は、XSLTペインの使用可能な「スキーマからの子の追加」コンテキスト・メニュー・オプションにも表示されます。

        たとえば、次の図では、置換要素(Item)のすべての子を選択します。

        次に、次の図に示すとおり、新しいItemノードをItemsノードの子としてXSLTペインにドロップします。

        Itemノードおよびその子が、Itemsノードの子として追加されます。ターゲット・ペインで、別の置換から別の構造を同様に作成できます。

    • 要素置換の場合

      • ソース・ツリーでの要素置換

        元の要素と置換された要素の両方がソース・ツリーに表示され、青い大カッコで接続されています。置換されたノードに「S」アイコンが表示されます。置換要素内の任意の構造要素からマッピングできます。

        前述の図では、ns1:ShipFutureDateAny要素に置換されています。

        次の図に示すとおり、複数の要素を同時に置換することもできます。

      • マップ・ビューのターゲット・ツリーでの要素置換

        前述の図に示すとおり、元の要素と置換された要素の両方が青い大カッコで接続されています。置換されたノードに「S」アイコンが表示されます。置換要素内の任意の構造要素にマップできます。

      • XSLTビューのXSLTペインでの要素置換

        XSLTペインで要素を置換するには、元の要素はXSLTに表示可能な要素である必要があります。Any要素はXSLTペインに表示できないため、次の項で説明するように、XSLTビューのターゲット・ペインで置換する必要があります。抽象要素はXSLTペインに一時的に追加できますが、最終出力としては使用しないでください。置換グループの先頭であり抽象ではない要素は、通常の要素として使用でき、変換もできます。

        次の図のns0:attachment要素は、置換グループの先頭でもある抽象要素です。これに対する置換がXSLTペインで実行されると、この要素はその置換で置き換えられます。

        置換後に、抽象要素が選択した要素で置換されます。「S」アイコンは置換を示します。「スキーマからの子の追加」コンテキスト・メニューを使用して、置換された要素に子要素を追加できます。次の図はこれについて示しています。

      • XSLTビューのターゲット・ペインでの要素置換

        XSLTビューのターゲット・ペインでも置換を実行できます。ターゲット・ペインは、ターゲット・スキーマ・ドキュメントを表します。ターゲット・ペインで要素置換を実行後、次の図に示すように、置換された要素は元の要素の下にそのタイプに関連付けられている構造要素とともに追加されます。

        必要に応じて、これらの要素を選択して、XSLTペインにドロップできます。これらの要素は、XSLTペインの使用可能な「スキーマからの子の追加」コンテキスト・メニュー・オプションにも表示されます。

  6. 置換ノードを削除するには、「S」アイコンがあるノードを右クリックし、コンテキスト・メニューから「置換の削除」を選択します。
  7. 置換が可能なすべてのノードを表示するには、ソース・ツリーまたはターゲット・ツリーを右クリックして、「置換ノード・アイコンの表示」を選択します。

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

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

    図40-46の説明が続きます
    「図40-46 可能なすべての置換」の説明
  8. アイコンを非表示にするには、右クリックして「置換ノード・アイコンの非表示」を選択します。

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

名前付きテンプレートをXSLTマップに追加できます。これらのテンプレートはXSLTマップ・エディタ内で編集できます。名前付きテンプレートは、xsl:call-template命令を使用して起動できます。

名前付きテンプレートは、XSLTビューでのみ使用できます。名前付きテンプレートをXSLTマップに追加すると、そのマップはXSLTビューでのみ開くことができます。

40.12.1 名前付きテンプレートの作成方法

新規の名前付きテンプレートを作成する手順は次のとおりです。

  1. XSLTペインで空白の領域を右クリックし、コンテキスト・メニューから「新規名前付きテンプレート」を選択します。あるいは、次のようにします。
    • キャンバス・ペイン(中央)で空白の領域を右クリックし、コンテキスト・メニューから「作成」→「新規名前付きテンプレート」を選択します。

    • ソース・ペインの任意のソース・ノードを右クリックし、コンテキスト・メニューから「新規名前付きテンプレート」を選択します。

    • XSLTツールバーに緑色のプラス(+)アイコンで表示される「追加」ボタンを選択し、「新規名前付きテンプレート」を選択します。

    「名前付きテンプレートの追加」ダイアログが表示されます。

  2. テンプレートの名前を入力します。オプションで、ネームスペースを設定します。

    「ヘルプ」をクリックすると、ダイアログで使用できるオプションのヘルプを表示できます。

  3. 必要に応じて、緑色のプラス(+)アイコンで表される「追加」ボタンをクリックして、パラメータを追加します。「パラメータの追加」ダイアログが表示されます。
  4. パラメータの名前を入力します。オプションで、ネームスペースを設定します。

    パラメータが複合パラメータの場合は、パラメータにスキーマおよび要素定義を指定できます。ダイアログの「ヘルプ」ボタンをクリックすると、個々のフィールドの詳細情報が表示されます。

  5. 「パラメータの追加」ダイアログで「OK」をクリックして、パラメータを追加します。
  6. 名前付きテンプレートに必要なパラメータがあれば、さらに追加します。
  7. 「名前付きテンプレートの追加」ダイアログで「OK」をクリックして、名前付きテンプレートを作成します。

40.12.2 名前付きテンプレートの編集方法

名前付きテンプレートは作成されるとまず、編集できるように、XSLTマップ・エディタで開かれます。XSLTツールバーのドロップダウン・リストを使用して、名前付きテンプレートの編集とXSLTマップの編集を切り替えることができます。

図40-47は、XSLTマップ・エディタで編集されている名前付きテンプレートを示しています。左上隅にはドロップダウン・リストがあり、これを使用してXSLTマップと名前付きテンプレートのいずれかを選択できます。

ソース・ツリー、グローバル・パラメータおよび名前付きパラメータがある場合は、左側のソース・ペインに表示されます。右上のXSLTペインには、名前付きテンプレートに関連付けられたXSLTが表示されます。ターゲット・スキーマが使用される場合は、エディタの右下隅にターゲット・ツリーが表示されます。

図40-47 名前付きテンプレートの編集

図40-47の説明が続きます
「図40-47 名前付きテンプレートの編集」の説明

40.12.3 既存の名前付きテンプレートへのパラメータの追加方法

既存の名前付きテンプレートにパラメータを追加する手順は次のとおりです。

  1. 名前付きテンプレートがXSLTマップ・エディタに表示されることを確認します。名前付きテンプレートに切り替えるには、XSLTツールバーのドロップダウン・リストから名前付きテンプレートの名前を選択します。例は図40-47を参照してください。
  2. ソース・ノードを右クリックし、コンテキスト・メニューから「パラメータの追加」を選択します。あるいは、次のようにします。
    • キャンバス・ペイン(中央)で空白の領域を右クリックし、コンテキスト・メニューから「作成」→「パラメータの追加」を選択します。

    • XSLTツールバーで、緑色のプラス(+)アイコンで表示される「追加」ボタンをクリックします。表示されるドロップダウン・リストから「パラメータの追加」を選択します。

  3. 「パラメータの追加」ダイアログでパラメータ名およびその他の詳細を指定します。ダイアログの「ヘルプ」ボタンをクリックすると、個々のフィールドの詳細情報が表示されます。
  4. 「パラメータの追加」ダイアログで「OK」をクリックして、パラメータを追加します。

40.12.4 名前付きテンプレートの起動方法

名前付きテンプレートは、xsl:call-template命令を使用して起動します。xsl:call-template命令はXSLTペインでノードとして追加できます。

名前付きテンプレートを起動する手順は次のとおりです。

  1. xsl:call-template命令をXSLTノードとして追加します。xsl:call-template命令は、コンテキスト・メニューまたは「コンポーネント」ウィンドウから追加できます。XSLT要素の追加の詳細は、「XSLT文の追加方法」を参照してください。

    「属性の設定」ダイアログが表示されます。

  2. 起動する名前付きテンプレートを選択します。「OK」をクリックします。

    xsl:call-template命令がXSLTツリーに追加されます。パラメータ(xsl:use-param命令)は子ノードとして追加されます。

  3. xsl:with-param XSLTノードに値をマッピングして、パラメータの値を設定します。

40.13 テンプレート・ルールの使用

テンプレート・ルールは、一致属性を含むxsl:template文です。テンプレート・ルールはXSLTマップ・エディタでサポートされます。テンプレート・ルールはXSLTビューでのみ使用できます。テンプレート・ルールはマップ・ビューではサポートされません。

XSLTマップ・エディタを使用すると、テンプレート・ルールを様々な方法で追加できます。テンプレート・ルールを手動で挿入したり、既存のマッピングをリファクタしてテンプレート・ルールを作成できます。

テンプレート・ルールを手動で追加する場合は、テンプレートをXSLTの適切な場所で起動するためにapply-templates文も挿入する必要があります。テンプレート・ルールを作成するために既存のマップをリファクタする場合は、apply-templates文が自動的に挿入されます。

40.13.1 テンプレート・ルールの作成方法

  1. 次のいずれかの方法を使用して、「新規テンプレート・ルール」ダイアログを起動します。
    • 一致ノードとして機能するノードをソース・ペインで右クリックします。表示されるコンテキスト・メニューから「新規テンプレート・ルール」を選択します。

    • ターゲット・ペインでノードを右クリックします。表示されるコンテキスト・メニューから「新規テンプレート・ルール」を選択します。

    • XSLTペインでノードを右クリックします。表示されるコンテキスト・メニューから「新規テンプレート・ルール」を選択します。

    • キャンバス・ペイン(中央)の空白領域を右クリックします。表示されるコンテキスト・メニューから「作成」→「新規テンプレート・ルール」を選択します。

    • XSLTツールバーに緑色のプラス(+)記号で表示される「追加」アイコンをクリックします。表示されるオプションのリストから「新規テンプレート・ルール」を選択します。

    「新規テンプレート・ルール」ダイアログが表示されます。図40-48に、「新規テンプレート・ルール」ダイアログを示します。

    図40-48 「新規テンプレート・ルール」ダイアログ

    図40-48の説明が続きます
    「図40-48 「新規テンプレート・ルール」ダイアログ」の説明

    「新規テンプレート・ルール」ダイアログには、次のフィールドがあります。

    • 一致ノード: xsl:template定義で一致属性の値を指定します。

      一致属性には、入力XMLドキュメントでノードの一致に使用されるパターンが含まれています。処理中のノードがテンプレートの一致属性に定義されているパターンと一致するときに、XSLTプロセッサはテンプレート内で命令を実行します。

    • 「初期化」セクション: 新しいテンプレート・ルールの内容の決定に使用されます。

      「空のテンプレートの作成」を選択すると、コンテンツのないxsl:template命令を作成できます。または、「テンプレートに生成するノードの選択」を選択して、テンプレートの実行時に作成するターゲット・スキーマ・ノードを表示および選択できます。

      「テンプレートに生成するノードの選択」オプションは、ターゲット・スキーマが使用されている場合にのみ使用できます。

    • ローカル名で検索:「テンプレートに生成するノードの選択」オプションが選択されている場合に、ターゲット・スキーマを表すツリーが表示されます。このオプションでは、ローカル名を使用してターゲット・スキーマ・ツリーでノードを検索できます。

    ダイアログの起動で選択したモードによっては、「新規テンプレート・ルール」ダイアログ・ボックスに自動的にフィールドが移入されている場合があります。表40-2は、各選択内容に応じてあらかじめ移入されるフィールドのリストです。起動方法がリストされていない場合、事前に移入されているフィールドはありません。

    表40-2 「新規テンプレート・ルール」ダイアログの起動方法

    起動元 自動的に移入される情報

    ソース・ペインのノード

    「一致ノード」にソース・ノードへの絶対パスが移入されます。必要に応じてこの値を編集できます。

    「空のテンプレートの作成」オプションは、「初期化」セクションであらかじめ選択されています。必要に応じてこの選択内容を変更できます。

    ターゲット・ペインのノード

    「テンプレートに生成するノードの選択」オプションは、「初期化」セクションであらかじめ選択されており、ターゲット・スキーマが表示されます。「新規テンプレート・ルール」ダイアログの起動に使用されるターゲット・スキーマ・ノードは、ターゲット・ツリーであらかじめ選択されています。必要に応じてこの選択内容を変更できます。

    「一致ノード」フィールドには、テンプレートに対して必要な一致パターンが移入される必要があります。

  2. 「一致ノード」を必要に応じて設定します。一般的な例を次に示します。
    • /ns0:PurchaseOrder/ns0:ShipToContact/ns0:Region: プロセッサがこのパスを持つノードを処理する際にテンプレートが実行されます。

    • Item: プロセッサがItem名を持つノードを処理する際にテンプレートが実行されます。

    • HighPriorityItems/Items/Item: HighPriorityItemsノードの子であるItemsノードの子のItemノードをプロセッサが処理する際にテンプレートが実行されます。

  3. 「初期化」セクションで必要なコンテンツを選択します。テンプレートを作成する出力ノードがわかっている場合は、「テンプレートに生成するノードの選択」オプションを選択し、表示されるターゲット・スキーマ・ツリーから出力ノードを選択します。「ローカル名で検索」フィールドを使用して、ターゲット・スキーマ・ツリー内で検索できます。[Shift]キーを押したまま目的の各ノードをクリックすることで、ターゲット・ツリーで複数のノードを選択できます。
  4. 「新規テンプレート・ルール」ダイアログで「OK」をクリックして、テンプレートを作成します。新しいxsl:template文がXSLTの最後に挿入されます。
  5. テンプレート・ルールを起動する既存のapply-templates文がない場合は、適切なapply-templates文を挿入してテンプレート・ルールを起動します。

    apply-templates文が存在しない場合は、xsl:template文に警告アイコンが、テンプレート内のすべてのノードに疑問符(?)アイコンが表示されます。次の図に例を示します。

    通常、apply-templates文は、テンプレートに含まれるノードを生成する場所に挿入されます。たとえば前述の図では、apply-templates文は、Addressノードおよびその子ノードを作成する必要のある場所に挿入される必要があります。

    テンプレート・ルールを起動するapply-templates文を挿入後、警告アイコンおよび疑問符(?)アイコンは表示されなくなります。

40.13.1.1 例: テンプレート・ルールの作成

例として、次に示すように、既存のマップのテンプレート・ルールを作成します。

この例では、ターゲットのShippedTo要素およびBilledTo要素にAddressを作成するために、ソースのShipTo要素およびBillTo要素のAddress情報を処理する1つのテンプレートを作成します。次の手順に処理を示します。

  1. ソース・ペインのShipToノードまたはBillToノードの下にあるAddressノードを右クリックして、表示されるコンテキスト・メニューから「新規テンプレート・ルール」を選択します。

    「新規テンプレート・ルール」ダイアログが表示されます。「一致ノード」には、ソース・ペインで選択したAddressノードへのパスがあらかじめ移入されています。この一致文字列は、ShipToの下にあるAddress要素に固有のものですが、ソース・ドキュメントのすべての「Address」フィールドを処理するテンプレートを作成する必要があります。

  2. 名前Addressのみが含まれるように「一致ノード」の文字列を変更します。これによって、ドキュメントで表示される場所にかかわらず、ソース・ドキュメントのすべてのAddressノードが一致します。

  3. 「テンプレートに生成するノードの選択」オプションを選択します。ターゲット・スキーマ・ツリーが表示されます。

    テンプレート・ルールが起動されたら、ターゲットにAddress要素をその子とともに作成します。

  4. ShippedTo要素またはBilledTo要素(どちらの要素も同じ構造です)の下にあるAddressノードを選択します。

  5. Addressノードの子を選択するには、[Shift]キーを押したまま、Address要素の最後の子であるZip要素をクリックします。これによって、Address要素およびそのすべての子が選択されます。

  6. 「OK」をクリックして、テンプレート・ルールを作成します。

    ルールがマップでまだ起動されていないため、テンプレートには警告アイコンが表示され、テンプレートを作成したノードには疑問符(?)アイコンが表示されます。

40.13.1.1.1 テンプレートの起動

次に、ターゲットでShippedTo要素およびBilledTo要素にAddress要素を作成するために、ソースのShipTo要素およびBillTo要素の両方のAddress要素に対してテンプレートを起動する必要があります。XSLTで、これらのAddress要素を作成する場所にapply-templates文を作成する必要があります。次の手順に処理を示します。

  1. XSLTペインでInvoiceノードを右クリックして、表示されるコンテキスト・メニューから「スキーマからの子の追加」→「BilledTo」の順に選択します。BilledToノードが、必要な子ノードとともに挿入されます。

  2. XSLTペインでInvoiceノードを右クリックして、表示されるコンテキスト・メニューから「スキーマからの子の追加」→「ShippedTo」の順に選択します。ShippedToノードが、必要な子ノードとともに挿入されます。

  3. ShippedTo/Addressノードを右クリックして、「削除」を選択します。BilledTo/Addressノードに対しても同じ操作を実行します。作成されたテンプレートを使用してAddressノードを作成します。

  4. ShippedToノードを右クリックして、表示されるコンテキスト・メニューから「子の追加」→「XSL」→「apply-templates」の順に選択します。xsl:apply-templates文が追加されます。

  5. BilledToノードを右クリックして、表示されるコンテキスト・メニューから「子の追加」→「XSL」→「apply-templates」の順に選択します。xsl:apply-templates文が追加されます。

  6. ソース・ペインのShipTo/AddressノードからXSLTペインのShippedTo/apply-templatesノードに線をドラッグします。これによって、apply-templates文の属性の選択が設定されるため、xsl:apply-templates文ではShipTo/Addressノードのみが処理されます。

  7. ソース・ペインのBillTo/AddressノードからXSLTペインのBilledTo/apply-templatesノードに線をドラッグします。これによって、apply-templates文の属性の選択が設定されるため、xsl:apply-templates文ではBillTo/Addressノードのみが処理されます。

    テンプレートの起動を定義したため、この時点でテンプレート・ルール上の警告アイコンが表示されなくなります。テンプレート・ルールをクリックすると、次の図に示すとおり、このテンプレートで処理される2つのAddressノードがハイライト表示されます。

    次に、テンプレート・ルールの下のノードをマッピングします。

  8. BillTo/Addressノード、またはShipTo/Addressノードの下にある要素からAddressテンプレート・ルールの下の適切な要素に線をドラッグ・アンド・ドロップします。

    ソースのどちらかのAddress (BillToまたはShipTo)からドラッグすると、両方のソースのAddressに線が引かれます。これは、BillTo/AddressShipTo/Addressの両方がテンプレートのコンテキスト・ノードであるためです。

    この時点のテンプレートのソース・コードは次のようになります。

      <xsl:template match="Address">
        <Address country="{@country}">
          <Street>
            <xsl:value-of select="concat (Street1, ', ' , Street2 )"/>
          </Street>
          <City>
            <xsl:value-of select="City"/>
          </City>
          <State>
            <xsl:value-of select="State"/>
          </State>
          <Zip>
            <xsl:value-of select="Zipcode"/>
          </Zip>
        </Address>
      </xsl:template>
    

40.13.2 テンプレート・ルールを作成するための既存のマップのリファクタ方法

既存のテンプレートからコードをリファクタして、新しいテンプレート・ルールを作成できます。これは、前の例でAddressテンプレート・ルールを作成した場合のように、作成した複数のテンプレート・ルールが再使用できる場合に有用です。

「テンプレートに作成」オプションを使用すると、XSLT命令のセクションを複数の場所から起動可能な別のテンプレートにリファクタできます。

次の例では、既存のマッピングをリファクタしてテンプレート・ルールを作成します。

次のマップでは、ソースの各Address要素を処理するXSLTが、各Addressノードに対して繰返されます。管理を容易にするために、冗長コードを再利用可能なテンプレートに統合することもできます。この方法では、後でコードが更新される場合に、複数のコピーを更新する必要がありません。

前述のマップでは、Street1およびStreet2からStreetを作成するXPath concat式を変更する必要がある場合、変更する必要のあるコピーは2つです。ただし、concat関数が、両方のAddress要素を作成するために再使用される1つのテンプレートに存在する場合は、今後変更が必要になるconcat文は1つのみです。

次の手順では、既存のマッピングをリファクタして、Address要素を処理する1つのテンプレートを作成します。

  1. XSLTビューを使用していることを確認します。XSLTマップ・エディタの右上隅にある「XSLT」をクリックして、XSLTビューに切り替えることができます。
  2. XSLTペインで「ShippedTo/Address」要素を右クリックして、表示されるコンテキスト・メニューから「テンプレートに作成」を選択します。

    「新規テンプレート・ルール」ダイアログが表示されます。

    「一致ノード」には、XSLTペインの選択したノードの下に含まれているXPath式から取得された推奨される一致パターンがあらかじめ移入されています。ターゲット・スキーマ・ツリーで選択された要素は、Addressノードおよびその子です。これらの要素が新しいテンプレート・ルールに移動されます。

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

    新しいテンプレートが作成され、apply-templates文がAddressノードのかわりに挿入されます。XSLTペインのAddressノードの下の要素に定義されているXPath式は、新しいテンプレートのAddressノード(コンテキスト・ノード)への相対パスを含めるために更新されます。

    次に、このテンプレートをShipToおよびBillToの両方のAddress要素に対して使用します。

  4. 新しいテンプレート・ノードをダブルクリックします。「属性の設定」ダイアログが表示されます。
  5. 「パターンの入力」にAddressと入力します。
  6. 「OK」をクリックします。
  7. XSLTペインで、BilledTo/Address要素を削除します。
  8. BilledToノードを右クリックして、「子の追加」→「XSL」→「apply-templates」の順に選択します。これによって、xsl:apply-templates文がAddressノードのかわりに作成されます。
  9. ソース・ペインのBillTo/AddressノードからXSLTペインの新しいBilledTo/apply-templatesノードに線をドラッグします。

    BilledToおよびShippedTo両方のAddress要素が、1つのテンプレート・ルールを使用して作成されました。

40.14 実行ビューの使用

実行ビューには、XSLT文を実行する順序が表示されます。名前付きテンプレートやテンプレート・ルールを使用する複雑なXSLTを作成する際、XSLTテンプレートの実行順序の判断が難しくなることがあります。実行ビューでは、XSLTの実行ツリーを作成することにより、この問題への対応に役立ちます。

実行ツリーは、出力ノードの作成時に表示され、XSLTの実行中、様々な時点でどのテンプレートが起動されるかを正確に示します。

40.14.1 実行ビューを使用したランタイム・エラーの防止または対処方法

「実行ビュー」ダイアログを起動するには、キャンバス・ペイン(中央)を右クリックして、「実行ビュー」を選択します。または、XSLTツールバーで「XSLTマップの実行ビュー」ボタンをクリックします。

実行ビューはマップ・ビューとXSLTビューの両方で使用できます。ただしこれは、マップに複数のテンプレートが含まれ、そのテンプレートがいつ起動されるかをユーザーが理解している必要がある場合に特に役立ちます。

図40-49は、複数のテンプレートが含まれるXSLTマップの「実行ビュー」ダイアログを示しています。実行ビューでは、match='/'が含まれるルート・テンプレートが最初に実行されます。次に、Invoice、DescriptionおよびIDノードが作成されます。さらに、apply-templates文がShipToテンプレートを起動し、続けてapply-templates文がBillToテンプレートを起動します。その後、その他のノードおよびテンプレートが作成されます。

図40-49 「実行ビュー」ダイアログおよび対応するXSLTツリー

図40-49の説明が続きます
「図40-49 「実行ビュー」ダイアログおよび対応するXSLTツリー」の説明

「実行ビュー」ツリーで要素をクリックすると、対応する要素がXSLTツリーでハイライト表示されます。たとえば、図40-49に示すように、BillToテンプレートを起動するapply-templatesノードを特定する場合は、「実行ビュー」でapply-templatesノードを選択すると、対応するapply-templates文がXSLTペインでハイライト表示されます。

実行ビューには、名前付きテンプレートへのコールも表示されます。「実行ビュー」ツリーで名前付きテンプレート・コール内のノードを選択すると、XSLTエディタ・ビューが更新され、選択したノードが名前付きテンプレートの実装で表示されます。

実行ビューは、XSLTスタイルシート全体のフローを理解するのに役立ちます。実行ビューを使用して、起動されないテンプレートに関連する問題や、不適切なテンプレートを起動しようとするapply-templates文を特定できます。

インポートされた名前付きテンプレートまたはテンプレート・ルールを使用する際は、対応するコールが実行ビューに表示されるので、実行ビューを使用して、インポートの優先順位などの問題に対処できます。ただし、実行ビューでは外部XSLTファイルには移動できません。

40.14.1.1 ノードの検索

「実行ビュー」ダイアログには検索機能があり、「実行ビュー」ツリーの特定のノードを検索できます。「ローカル名の検索」フィールド内をクリックして、検索する名前を入力します。

40.14.1.2 表示オプションの設定

実行ツリーで特定のXSLT要素を表示または非表示にする選択ができます。「オプション」をクリックして、「実行ビュー・オプション」ダイアログを表示します。図40-50は、「実行ビュー・オプション」のデフォルトの選択内容を示しています。

図40-50 デフォルトの「実行ビュー・オプション」

図40-50の説明が続きます
「図40-50 デフォルトの「実行ビュー・オプション」」の説明

40.15 XSLTマップのデバッグ

12.2.1以降はSOAデバッガを使用してXSLTマップをデバッグできます。XSLTマップの戦略的な場所にブレークポイントを追加できます。デバッグするとき、デバッガではブレークポイントで実行が停止し、これによってデータおよび出力を検証できます。

XSLTマップが複雑化し、デバッグが困難になる場合があります。たとえば、Java関数やその他の機能がある場合は、アプリケーション・サーバーでテストすることが最適です。また、XSLTはサーバー内の多数の異なるアプリケーションから起動されることがあるため、アプリケーション環境でデバッグする方が簡単な場合もあります。SOAデバッガには、アプリケーション・サーバーにデプロイされたXSLTマップ用のリモート・デバッグ機能が備えられています。

BPELプロセスまたはメディエータで使用されているXSLTトランスフォーメーションをデバッグできます。BPELプロセスまたはMediatorがコンポジットで起動されると、デバッガはマップに定義されているブレークポイントで一時停止します。XSLTマップはJDeveloperで開かれ、XSLT処理に対応するユーザー・データが「データ」ウィンドウに表示されます。

デバッガは、Oracle Service Busプロジェクトにも使用できます。Service Busプロジェクトでデバッガを使用する方法の詳細は、次を参照してください。

Oracle Service Busアプリケーションのデバッグ

40.15.1 XSLTマップ・エディタでのブレークポイントの設定

XSLTマップ・エディタの設計ビューでブレークポイントを設定できます。これにより、実行時にテスト・データまたはペイロードを使用してXSLTマップをデバッグできます。

ブレークポイントは、マップ・ビューまたはXSLTビューのいずれかで設定できます。ブレークは、ターゲットまたはXSLTペインの右側にあるブレークポイント・バーに赤い点で示されます。

ブレークポイントを設定する前に、XSLTマップが開かれ、「設計」が選択されていることを確認します。

次のいずれかの方法で、ブレークポイントを設定します。

  • XSLT要素またはノードの右側にあるブレークポイント・バーをクリックします。

  • XSLT要素またはノードの右側にあるブレークポイント・バーを右クリックし、表示されるコンテキスト・メニューから「ブレークポイントの切替え」を選択します。

  • XSLT要素を右クリックし、表示されるコンテキスト・メニューから「デバッグ」→「ブレークポイントの切替え」を選択します。

注意:

前述の手順を使用して既存のブレークポイントを削除することもできます。

前述のコンテキスト・メニューから「ブレークポイントの無効化」を選択してブレークポイントを無効にすることもできます。無効にしたブレークポイントは、ブレークポイント・バーにグレーのアイコンで表示されます。

次の図に、ponumberノードに設定されたブレークポイントを示します。

ponumberノードに対して赤いドットとして表示されているブレークポイント

40.15.2 XSLTマップでのデバッガの実行

デバッグ・セッションの開始

XSLTマップにブレークポイントを設定した後、次の手順に従ってSOAデバッガを開始します。

SOAコンポジット・アプリケーションのデバッグ

注意:

デバッガでXSLTマップをトレース実行するには、マップがSOAコンポジットのメディエータまたはBPELプロセスで起動されている必要があります。

XSLTマップ・エディタでのデバッガの使用

デバッガを実行した後、デバッガは、XSLTマップのブレークポイントに到達したときに実行を停止します。ブレークポイント・バーの左側の青い矢印は、デバッガの現在の位置を示します。また、点滅する青いアイコンが、対応するXSLT要素またはノードに表示されます。

デバッガがXSLTマップをたどる際、XSLTエディタですべての有効なブレークポイントが赤と緑の点に変わります。赤一色のままのブレークポイントは現在無効であり、デバッガによって無視されます。

注意:

XSLTマップを起動したプロセスの中には、タイムアウト制限を持つものがあります。XSLTマップの終了後、デバッガが予期せず終了した場合、起動元のプロセスにタイムアウト値が定義されている可能性があります。プロセス全体のデバッグをサポートするためにこのタイムアウト値を再定義する必要がある場合があります。デバッガが予期せず中途終了する場合、サーバー・ログ・ファイルで詳細を確認します。

次の図の例は、実行中に表示されるブレークポイントを示しています。tIDおよびItem要素にブレークポイントが表示されています。現在、デバッガはItemノードの位置にあり、そのことが青い矢印と点滅するアイコンで示されています。

ブレークポイント

JDeveloperのメイン・ツールバーにある「ステップ実行」ボタンを使用して、ステップ実行できます。ステップ・イン・ボタンを使用すると、ループcall-template、apply-templateおよびapply-importsにステップ・インできます。「ステップ・アウト」ボタンを使用すると、call-template、apply-templateおよびapply-importsからステップ・アウトして次のXSLT文に進むことができます。

ステップ・オーバー・ボタン

実行中の任意の時点で、パラメータおよび変数の現在の値をデバッガの「データ」ウィンドウで確認できます。「データ」ウィンドウには、コンテキスト・ノード、コンテキスト位置、コンテキスト・サイズおよびXSLT処理によって作成される出力ドキュメントも表示されます。デバッガの「データ」ウィンドウで表示可能な任意の項目を選択して、「ウォッチ」ウィンドウに追加することもできます。

次の図に、右側の「データ」ウィンドウに表示されたサンプルのデバッガ・データを示します。

サンプルのデバッガ・データ –名前および値

デバッグ中にXSLTを編集することを選択できます。再度デバッグするには、プロジェクトを再デプロイする必要があります。

40.15.3 ブレークポイントの表示

ブレークポイントは、XSLTマップ・エディタの右端に沿ったブレークポイント・バーに表示されます。XSLTマップまたはSOAプロジェクトですべてのブレークポイントのリストを表示することを選択できます。

XSLTマップのすべてのブレークポイントのリスト表示

次のいずれかの方法で、現在のXSLTマップのすべてのブレークポイントを表示します。

  • 中央のキャンバス・ペインで任意の場所を右クリックし、表示されるコンテキスト・メニューから「ブレークポイント」を選択します。

  • ブレークポイント・バーの任意の場所を右クリックし、表示されるコンテキスト・メニューから「ブレークポイント」を選択します。

  • XSLTツールバーで「ブレークポイント」をクリックします。

「ブレークポイント」ダイアログが表示され、XSLTマップのすべてのブレークポイントが一覧表示されます。現在、ブレークポイントがXSLTペインで非表示になっている場合、「ブレークポイント」ダイアログでブレークポイントをクリックすることにより、そこに移動できます。

「ブレークポイント」ダイアログ

「ブレークポイント」ダイアログを使用して、1つ以上のブレークポイントを無効または削除することもできます。無効になったブレークポイントは、ブレークポイント・バーにグレーの点で表示されます。

「有効」列は、ブレークポイントが現在有効かどうかを示します。XSLTマップの編集で無効にした場合、ブレークポイントが無効になります。無効なブレークポイントを削除することを選択できます。また、XSLTマップへの変更を取り消すと、無効なブレークポイントが再度有効になる可能性があります。

現在のプロジェクトのすべてのブレークポイントの表示

JDeveloperの「ブレークポイント」ウィンドウには、現在のプロジェクトのすべてのブレークポイントが表示されます。「ウィンドウ」メニューから「ブレークポイント」を選択して、「ブレークポイント」ウィンドウを表示します。「ブレークポイント」ウィンドウでブレークポイントをダブルクリックして、プロジェクト内のそのブレークポイントに移動できます。「ブレークポイント」ウィンドウからブレークポイントを編集または削除することもできます。ただし、「ブレークポイント」ウィンドウからブレークポイントを追加することはできません。

40.15.4 XSLTブレークポイントの条件の設定

ブレークポイントに条件を設定して、ブレークポイント条件がtrueと評価された場合にのみ実行を停止するようにできます。

次の手順を使用してXSLTブレークポイントに条件を設定します。
「ブレークポイント」ウィンドウが表示されていない場合は、JDeveloperの「ウィンドウ」メニューから「ブレークポイント」を選択できます。
  1. 「ブレークポイント」ウィンドウでブレークポイントを右クリックします。表示されたコンテキスト・メニューから「編集」を選択します。
    「XSLTブレークポイントの編集」ダイアログが表示されます。
  2. 「条件」タブで、javascript構文を使用して条件式を入力します。
    たとえば、次のブレークポイントは、$Part変数のPartNum属性がp1になったときに中断します。
    「XSLTブレークポイントの編集」ダイアログ
  3. 条件に「パスの回数」を設定することも選択できます。パスの回数は、特定の回数通過するまでブレークポイントを無視するようにデバッガに指示します。パスの回数が一致すると、デバッガはそのブレークポイントで実行を中断します。
  4. 「OK」をクリックして、条件を設定します。

40.16 メモリーの問題のトラブルシューティング

大量のスキーマ・ドキュメントを使用している場合、自動マッピング中、テスト中およびレポート生成中に、メモリー不足エラーが発生する場合があります。XSLTマップ・エディタの使用中にメモリー不足エラーが発生した場合は、JVMのヒープ・サイズを増やして問題を解決する必要があります。

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

  1. アプリケーション・インストールのconfigファイルを特定します。

    共有Oracle JDeveloperのproduct.confファイルまたはオプションのツール固有の.confファイルをユーザーのホーム・ディレクトリで特定します。これらのファイルの場所は、ホスト・プラットフォームによって異なります。

    • Windowsプラットフォームの場合:

      通常、ユーザー・ファイルおよび製品ファイルの場所は、インストール中に構成されますが、おそらく次の場所にあります。

      %APPDATA%\JDeveloper\product-version\product.conf

      %APPDATA%\JDeveloper\product-version\jdev.conf

    • UNIXプラットフォームの場合:

      $HOME/.jdeveloper/product-version/product.conf

      $HOME/.jdeveloper/product-version/jdev.conf

  2. ファイルを編集して、AddVMOptionを必要な値に変更します。次に例を示します。
    AddVMOption -Xmx1024M

    注意:

    AddVMOption値は、64ビット・マシンでは大きくできます。マシンで提供されるRAMのサイズに近づけるとパフォーマンスが向上します。

40.17 XSLマップ・プリファレンスの設定

「プリファレンス」ダイアログを使用して、XSLTマップに関連するプリファレンス(展開の深さなど)や、XSLTマップ・エディタに関連するプリファレンス(初期化オプションなど)を設定します。

40.17.1 XSLTマップのプリファレンスの設定方法

XSLTマップのプリファレンスを設定するには、「ツール」メニューから「プリファレンス」を選択します。「プリファレンス」ダイアログの左側のペインに表示されるナビゲーション・ツリーで「XSLマップ」をクリックします。図40-51は、表示される「XSLマップ」ダイアログを示しています。

図40-51 XSLマップのプリファレンス

図40-51の説明が続きます
「図40-51 XSLマップのプリファレンス」の説明

ソースおよびターゲット・ツリーの展開の深さなど、様々なオプションを設定できます。各フィールドの詳細は、「ヘルプ」ボタンをクリックして参照してください。

40.17.2 XSLエディタのプリファレンスの設定方法

XSLTマップのプリファレンスを設定するには、「ツール」メニューから「プリファレンス」を選択します。「プリファレンス」ダイアログの左側のペインに表示されるナビゲーション・ツリーで、「XSLマップ」の横にあるプラス記号(+)をクリックします。これで、XSLマップ・ノードが展開されます。「XSLエディタ」を選択します。図40-52は、「XSLエディタのプリファレンス」ダイアログを示しています。

図40-52 XSLエディタのプリファレンス

図40-52の説明が続きます
「図40-52 XSLエディタのプリファレンス」の説明

初期化モードなど、XSLTマップ・エディタの様々なプリファレンスを設定できます。各フィールドの詳細は、「ヘルプ」をクリックしてください。

40.17.3 カスタマイズ・ファイルをインポートしてXSLTマップ・エディタの表示プリファレンスを指定する方法

XSLTマップ・エディタの表示プリファレンスを含むカスタマイズ・ファイルを指定できます。「XSLエディタのプリファレンス」ダイアログ(図40-52)で、カスタム表示オプション構成ファイル・フィールドの右側にある「参照」ボタンをクリックします。インポートするファイルを選択します。

このカスタマイズ・ファイルはXMLファイルで、次の場所にあるbpm-ide-common.jarファイルのXSLTEditorOptions.xsdスキーマに従う必要があります。

oracle/tip/tools/ide/common/resource/XSLTEditorOptions.xsd

次の例は、サンプルのカスタマイズ・ファイルを示しています。このファイルの重要な要素については、例の後に説明します。

<?xml version="1.0" encoding="UTF-8" ?>
  <customizeXSLTeditor>
      <selectedArea>HL7</selectedArea>
      <abbreviationLists>
          <abbreviationList name="Siebel">
              <abbreviation long="Account" short="Acct"/>
          </abbreviationList>
          <abbreviationList name="SalesGeneral">
              <abbreviation long="SalesOrder" short="SO"/>
              <abbreviation long="PurchaseOrder" short="PO"/>
              <abbreviation long="BillOfMaterial" short="BOM"/>
              <abbreviation long="CreateEngineeringChangeOrderList" short="CECOL"/>
          </abbreviationList>
      </abbreviationLists>
      <customization area="HL7">
          <showFixedValueInElementName>
               <path>@LongName</path>
               <path>@LongName2</path>
               <path>@Name</path>
          </showFixedValueInElementName>
          <abbreviations>
             <apply display="treeLabels">
                 <hideText part="matchValue" maxLength="13" hide="left"/>
                 <hideText part="namedTemplateName" maxLength="15" hide="left"/>
                 <hideText part="importHref" maxLength="20" hide="left"/>
             </apply>
             <apply display="dropDownLists">
                 <hideText part="namedTemplateName" maxLength="40" hide="center"/>
             </apply>
          </abbreviations>
      </customization>
      <customization area="AIA">
          <abbreviations>
             <applyAbbreviations list="Siebel"/>
             <applyAbbreviations list="SalesGeneral"/>
             <apply display="treeLabels">
                 <hideText part="matchValue" maxLength="13" hide="left"/>
                 <hideText part="namedTemplateName" maxLength="15" hide="left"/>
                 <hideText part="importHref" maxLength="20" hide="left"/>
             </apply>
             <apply display="dropDownLists">
                 <hideText part="namedTemplateName" maxLength="40" hide="center"/>
             </apply>
          </abbreviations>
      </customization>
  </customizeXSLTeditor>
 

次のリストは、前述の例の重要な要素について説明しています。

  • <selectedArea>: エディタで使用するカスタマイズ領域を選択します。カスタマイズ領域のリストをこのファイルで定義できます。

  • <abbreviationList name="listName">: カスタマイズ領域で参照できる略語リストを定義します。

  • <abbreviation name="Account" short="Acct">: 略語リストで使用する個々の略語を定義します。

  • <abbreviations>: カスタマイズ領域内で使用し、略語および、エディタのテキストのカットオフの長さを定義します。

  • <applyAbbreviations>: このカスタマイズ領域で使用する略語リスト(複数可)を選択します。

  • <apply display="treeLabels" | "dropDownLists">: テキストのカットオフが行われる領域を選択します。

  • <hideText>: テキストが長すぎる場合にカットオフする特定のテキスト・フィールドを選択します。

  • @part: "matchValue"、"namedTemplateName"または"importHref"です。

  • @maxLength: テキスト値の長さの制限値です。

  • @hide: テキストで非表示にする部分を指定します。"left"は左側のテキストを切り捨てます。"right"は右側のテキストを切り捨てます。"center"は中央のテキストを削除し、「」に置き換えます。

  • <showFixedValueInElementName>: カスタマイズ領域内で使用されます。この要素は、長い名前や、エディタのソースまたはターゲット・ツリーに要素名の一部として表示するその他のテキストを含む、固定値属性を選択します。

    次に例を示します。

    <showFixedValueInElementName>
       <path>@LongName</path>
       <path>@LongName2</path>
       <path>@Name</path>
    </showFixedValueInElementName>
    

    前述の例では、XSLTマップ・エディタ・ツリーの任意の要素の1番目の固定値の名前はLongName、LongName2で、Nameが要素ツリー名の一部として表示されます。

    固定属性値は、ツリー内の実際の要素名の右側のカッコ内に表示されます。これは、HL7スキーマで特に役立ちます。このスキーマでは、記述名がスキーマの固定属性値として追加されます。