この章では、XSLTマップ・エディタを使用して、ソース・スキーマ要素とターゲット・スキーマ要素の間のデータ・トランスフォーメーションを作成、設計およびテストする方法について説明します。
この章の内容は次のとおりです。
XSLTマップ・エディタでは、グラフィック表示のエディタを使用して、XSLTスタイルシートを編集できます。また、XSLTソースを直接編集する機能もあります。
図40-1に、XSLTマップ・エディタを示します。エディタ下部のタブを使用して、グラフィック表示のエディタとソース・ビューを切り替えることができます。グラフィック表示のエディタを使用して編集するには、「設計」をクリックします。ソース・エディタを使用して編集するには、「ソース」をクリックします。
「ソース」タブと「設計」タブを行き来できます。一方のタブで変更を加えると、もう一方のタブでも反映されます。「履歴」タブを使用して、リビジョンの履歴を表示し、編集履歴の任意の時点に戻ることも可能です。
XSLTマップ・エディタはXSLT 1.0およびXPath 1.0を完全にサポートしています。
XSLT 2.0を使用する場合、ソース・ビューでXSLTバージョンを変更できます。
XSLT 2.0固有のすべてのコンストラクトをソース・ビューで追加する必要があります。その後、設計ビューへの切替えを選択して、引き続きマップを編集できます。XSLT 2.0固有のコンストラクトは設計ビューに表示されますが、ソース・ビューでのみ変更できます。XPath 2.0のコンストラクトも設計ビューで追加できます。ただし、XPath 2.0のコンストラクトは解析して、設計ビューの個別のグラフィカル要素にはできません。完全なXPath文をテキスト形式で編集する必要があります。
XSLTマップ・エディタでは、設計ビューで次の編集ビューを使用できます。
マップ・ビュー
XSLTビュー
XSLTエディタの右上隅にあるボタンを使用して、2つのビューを切り替えられます。XSLTエディタの従来のマップ・ビューを使用するには、「マップ」をクリックします。より複雑なXSLTマップ向けのXSLTビューを使用するには、「XSLT」をクリックします。
図40-1に、XSLTマップ・エディタのマップ・ビューを示します。左側のペインには、受信ソースXMLドキュメントを表すソース・ツリーが含まれています。このソース・ツリーはXSDスキーマ・ファイルまたはサンプルXMLファイルから作成できます。
中央のペイン、またはキャンバスは、XSLT要素にマッピング可能なXPath式および関数をドロップする場所です。
右側のペインは、作成するXSLTのマージ済ビューを表すターゲット・ペインと、ターゲット・スキーマを表すターゲット・ツリーです。このターゲット・ツリーはXSDスキーマ・ファイルまたはサンプルXMLファイルから作成できます。
ターゲット・ツリーにイタリック体でグレー表示されたノードは、まだマッピングされていないノードを表します。これらのノードはXSLTの一部ではなく、便宜上表示されています。グレー表示のノードはマッピングされると、通常のフォントになり、XSLTマップに表示されます。
マップ・ビューでは、ソース・ツリーからターゲット・ツリーへのドラッグ・アンド・ドロップ・マッピングがサポートされます。さらにマップ・ビューでは、XPath関数のコールおよび、xsl:if
やxsl: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ビューを使用します。
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スタイルシートをグラフィック表示して編集できます。
「コンポーネント」ウィンドウには、XSLTマップで使用できるすべてのXPath関数と、XSLT要素およびテンプレートが含まれています。
「コンポーネント」ウィンドウは、デフォルトではOracle JDeveloperの右上隅にあります。「コンポーネント」ウィンドウが表示されない場合は、「ウィンドウ」メニューの「コンポーネント」をクリックすると、「コンポーネント」ウィンドウが表示されます。オプションで、「JDeveloper」ウィンドウの使いやすい場所に「コンポーネント」ウィンドウをドラッグする選択ができます。また、「コンポーネント」ウィンドウは必要に応じてサイズを変更できます。
「コンポーネント」ウィンドウではこれらの関数、要素およびテンプレートを次のカテゴリにまとめます。
拡張XPath:
一般XPath:
XML:
XSLT要素:
XSLTテンプレート:
すべてのページ:
ユーザー定義:
コンポーネント:
「プロパティ」ウィンドウは、XSLTマップ・エディタで選択されたアイテムの内容およびプロパティを示します。これらのプロパティの一部は、編集も可能です。
「プロパティ」ウィンドウは、デフォルトではXSLTマップ・エディタの下にあります。「プロパティ」ウィンドウが表示されない場合は、「ウィンドウ」メニューの「プロパティ」をクリックすると、「プロパティ」ウィンドウが表示されます。オプションで、「JDeveloper」ウィンドウ内の使いやすい場所に「プロパティ」ウィンドウをドラッグする選択ができます。また、「プロパティ」ウィンドウは必要に応じてサイズを変更できます。
「プロパティ」ウィンドウは、通常、次のアイテムのプロパティの表示および編集に使用できます。
エディタで選択された要素 | 「プロパティ」ウィンドウの表示内容 | 編集の可否(はい/いいえ) |
---|---|---|
ソース・ツリー・ノード |
選択された要素または属性のスキーマ情報 |
いいえ |
ターゲット・ツリー・ノード |
選択された要素または属性のスキーマ情報 |
いいえ |
XSLTツリー・ノード: XSLT要素 |
XSLT要素の属性およびその値 |
はい |
XSLTツリー・ノード: リテラル要素または属性 |
リテラル要素または属性の名前およびネームスペース |
はい |
「キャンバス」ペインのXPath式フォルダ |
全文XPath式 |
はい |
「キャンバス」ペインの式フォルダ内の「関数」アイコン |
関数の各パラメータのXPathフィールド |
はい |
ソースおよびターゲット・ノードをつなぐ線 |
全文XPath式 |
はい |
XSLT1マップは一から作成するか、BPEL、BPM、メディエータなど、他のエディタから作成できます。
XSLT transformアクティビティを使用すると、Oracle BPEL Process ManagerのXSLTマップ・エディタを使用してトランスフォーメーションを作成できます。このツールを使用すると、1つ以上のソース要素をターゲット要素にマップできます。たとえば、受信したソース注文書スキーマ・データを、送信する請求書スキーマ・データにマップできます。
Oracle BPEL Process ManagerでXSLマップ・ファイルを作成する手順は、次のとおりです。
「コンポーネント」ウィンドウから、XSLT transformアクティビティをBPELプロセス・ダイアグラムにドラッグします。図40-2に例を示します。
XSLT transformアクティビティをダブルクリックします。
図40-3に示す「Transform」ダイアログが表示されます。
次の情報を指定します。
要素のマップ元となるソース変数を追加します。追加するには、「追加」アイコンをクリックして、変数と、必要に応じて変数のパート(たとえば、注文書リクエストで構成されるペイロード・スキーマ)を選択します。
注意:
複数の入力変数を選択できます。定義されている最初の変数が、XSLマップへのメインXML入力を表します。ここで追加される他の変数は、XSLマップでは入力パラメータとして定義されます。
要素のマップ先となるターゲット変数を追加します。
注意:
図40-3は、BPEL 2.0での「変換の編集」ダイアログを示しています。BPEL 1.1の「変換の編集」ダイアログは少し異なります。BPEL 1.1の「変換の編集」ダイアログでは、変数のリストから「ターゲット変数」を選択できます。
マップ先となる変数のターゲット・パート(たとえば、請求書で構成されるペイロード・スキーマ)を追加します。
「マッパー・ファイル」フィールドで、マップ・ファイル名を指定するか、デフォルト名をそのまま使用します。XSLTマップ・エディタを使用して、マップ・ファイルにマッピングを作成します。
「追加」アイコン(「マッパー・ファイル」フィールドの右側にある2番目のアイコン)をクリックして、マッピングを作成します。ファイルが存在する場合は、「編集」アイコン(3番目のアイコン)をクリックしてマッピングを編集します。
XSLTマップ・エディタが表示されます。
注意:
拡張子が.xslt
の既存のファイル(たとえば、xform.xslt
)を選択すると、xform.xslt
ファイルを使用するつもりでもXSLTマップ・エディタが開き、xform.xslt.xsl
という名前のXSLファイルが作成されます。拡張子が.xsl
ではないすべてのファイルに.xsl
拡張子が追加され、新規ファイルでマッピングを作成する必要が発生します。回避策として、ファイル名には必ず拡張子.xsl
を付けるようにします。XSLファイルの拡張子が.xslt
である場合は、.xsl
に変更します。
XSLTマップ・エディタの使用方法の概要は、「XSLTマップ・エディタの概要」を参照してください。
次の手順では、po.xsd
ファイルとinvoice.xsd
ファイルを使用して、Oracle BPEL Process ManagerでXSLマップを作成する方法の概要を説明します。
Oracle BPEL Process Managerで、インポートされたソースとターゲット・スキーマ・ファイルからXSLマップ・ファイルを作成する手順は、次のとおりです。
Oracle JDeveloperで、新規XSLマップを作成するアプリケーション・プロジェクトを選択します。
プロジェクトにpo.xsdおよびinvoice.xsdファイルをインポートします。次に例を示します。
Oracle JDeveloperの「構造」ウィンドウで、「スキーマ」を右クリックします。
「スキーマのインポート」を選択します。
選択したプロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」ダイアログが表示されます。
「カテゴリ」ツリーで、「SOA層」を開いて「トランスフォーメーション」を選択します。
「項目」リストで、「XSLマップ」をダブルクリックします。
「XSLマップ・ファイルの作成」ダイアログが開きます。このダイアログでは、ターゲットのスキーマ・ファイルまたはWeb Services Description Language (WSDL)ファイルのルート要素にソースのスキーマ・ファイルまたはWSDLファイルのルート要素をマップする、XSLマップ・ファイルを作成できます。次の詳細に注意してください。
プロジェクトに追加されたWSDLファイルは、「プロジェクトのWSDLファイル」の下に表示されます。
プロジェクトに追加されたスキーマ・ファイルは、「プロジェクトのスキーマ・ファイル」の下に表示されます。
プロジェクトの一部ではないスキーマ・ファイルは、スキーマ・ファイルのインポート機能を使用してインポートできます。「スキーマ・ファイルのインポート」アイコン(スキーマ・ファイル・リストの右上にある1番目のアイコン)をクリックしてください。
プロジェクトの一部ではないWSDLファイルは、WSDLファイルのインポート機能を使用してインポートできます。「WSDLファイルのインポート」アイコン(スキーマ・ファイル・リストの右上にある2番目のアイコン)をクリックしてください。
「「ファイル名」」フィールドに、XSLマップ・ファイルの名前を入力します。
ソース・ツリーとターゲット・ツリーでルート要素を選択します。図40-4の例では、ソース・ルート要素にPurchaseOrder要素が選択され、ターゲット・ルート要素にInvoice要素が選択されています。
「OK」をクリックします。
図40-5に示すように、新しいXSLマップが作成されます。
この時点でファイルを保存して閉じるか、トランスフォーメーションの設計を開始します。XSLTマップ・エディタの使用方法の詳細は、「XSLTマップ・エディタの概要」を参照してください。
「コンポーネント」ウィンドウから、transformアクティビティをBPELプロセスにドラッグします。
transformアクティビティをダブルクリックします。
次の情報を指定します。
要素のマップ元となるソース変数を追加します。追加するには、「追加」アイコンをクリックして、変数と、必要に応じて変数のパート(たとえば、注文書リクエストで構成されるペイロード・スキーマ)を選択します。
注意:
複数の入力変数を選択できます。定義されている最初の変数が、XSLマップへのメインXML入力を表します。ここで追加される他の変数は、XSLマップでは入力パラメータとして定義されます。
要素のマップ先となるターゲット変数を追加します。
マップ先となる変数のターゲット・パート(たとえば、請求書で構成されるペイロード・スキーマ)を追加します。
「マッパー・ファイル」フィールドの右側にある「検索」アイコン(1番目のアイコン)をクリックし、ステップ6で指定したファイル名を参照します。
「開く」をクリックします。
「OK」をクリックします。
XSLTマップ・エディタにXSLマップ・ファイルが表示されます。
XSLTマップ・エディタの使用方法の概要は、「XSLTマップ・エディタの概要」を参照してください。
XSLTマップ・エディタを使用すると、Oracle Mediatorで、XMLスキーマ間でデータを変換するためのXSLファイルを作成できます。XSLファイルを定義した後は、そのファイルを複数のルーティング・ルール仕様で再利用できます。この項では、XSLTマップ・エディタを使用してトランスフォーメーション・マップXSLファイルを作成する方法の概要を示します。
XSLTマップ・エディタは、Oracle JDeveloperの「アプリケーション」ウィンドウでXSLファイルをクリックするか、メディエータ・エディタで「トランスフォーメーション」アイコンをクリックすると使用できます(次の手順で説明します)。新規のトランスフォーメーション・マップを作成するか、既存のトランスフォーメーション・マップを更新できます。
メディエータ・エディタでXSLTマップ・エディタを起動してデータ・トランスフォーメーションXSLファイルを作成または更新するには、次の手順に従います。
メディエータ・エディタでXSLマップ・ファイルを作成する手順は、次のとおりです。
基本的なフォーマット・データ以外の既存のマッピング・エントリをすべてXSLファイルから手動で削除した場合、XSLファイルのエラーは、実行時のトランスフォーメーション中には表示されません。マッピング・エントリは必ず指定してください。たとえば、次の処理を実行するとします。
トランスフォーメーション・マッピングの定義または値の割当てを行わずに、Oracle Mediatorを介してペイロードを渡すようにSOAコンポジット・アプリケーションを設計した場合、ペイロードはOracle Mediatorを介して渡されます。
ただし、ペイロードが正しく渡されるには、ソース・メッセージとターゲット・メッセージのパート名およびタイプが同じである必要があります。それ以外の場合、SOAプロジェクトのコンパイルが失敗します。11gからアップグレードされたプロジェクトでは、プロジェクトはコンパイルされますが、入力
ソースが
Null
のようです
またはパートが
見つかり
ません
というエラー・メッセージが表示されて、ターゲット参照の実行に失敗する可能性があります。
XSLファイルのXML表現と、シナリオで使用するXML表現(このシナリオでは、トランスフォーメーションを実行するか、assignアクティビティを使用してメッセージを渡します)は、XMLが構文的およびセマンティク的に同じであっても異なる場合があります。たとえば、Oracle Mediatorサービス・コンポーネントを使用して、ネームスペースのない要素を含むインバウンド・ペイロードをアウトバウンド・ペイロードにマップすると、出力メッセージに空のネームスペース・タグが出力されることがあります。
<Country xmlns="">US</Country>
これは正常な動作です。空のネームスペースxmlns=""
は自動的に追加されます。
この項では、マップ・ビューで使用できる基本的な機能について説明します。残りの各項では、XSLTビューでの編集について、注意や制限事項も含めて説明しますが、これは説明する特定のアクティビティにマップ・ビューで適用される可能性があります。
ソースの属性の値またはリーフ要素をターゲットの属性またはリーフ要素にコピーするには、ソース・ノードからターゲット・ノードに線をドラッグします。ドラッグ・アンド・ドロップすると、緑色にハイライト表示された線が表示されます。ドロップし終わると、ソース・ノードとターゲット・ノードをつなぐ線が描画されます。
図40-10は、ソース要素PurchaseOrder/IDがターゲット要素Invoice/IDにマッピングされたマップ・ビューを示しています。ソース・ノードとターゲット・ノードが線でつながれていることを確認してください。また、ターゲット・ツリーのID要素がグレー表示でなくなり、通常のフォントで表示されます。これは、ID要素がXSLTマップに追加されたことを示しています。
出力ドキュメントで空ノードを作成する手順は次のとおりです。
条件文(if-then-else)や反復(for-each)などのコンストラクトを処理するために、XSLT文を追加できます。
ターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」を選択します。追加可能な様々なXSL文が含まれたサブメニューが表示されます。
サブメニューから、目的のXSL文(if、choose、for-eachなど)を選択します。
XSLT文xsl:text
およびxsl:variable
は、既存のノードにのみ追加できます。
ターゲット・ノードがXSLTに存在することを確認します。
ターゲット・ノードがグレー表示されている場合は、そのターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「XSLT内のノードの作成」を選択します。今後このノードはグレー表示されることはなく、XSLTマップに追加されています。
ターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」を選択します。追加可能な様々なXSL文が含まれたサブメニューが表示されます。
サブメニューから「テキスト」または「変数」を選択します。
注意:
xsl:copy-of
文は、マップ・ビューではサポートされていません。これはXSLTビューでサポートされています。
「コンポーネント」ウィンドウからXSLT文をドラッグ・アンド・ドロップすることも選択できます。
「コンポーネント」ウィンドウから「XSLT要素」ページを選択します。文カテゴリのリストが表示されます。
サポートされている文を特定しますが、マップ・ビューの場合、カテゴリにあります。たとえば、for-each文は、「フロー制御」カテゴリに表示されます。
マップ・ビューでは、XSLT文のサブセットのみがサポートされます。これらの文については、後続の項で個別に説明します。
文を、緑色のハイライト表示がノードに表示される(文をドロップできることを示します)まで目的のターゲット・ノードにドラッグします。
文をドロップして、XSLTマップに挿入します。
この後の各項には、マップ・ビューを使用して追加できる様々なXSLT文が列挙されています。
それぞれのスキーマで、ソース・ノードおよびターゲット・ノードがオプションの場合、通常、xsl:if
文は、対応するターゲット・ノードを作成する前にソース・ノードの存在をテストするために使用されます。
図40-11では、「コメント」ノードは、ソースとターゲットの両方でオプションです。「コメント」ノードを囲んでいる大カッコは、これがオプションのノードであることを示しています。
実行時にソースの「コメント」ノードがソース・ドキュメントに存在しない場合、この値は空になります。これによって、ターゲット・ドキュメントに「コメント」ノードが作成され、空の値が設定されます。
ソース・ノードが存在しない場合に空のノードが作成されないようにするには、ターゲットの「コメント」ノードの上にxsl:if
文を追加します。xsl:if
文は、ターゲット・ノードを作成する前に、ソース・ノードの存在をテストします。
ターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」→「if」の順に選択します。xsl:if
ノードが、ターゲット・ノードの親ノードとして追加されます。
xsl:if
ノードの条件を設定するには、ソース・ノードをxsl:if
ノードにドラッグ・アンド・ドロップします。
「コンポーネント」ウィンドウで、「XSLT要素」ページを選択します。
「フロー制御」セクションを開きます。セクションを開くには、「フロー制御」の隣にあるプラス記号(+)をクリックします。
緑色のハイライト表示が表示されるまで「if」アイコンをターゲット・ノードの右側にドラッグします(図40-13を参照)。
緑色のハイライト表示が表示されている間に「if」アイコンをドロップします。xsl:if
ノードが、ターゲット・ノードの親ノードとして追加されます。
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
文では、ソース・ノードが存在する場合にのみターゲット・ノードが作成されることを確認しています。
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マップ・エディタ
ターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」→「choose」の順に選択します。
choose文が、xsl:when
文とともにターゲット・ノードの親ノードとして追加されます。図40-15に、AccountNumberノードにxsl:choose
文を追加した結果を示します。
xsl:choose
文には、複数のxsl:when
文の後にオプションのxsl:otherwise
文を含めることができます。
xsl:otherwise
ノードをxsl:chooseノードに追加するには、ターゲット・ツリーで「xsl:choose」を右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」→「otherwise」の順に選択します。
図40-16に、xsl:choose
文にxsl:otherwise
文を追加した結果を示します。AccountNumberノードがxsl:choose
文の各セクションにコピーされることに注意してください。
存在がテストされるソース・ノードにxsl:when
ノードをマッピングします。現在の例では、ソースのHQAccountノードからターゲットのxsl:whenノードへ線をドラッグします。
xsl:whenケースとxsl:otherwiseケースをマッピングします。現在の例では、HQAccount/AccountNumberノードからxsl:choose/xsl:when/AccountNumberノードへ線をドラッグします。同様に、BranchAccount/AccountNumberノードからxsl:choose/xsl:otherwise/AccountNumberノードへ線をドラッグします。
図40-17に、完成したxsl:choose
コンストラクトを示します。
「コンポーネント」ウィンドウで、「XSLT要素」ページを選択します。
「フロー制御」セクションを開きます。セクションを開くには、「フロー制御」の隣にあるプラス記号(+)をクリックします。
緑色のハイライト表示が表示されるまで「choose」アイコンをターゲット・ノードの右側にドラッグします(図40-18を参照)。
緑色のハイライト表示が表示されている間に「choose」アイコンをドロップします。xsl:choose
ノードが、ターゲット・ノードの親ノードとして追加されます。xsl:choose
ノードには、子xsl:when
ノードが含まれています。
otherwise句を作成するには、「コンポーネント」ウィンドウから、「otherwise」アイコンを緑色のハイライト表示が表示されるまでxsl:chooseノードの左側にドラッグします(図40-19を参照)。
緑色のハイライト表示が表示されている間に「otherwise」アイコンをドロップします。xsl:otherwise
ノードが、xsl:choose
ノードの子ノードとして追加されます。
存在がテストされるソース・ノードにxsl:when
ノードをマッピングします。現在の例では、ソースのHQAccountノードからターゲットのxsl:whenノードへ線をドラッグします。
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>
xsl:for-each
文は、ソース・ノードセット、またはノードのセットをループ処理し、ソース・ノードセットの各ノードに出力ノードを作成するために使用できます。
ターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」→「for-each」の順に選択します。xsl:for-each
文が、ターゲット・ノードの親ノードとして追加されます。
ソース・ノードセットがループ処理するように設定するには、ソース・ノードをxsl:for-each
文にドラッグ・アンド・ドロップします。
図40-20に、xsl:for-each
文の作成例を示します。ソースのPurchaseOrderドキュメントにはItemノードが含まれています。Itemノードはそのアイコンが表すとおり、繰返しノードです。ソース・ドキュメントの各Itemノードでxsl:for-each
文を使用することで、Itemノードがターゲット・ドキュメントに作成されます。
「コンポーネント」ウィンドウで、「XSLT要素」ページを選択します。
「フロー制御」セクションを開きます。セクションを開くには、「フロー制御」の隣にあるプラス記号(+)をクリックします。
緑色のハイライト表示が表示されるまで「for-each」アイコンをターゲット・ノードの右側にドラッグします(図40-21を参照)。
緑色のハイライト表示が表示されている間に「for-each」アイコンをドロップします。xsl:for-each
ノードが、ターゲット・ノードの親ノードとして追加されます。
ソース・ノードセットがループ処理するように設定するには、ソース・ノードを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要素にコピーされます。
次の例は、作成されたコードをソース・ビューで示しています。さらに、ソース・ドキュメントおよび出力ドキュメントのスニペットのサンプルも示しています。
<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
xsl:sort
文をxsl:for-each文に追加して、ソート実行時の基準となるフィールドを指定できます。xsl:sort
命令は、xsl:for-each
に対して、定義されたノードセットの特定の順序によるループ処理を実行させます。
xsl:for-eachノードを右クリックして、表示されるコンテキスト・メニューから「XSL命令の追加」→「sort」の順に選択します。
「属性の設定」ダイアログが表示されます。
必要に応じて、xsl:sort
文に属性を指定します。「OK」をクリックします。
「属性の設定」ダイアログでは、xsl:sort
文に対する属性を設定できます。属性は、ソートが実行される方法を制御します。たとえば、「order」属性を選択した場合、次にソート順として「昇順」または「降順」を選択できます。ソートに必要な属性を選択します。
注意:
属性のデフォルト値が、「属性の設定」ダイアログで事前に選択されています。これらの値は、選択された属性が存在しない場合に使用されます。
たとえば、ソート順序のデフォルトは昇順です。明示的に「order」属性を選択して、昇順を有効にする必要はありません。
xsl:sort
文はxsl:for-each
文のすぐ下に、for-eachの下にある他のノードの前に追加されます。
ソート対象の要素を設定するには、ノードをソースのノードセットの下からxsl:sortノードにドラッグ・アンド・ドロップします。たとえば、USPriceでソートするには、USPriceノードをノードセット要素Itemの下からxsl:sortノードにドラッグします(図40-23を参照)。
「コンポーネント」ウィンドウで、「XSLT要素」ページを選択します。
「フロー制御」セクションを開きます。セクションを開くには、「フロー制御」の隣にあるプラス記号(+)をクリックします。
緑色のハイライト表示が表示されるまで「sort」アイコンをfor-eachノードの下の要素の一番上にドラッグします(図40-24を参照)。
緑色のハイライト表示が表示されている間に「sort」アイコンをドロップします。xsl:sort
ノードが、ハイライトされているノードの兄弟関係ノードとして追加されます。図40-24に示す例では、xsl:sort
ノードはItem要素の兄弟関係として追加されます。
ソート対象の要素を設定するには、ノードをソースのノードセットの下から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>
XSLT命令をターゲット・ツリーで複製する必要がある場合があります。たとえば、2つのfor-each文を隣り合って作成し、ソース・ドキュメント内で2つのノードセットをループ処理するか、同じノードセットで2回ループ処理する場合があります。
xsl:if
やxsl:sort
などのその他のXSLT命令も複製できます。この項では、xsl:for-each
文を使用した複製命令の作成について説明します。同じ手順が他のXSLT命令に適用されます。
xsl:for-each文を複製する手順は、次のとおりです。
この例では、重複xsl:for-each
文を変更して、ソース・ドキュメントにあるLowPriorityItems
ノードの下でItem
ノードをループ処理させます。マッピングを変更する方法は複数あります。次の例は、マッピングを変更する1つの方法を示しています。
for-each文に関連付けられているXPath式を編集する場合は、for-eachの下にあるすべての相対マッピングが自動的に更新されます。次の手順を使用して、重複for-each文に関連付けられているXPath式を変更します。
XPath式を編集するには、2番目のfor-eachに接続されている線をダブルクリックします。これは、図40-25では青い線です。
「XPathの編集」ダイアログが表示されます。「XPath式」フィールドに、このマップに対応するXPath式が表示されます。
XPath式で、HighPriorityItemsをLowPriorityItemsに変更します。「OK」をクリックします。
xsl:for-each
文およびそのすべての子が、LowPriorityItems/Item
ノードセットを参照するようになりました。
for-each文のマッピングを変更するために、そのマッピングを削除して再作成することも選択できます。重複for-each文のマッピングを変更する手順を次に示します。
重複xsl:for-eachノードを右クリックして、表示されるコンテキスト・メニューから「マッピングの削除」を選択します。
「XPathのリファクタ」ダイアログが表示され、for-each文の下でXPath式をリファクタするかどうかが確認されます。
リファクタするには、「いいえ」をクリックします。これによって相対パスが保持され、この相対パスを別のループに適用します。「いいえ」をクリックした後は、for-each文の下にある線が一時的にソース・ツリーから切断されます。
前述の図では、Quantity
フィールドに関連付けられている相対XPath式はQty
です。for-each文にXPath式がないと、相対的に関連付けられるItem
ノードがないため、ソース・ツリーには参照がなくなります。
注意:
通常、ソース・ツリーのノードに解決できないXPath式は、中央のパネルに示されます。これは、前述のケースのように、問題を示す場合があります。上にfor-each式がないため、解決できない相対パスがあります。
設計時にソース参照ノードを特定するには式が複雑すぎる場合にも、XPath式が中央のペインに示されることがあります。
ソース・ツリーのLowPriorityItems/Itemノードから重複xsl:for-each文に、線をドラッグ・アンド・ドロップします。
次の図に示すように、Quantity
フィールドへのマッピングは、LowPriorityItems/Item
ノードの下にあるQty
フィールドに自動的に再接続されます。
マップ・ビューでターゲット・ノードを複製するためには、そのノードがターゲット・スキーマで繰返しノードとして定義されている必要があります。特定のケースでは、前述の項で説明したとおり、for-eachループを使用して繰返しノードを作成できます。その他の場合では、ノードの複数の独立インスタンスを作成し、ソース・ドキュメントの異なる領域を介して、データをそれらのインスタンスにマップする必要がある場合があります。
繰返しターゲット・ノードを複製する手順は、次のとおりです。
現在のXSLTマップから要素または属性を削除するには、その要素または属性が最初にXSLTに存在している必要があります。イタリック体でグレー表示でないターゲット・ツリーにあるノードは、XSLTに存在しているノードです。イタリック体でグレー表示されているノードは、XSLTの一部ではありません。そのようなグレー表示のノードは、ターゲット・スキーマの候補の要素および属性を表し、表示から削除することはできません。
XSLTに存在するターゲット・ノードを削除するには、次のいずれかを実行します。
ターゲット・ノードをクリックして選択します。[Delete]キーを押します。
ターゲット・ノードを右クリックして、表示されるコンテキスト・メニューから「削除」を選択します。
ノードがXSLTから削除され、そのノードへのマッピングも削除されます。削除されたノードは、表示からは削除されません。削除されたノードはイタリック体でグレー表示され、現在はターゲット・スキーマからの可能なターゲット・ノードであり、XSLTの一部ではないことを示します。ただし、削除されたノードが重複ノードであったか、ターゲット・スキーマに準拠しない位置にあった場合は、このノードは表示から削除されます。
次の図は、XSLTマップの一部である2つのCommentノードを示します。
2番目のCommentノードを右クリックして、コンテキスト・メニューから「削除」を選択した場合、次の図に示すとおり、重複ノードがXSLTおよび表示から削除されます。
次に、残りのCommentノードを右クリックして削除します。このノードは表示から削除されませんが、XSLTからは削除され、次の図に示すとおり、外観がグレーのイタリック体に変わります。
この項では、XSLTビューのXSLTペインを使用した基本的な編集機能について説明します。次のリストに、XSLTビューでの編集とマップ・ビューでの編集の主な違いを示します。
XSLTビューでは、XSLTノードとターゲット・スキーマのマージされたビューは提供されません。右側のターゲット・ペインは2つのペインに分割されています。上のペインはXSLTペイン、下のペインはターゲット・ペインと呼びます。ターゲット・スキーマが定義されていない場合、下のペインは表示されません。
ターゲット・ノードをマッピングするには、マッピングの前にこれらのノードをXSLTペインに明示的に追加する必要があります。エディタには、これを行うための複数の方法が用意されています。これらについては後続の項で説明します。
XSLT 1.0命令のすべての種類をXSLTビューで使用できます。これらの命令は、その位置がXSLT仕様と矛盾しない場合は、XSLTパネルの任意の場所に追加できます。
テンプレート・ルール(一致するテンプレート)、名前付きテンプレート、インポート/インクルードなどの多数の拡張機能をXSLTビューで使用できます。これらの拡張機能については、この章で後述します。
ターゲット要素および属性にマッピングする前に、その要素または属性をXSLTペインに明示的に追加する必要があります。この項では、次の項目について説明します。
ターゲット・スキーマがある場合は、要素および属性をターゲット・ツリーからXSLTペインに追加できます。
XSLT要素または属性のコンテキスト・メニューを使用して関連要素/属性を追加するか、または目的の要素/属性をターゲット・ツリーからXSLTツリーにドラッグ・アンド・ドロップします。
要素がターゲット・スキーマと矛盾した位置にある場合、またはXSLTマップが不完全なため、その要素がその場所で有効かどうかをエディタで判別できていない場合、要素のアイコンの上に疑問符が表示されます。次の図は、アイテム要素が疑問符付きで表示されているXSLTツリーを示しています。
XSLTペインで、子要素または属性を含めようとする要素を右クリックします。コンテキスト・メニューが表示されます。
注意:
選択したノードがXSLTに存在する場合は、このアクションはマップ・ビューからも実行できます。
マップ・ビューでは、「XSLT内のノードの作成」を選択することで、空のXSLTノードを追加することもできます。詳細は、「出力ドキュメントでの空ノードの作成方法」を参照してください。
「スキーマからの子の追加」を選択します。サブメニューが表示され、ターゲット・スキーマと一貫性のある選択肢が示されます。図40-28は、「スキーマからの子の追加」サブメニューを示しています。
追加する要素名または属性名を選択します。すべての子要素または属性を追加するには、「すべての要素」または「すべての属性」を選択します。必要な子要素または属性をすべて追加するには、「すべての必須」を選択します。
要素を既存の要素の子として挿入する手順は次のとおりです。
ターゲット要素または選択範囲の要素を、ターゲット・ペインからXSLTツリーの目的の要素の左側にドラッグします。緑色のハイライト表示が、その要素が子として挿入されることを示します。ドロップすると、その子が子のリストに追加されます。
緑色のハイライト表示が特定の位置に表示されない場合は、その要素をその位置に挿入するのは無効であることを示します。
要素を既存の要素の後に兄弟として挿入する手順は次のとおりです。
ターゲット要素または選択範囲の要素を、ターゲット・ペインからXSLTツリーの既存の要素の下部にドラッグします。緑色のハイライト表示が、その要素が兄弟として挿入されることを示します。ドロップすると、その兄弟が既存の要素の後に追加されます。
要素を既存の要素の前に兄弟として挿入する手順は次のとおりです。
ターゲット要素または選択範囲の要素を、ターゲット・ペインからXSLTツリーの既存の要素の上部にドラッグします。緑色のハイライト表示が、その要素が兄弟として挿入されることを示します。ドロップすると、その兄弟が既存の要素の前に追加されます。
要素を既存の要素の親として挿入する手順は次のとおりです。
ターゲット要素または選択範囲の要素を、ターゲット・ペインからXSLTツリーの既存の要素の右側にドラッグします。緑色のハイライト表示が、その要素が親として挿入されることを示します。ドロップすると、その要素が既存の要素の親として挿入されます。
この項は、XSLTビューとマップ・ビューの両方に適用されます。
XSLTペインで要素を右クリックします。要素のコンテキスト・メニューが表示されます。
既存の要素に関連付けられる新規リテラル要素の相対位置を選択します。リテラル要素は、既存の要素の子、兄弟または親として作成できます。図40-29は、使用可能なオプション(「子の追加」、「親の挿入」、「兄弟を前に挿入」、「兄弟を後に挿入」)を示しています。
サブメニューから「リテラル要素」を選択します。「要素の定義」ダイアログが表示されます。
「ローカル名」に、リテラル要素の名前を入力します。オプションで、要素のネームスペースを指定できます。
「OK」をクリックして、「要素の定義」ダイアログを閉じます。
前述の項(「ターゲット・スキーマからの要素および属性の追加方法」および「ターゲット・スキーマがない場合のリテラル要素および属性の追加方法」)で説明した方法を使用してノードをXSLTペインに追加する場合、これらのノードをソース・ノードにマッピングしないかぎり、空のノードとして作成されます。また、複合ノードをXSLTペインに追加する場合は、複合ノードの下の必要なすべてのノードが自動的に作成されます。
「XSLマップ: XSLエディタ・プリファレンス」ページでXSLマップの初期化オプションを設定して、マップの作成時に空のノードを生成することもできます。詳細は、「XSLエディタのプリファレンスの設定方法」を参照してください。
ソースの属性の値またはリーフ要素をXSLTペインの属性またはリーフ要素にコピーするには、ソース・ノードからXSLTノードに線をドラッグします。ドラッグ・アンド・ドロップすると、緑色にハイライト表示された線が表示されます。ドロップし終わると、ソース・ノードとターゲット・ノードをつなぐ線が描画されます。
図40-30は、PurchaseOrder/ID
ソース要素がInvoice/ID XSLT
要素にマッピングされているXSLTビューを示しています。ソースとXSLTノードが線でつながれます。
前述の項の説明に従ってソース要素をXSLT要素にマッピングすると、暗黙的なxsl:valueof文がXSLTに作成されます。
XSLTビューでは、1つのXSLT要素に複数のxsl:valueof
要素を明示的に作成できます。XSLT要素の結果の値は、個々のxsl:valueof
の値を連結したものです。
XSLT要素のxsl:valueof要素を作成する手順は、次のとおりです。
xsl:value-of
要素がマッピングされていないリテラル要素に追加された場合、マッピングされるまでxsl:value-of
文がリテラル要素の下に表示されます。xsl:value-of
要素をマッピングした後、エディタによってリテラル要素の下のxsl:value-of
文が非表示にされ、マッピングを示す線のみが表示されます。
複数のxsl:value-of
文をそのリテラル要素に追加した場合は、すべてのxsl:value-of
文がリテラル要素の下に明示的に表示され、マッピングの線が各xsl:value-of
要素に対して個別に表示されます。
この手順はXSLTビューにのみ適用されます。XSLTは、「コンポーネント」ウィンドウまたはコンテキスト・メニューを使用して追加できます。
XSLTペインで要素を右クリックします。要素のコンテキスト・メニューが表示されます。
既存の要素に関連付けられる新規要素の相対位置を選択します。リテラル要素は、既存の要素の子、兄弟または親として作成できます。使用可能なオプションは、「子の追加」、「親の挿入」、「兄弟を前に挿入」および「兄弟を後に挿入」です。
サブメニューから「XSL」を選択します。その位置で有効なXSLT要素のリストが表示されます。図40-31は、XSLの選択例を示しています。
目的のXSLT要素を選択します。
選択した要素によっては、ダイアログで属性値の入力を求められる場合があります。その場合は、属性値を入力して「OK」をクリックします。
XSLT要素がツリーに追加されます。
追加された要素の属性は、XSLTツリーに明示的に表示されません。マウス・カーソルを要素の上に置き、ツールチップ・テキストに属性を表示します。または、XSLT要素を選択して、「プロパティ」ウィンドウで要素のプロパティを表示して編集します。
「コンポーネント」ウィンドウが表示されていることを確認します。デフォルト位置はOracle JDeveloperの右上隅です。
「コンポーネント」ウィンドウが表示されていない場合は、「ウィンドウ」メニューから「コンポーネント」を選択します。
「XSLT要素」ページを選択します。
「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」をクリックします。
XSLT要素がツリーに追加されます。
追加された要素の属性は、XSLTツリーに明示的に表示されません。マウス・カーソルを要素の上に置き、ツールチップ・テキストに属性を表示します。または、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
属性があるかどうかをテストします。
ターゲット・スキーマで繰返しノードとして定義されているXSLTペインにリテラル要素を複製するには、「要素の複製方法」の手順を使用します。この手順はマップ・ビューでの手順と同じです。
ターゲット・スキーマが定義されていない場合は、ルート・ノードを除くすべてのノードをXSLTビューで複製できます。
ノードは複製する必要があるが、ターゲット・スキーマで繰返しノードとして定義されていない場合は、次のように、リテラル要素を明示的に作成することで重複ノードを作成できます。
ターゲット・スキーマで繰返しノードとして定義されていないリテラル要素を複製する手順は、次のとおりです。
この機能はXSLTビューとマップ・ビューの両方で使用できます。マップ・ビューを使用する場合、処理はターゲット・ペインで実行されます。
XSLTに存在するターゲット・ノードを削除するには、次のいずれかを実行します。
XSLTペインでノードを右クリックします。表示されたコンテキスト・メニューから「削除」を選択します。
XSLTペインでノードをクリックして選択します。[Delete]キーを押します。
そのノードに対するマッピングとともにノードがXSLTペインから削除されます。
XSLTペインで、ある位置からドラッグして別の位置へドロップすることで要素を移動できます。要素を移動して、別の要素の兄弟、親または子にすることもできます。マップ・ビューでは要素を移動できません。
図40-32では、XSLTペインで正しくない位置にあるAccountNumber
要素を示しています。ターゲット・スキーマで一貫性のあるようにするには、AccountNumber
要素をBilledToAccount
要素の下に移動する必要があります。
XSLTペインで、AccountNumber
要素をBilledToAccount
要素の左側に緑色のハイライト表示が表示されるまでドラッグします(図40-33を参照)。緑色のハイライト表示は、AccountNumber
要素がBilledToAccount
の子としてドロップされることを示しています。
緑色のハイライトが表示されている間に要素をドロップします。AccountNumber
ノードの位置がBilledToAccount
ノードの下に変わります(図40-34を参照)。
「ノードのリンクによる値のコピーの実行方法」および「ノードのリンクによる値のコピーの実行方法」では、ドラッグ・アンド・ドロップ操作を使用して、ソースの要素または属性とターゲットの要素または属性との間のマッピングを作成する方法について説明しました。ドラッグ・アンド・ドロップでは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ビューの両方で使用できます。
ソースとターゲットのノード間にドラッグ・アンド・ドロップ・アクションで作成されたマッピングのXPath式を変更できます。
ソースからターゲットへのマッピングを表す線をダブルクリックします。「XPathの編集」ダイアログが表示されます。
「XPathの編集」を必要に応じて編集します。
たとえば、「説明」フィールドにソースで最初に発生するコメントを含める場合は、最初のコメントのインデックスを持つ式に条件を追加します。
XPath式の編集に関するその他の情報が必要な場合は、「ヘルプ」をクリックします。
「XPathの編集」ダイアログで「OK」をクリックします。
「プロパティ」ウィンドウが表示されていない場合は、Oracle JDeveloperのメニュー・バーから「ウィンドウ」→「プロパティ」の順に選択します。
「プロパティ」ウィンドウのデフォルトの場所は、XSLTマップ・エディタの下です。
ソースからターゲットへのマッピングを表す線をクリックして選択します。「プロパティ」ウィンドウには、選択したマップ線に対応するXPath式が表示されます。
「XPathの編集」を必要に応じて編集します。
たとえば、「説明」フィールドにソースで最初に発生するコメントを含める場合は、最初のコメントのインデックスを持つ式に条件を追加します。
XPath式の編集に関するその他の情報が必要な場合は、「プロパティ」ウィンドウで「ヘルプ」アイコンをクリックします。
変更内容でXSLTを更新するには、「プロパティ」ウィンドウの左上隅にある「変更の適用」アイコンをクリックします。または、XSLTマップ・エディタの任意の場所をクリックします。
既存のソースからターゲットへのマッピングの上に関数をドラッグ・アンド・ドロップできます。マップ上に関数をドロップすると、ドロップされた関数の最初のパラメータを移入するために既存のロケーション・パス式が使用されます。
次の手順では、前述の項(「既存のソースとターゲットのマッピングの変更方法」)で編集した式を変更します。concat関数を使用して、ソースの最初のコメントをソースの説明を連結します。
XPath関数を既存のXPath式に追加する手順は、次のとおりです。
XPath関数はキャンバス・ペインに表示され、いくつかの方法で編集できます。前述の項(「XPath関数の既存のXPath式への追加方法」)の例から引き続き、concat関数の2番目のパラメータの値をいくつかの方法で設定します。
ソース・ツリーのDescription要素からキャンバス・ペインの「concat」関数アイコンの左側まで線をドラッグします。関数のそれぞれの可能なパラメータに対するコネクタが含まれているポップアップ・パネルが表示されます。
目的のコネクタに線をドロップします。前述の図では、2番目に必要なパラメータを示す2番目のコネクタ上に線をドロップしています。3番目のオプションのパラメータ上に線をドロップして、2番目のパラメータ値を後で入力することも選択できます。
パラメータが関数に追加されます。必要なすべてのパラメータを追加すると、警告アイコンが表示されなくなります。
関数パラメータを削除するには、関数パラメータへの入力を示す線を選択して、[Delete]キーを押します。または、線を右クリックして、コンテキスト・メニューから「削除」を選択します。
「XPathパスの編集」ダイアログまたは「プロパティ」ウィンドウの「XPathパスの編集」パネルを使用して、XPath関数をテキストのXPath式として編集できます。
キャンバス・ペインの関数のアイコンの境界領域で式フォルダをダブルクリックします。「XPathの編集」ダイアログが表示されます。
かわりに中央のアイコンをダブルクリックすると、「関数の編集」ダイアログが表示されます。
「XPath式」を必要に応じて編集します。DescriptionノードにXPathのロケーション・パスを追加するには、たとえば、最初のパラメータの後ろにカーソルを置きます。[Ctrl]を押しながら[Space]を押して、「/ns0:PurchaseOrder」をダブルクリックして選択します。
/ns0:PurchaseOrder
が式の挿入され、/ns0:PurchaseOrder
ノードの可能な子がドロップダウン・メニューに移入されます。
「Description」エントリをダブルクリックして選択します。マウス・カーソルをエントリ上に置き、[Enter]キーを押して選択することもできます。
「XPathの編集」ダイアログで「OK」をクリックします。
「プロパティ」ウィンドウが表示されていない場合は、Oracle JDeveloperのメニュー・バーから「ウィンドウ」→「プロパティ」の順に選択します。
「プロパティ」ウィンドウのデフォルトの場所は、XSLTマップ・エディタの下です。
キャンバス・ペインの関数のアイコンの境界領域で式フォルダをクリックします。「プロパティ」ウィンドウの右側のペインに、関数の完全な「XPath式」が表示されます。
変更内容でXSLTを更新するには、「プロパティ」ウィンドウの左上隅にある「変更の適用」アイコンをクリックします。または、XSLTマップ・エディタの任意の場所をクリックします。
各パラメータのXSLTを別の「XPath式」フィールドで編集できるように、XPathマップ・エディタでは関数を対応するパラメータに解析できます。
キャンバス・ペインで関数のアイコンをダブルクリックします。「関数の編集」ダイアログが表示されます。
中央の関数のアイコンをダブルクリックしてください。関数のアイコンの境界領域をダブルクリックすると、「XPathの編集」ダイアログが表示されます。
必要に応じて、関数パラメータをそれぞれ編集します。「ヘルプ」をクリックして、パラメータの編集に関する情報を確認することもできます。
必要に応じて、新しいパラメータを追加するには、緑色のプラス記号(+)で表される「追加」アイコンをクリックします。
パラメータの編集が終了したら「OK」をクリックします。
「プロパティ」ウィンドウが表示されていない場合は、Oracle JDeveloperのメニュー・バーから「ウィンドウ」→「プロパティ」の順に選択します。
「プロパティ」ウィンドウのデフォルトの場所は、XSLTマップ・エディタの下です。
キャンバス・ペインで関数のアイコンの中央領域をクリックします。「プロパティ」ウィンドウの右側のペインに、関数パラメータが表示されます。
必要に応じて、関数パラメータを編集します。「ヘルプ」アイコンをクリックして、パラメータの編集に関する情報を確認することもできます。
必要に応じて、新しいパラメータを追加するには、緑色のプラス記号(+)で表される「追加」アイコンをクリックします。
変更内容でXSLTを更新するには、「プロパティ」ウィンドウの左上隅にある「変更の適用」アイコンをクリックします。または、XSLTマップ・エディタの任意の場所をクリックします。
XSLTキャンバス・ペインで新しい関数を作成するには、いくつかの方法があります。これらについては、後続の各項で説明します。
キャンバス・ペインの中央の空白領域を右クリックします。表示されるコンテキスト・メニューで「XPathの作成」を選択します。
「XPathの作成」のサブメニューから、必要な関数を選択します。たとえば、「日付関数」カテゴリから「current-date」関数を選択します。
関数をターゲット・ノードに接続するように求める「情報」ダイアログが表示される場合があります。「OK」をクリックします。
キャンバス・ペインに関数のアイコンが表示されます。
関数からターゲット・ノードに線をドラッグすることで、関数をターゲット・ノードにマッピングします。
関数でパラメータが必要な場合は、「キャンバス・ペインでの既存の関数XPath式の変更方法」で説明する方法の1つを使用してパラメータを編集します。
「コンポーネント」ウィンドウが表示されていない場合は、Oracle JDeveloperのメニュー・バーから「ウィンドウ」→「コンポーネント」の順に選択します。
「コンポーネント」ウィンドウで、「一般XPath」または「拡張XPath」を選択します。関数のカテゴリ(たとえば「文字列関数」)を選択します。
「コンポーネント」ウィンドウからXSLTマップ・エディタのキャンバス・ペインの中央に目的の関数をドラッグします。
関数からターゲット・ノードに線をドラッグすることで、関数をターゲット・ノードにマッピングします。
関数でパラメータが必要な場合は、「キャンバス・ペインでの既存の関数XPath式の変更方法」で説明する方法の1つを使用してパラメータを編集します。
XPath関数を割り当てる必要のあるターゲット・ツリー・ノード(マップ・ビュー)またはXSLTツリー・ノード(XSLTビュー)を右クリックします。コンテキスト・メニューが表示されます。
「XPathの作成」を選択します。表示されるサブメニューから、必要なXPath関数を選択します。
関数がキャンバス・ペインで作成され、作成されたターゲット・ノードまたはXSLTノードにリンクされます。
関数でパラメータが必要な場合は、「キャンバス・ペインでの既存の関数XPath式の変更方法」で説明する方法の1つを使用してパラメータを編集します。
「コンポーネント」ウィンドウが表示されていない場合は、Oracle JDeveloperのメニュー・バーから「ウィンドウ」→「コンポーネント」の順に選択します。
「コンポーネント」ウィンドウで、「一般XPath」または「拡張XPath」を選択します。関数のカテゴリ(たとえば「文字列関数」)を選択します。
目的の関数を「コンポーネント」ウィンドウから、関数を割り当られるターゲット・ツリー・ノード(マップ・ビュー)またはXSLTツリー・ノード(XSLTビュー)にドラッグします。ターゲットまたはXSLTのツリー・ノードの左側に緑色のハイライト表示が表示されます。
緑色のハイライト表示が表示されている間に関数をドロップします。
関数がキャンバス・ペインで作成され、関数がドロップされたターゲット・ノードまたはXSLTノードにリンクされます。
関数でパラメータが必要な場合は、「キャンバス・ペインでの既存の関数XPath式の変更方法」で説明する方法の1つを使用してパラメータを編集します。
関数を別の関数と連鎖させる手順は次のとおりです。
関数の連鎖(ある関数の出力を別の関数の入力にマップすること)によって、複雑な式を作成できます。たとえば、concat関数の出力から先頭と末尾の空白をすべて削除するには、次の手順を実行します。
連鎖は、関数を接続リンクにドラッグ・アンド・ドロップして実行することもできます。
XPath式を削除する手順は次のとおりです。
非リーフ・ソース要素を非リーフ・ターゲット要素にマッピングする際は、自動マップ機能により、子ソース要素がそれに対応するターゲット要素に自動的に一致します。自動マップでは要素の名前、タイプおよびパスを確認して、正しいマッピングを提示します。また、自動マップでは、プリファレンスに応じてオプションのノードのxsl:if
文を挿入できます。
自動マップ機能は、ターゲット・スキーマが使用される場合にのみ使用できます。マップ・ビューとXSLTビューの両方で、自動マップを使用できます。
「プリファレンス」ダイアログを使用して、自動マップ機能の動作を指定できます。「ツール」メニューで「プリファレンス」を選択します。左側のナビゲーション・ツリーで、「XSLマップ」の下の「自動マップ」を選択します。図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の数字は、要素タイプが完全に一致している必要があることを示します。
一致のしきい値(%): 自動マップで、各マップ(祖先、言語、タイプ)の一致率を計算して、その中で最も高い割合を選択します。最も高い一致率がしきい値の割合を超える場合に、一致が作成されます。
ディクショナリ: 既存のディクショナリを自動マップに追加できます。ディクショナリは、既存のマップから定義し、後続のマップで使用できます。
マップでターゲット・スキーマを使用している場合は、マップの完了ステータスをいつでも確認できます。これは、マップ・ビューとXSLTビューの両方で実行できます。完了ステータスを確認すると、次のものにフラグが付きます。
マップされていないすべてのターゲット要素および属性。フラグは、ターゲット要素がターゲット・スキーマで必要な要素であるかどうかを示します。
不完全なXPath式でマッピングされたターゲット要素。たとえば、ターゲット・ノードにマッピングされたXPath関数のパラメータが失われている場合があります。
失われたすべてのターゲット要素および属性。フラグは、失われたターゲット要素がターゲット・スキーマで必要な要素であるかどうかを示します。
マップの完了ステータスを確認するには、キャンバス・ペイン(中央)を右クリックし、コンテキスト・メニューで「完了ステータス」を選択します。「完了ステータス」ダイアログが表示され、不完全なターゲット・ノードがすべて示されます。完了ダイアログ・ステータスの行をクリックして、XSLT/ターゲット・ツリーで対応するノード位置を選択します。図40-37は、失われたノードがハイライト表示されている「完了ステータス」ダイアログを示しています。
XSLTマップ・エディタには、マップをテストするためのツールが用意されています。テスト・ツールを起動するには、キャンバス・ペインを右クリックし、コンテキスト・メニューから「テスト」を選択します。このテスト・ツールは、マップ・ビューとXSLTビューの両方で使用できます。
図40-38は、「XSLマップのテスト」ダイアログを起動する様子を示しています。
図40-39に示す「XSLマップのテスト」ダイアログでは、XSLTマップ・エディタで設計したトランスフォーメーション・マッピングのロジックをテストできます。指定したテスト設定は保存されるため、次回のテスト時に再度入力する必要はありません。Oracle JDeveloperを閉じて再度開いた場合は、テスト設定をもう一度入力する必要があります。
トランスフォーメーション・マッピングのロジックをテストする手順は、次のとおりです。
「ソースXMLファイル」フィールドで、テスト用にサンプルのソースXMLファイルを生成するか、「参照」をクリックして別のソースXMLファイルを指定します。
「OK」をクリックすると、ソースXMLファイルが検証されます。検証に合格するとトランスフォーメーションが実行され、ターゲットXMLファイルが作成されます。
検証に失敗した場合、トランスフォーメーションは実行されず、画面にメッセージが表示されます。
マップ・ソースXSDスキーマに基づいてサンプルのXMLファイルを作成するには、「ソースXMLファイルの生成」チェック・ボックスを選択します。
「ソースXMLファイルの表示」チェック・ボックスを選択し、テスト用のソースXMLファイルを表示します。ソースXMLファイルがOracle JDeveloperのXMLエディタに表示されます。
マップに定義済のパラメータがある場合は、「スキーマのあるパラメータ」または「スキーマのないパラメータ」表が表示されます。
「スキーマのあるパラメータ」表が表示された場合は、「参照」ボタンを使用してそのパラメータの入力XMLファイルを指定できます。「ファイルの生成」チェック・ボックスを選択して、ファイルを生成します。
「スキーマのないパラメータ」表が表示された場合は、「値の指定」チェック・ボックスを選択し、「タイプ」列および「値」列を適切に編集して値を指定できます。
「ターゲットXMLファイル」フィールドにファイル名を入力するか、トランスフォーメーションからの結果XML文書が格納されるファイルの名前を参照します。
テスト用のターゲットXMLファイルを表示するには、「ターゲットXMLファイルの表示」チェック・ボックスを選択します。ターゲットXMLファイルがOracle JDeveloperのXMLエディタに表示されます。
ソースとターゲット両方のXMLを表示する場合は、XMLエディタのレイアウトをカスタマイズできます。右上隅にある「自動レイアウトの有効化」を選択してパターンの1つをクリックします。
「OK」をクリックします。
図40-40に示すように、テスト結果が表示されます。
この例では、ソースXMLとターゲットXMLが並んで表示され、その下にXSLマップが表示されています(デフォルト設定)。「スキーマのあるパラメータ」表に対応する追加のソースXMLファイルが、メイン・ソース・ファイルと同じ場所にタブとして表示されます。エディタを右クリックして「XMLの検証」を選択すると、ソースまたはターゲットのXMLを、マップのソースまたはターゲットのXSDスキーマと照合して検証できます。
DVM参照関数が含まれているXSLTマップをテストできます。ローカル・ファイルまたはMDSのファイルを参照するDVM参照関数をマップで使用する場合で、これらのファイルにJDeveloper環境からアクセスできる場合は、追加の手順を実行する必要はありません。
JDeveloper環境からアクセスできないファイルを参照するDVM参照関数をマップで使用している場合は、テスト用にローカルのDVMファイルを作成でき、XSLTのDVM参照を変更する必要はありません。次の手順に従います。
ローカルのdvm参照ファイル(UnitTestXrefFunctionReturn.dvmという名前)を使用して、テストをエミュレートできます。このファイルは、XSLTテストを最初に実行したときに自動的に生成されます。
UnitTestXrefFunctionReturn.dvmファイルには、すべてのXREF関数に対するデフォルトのレスポンスが含まれています。これによって、関数が正しく実行されたときに予想されるレスポンスをシミュレートします。デフォルトのレスポンスは変更できます。さらに、パラメータ値が異なる場合に、同じ関数の別の呼出しに対して異なる戻り値を作成することもできます。
次の図はDVMファイルの最初の状態を表しています。
「FunctionName」列には関数の名前を指定します。最初は、各関数にデフォルトの動作が定義された1つのエントリのみがあります。すべてのXREF関数は、このデフォルト情報を使用して実行されます。必要に応じて、指定された関数にさらにエントリを作成したり、入力パラメータに基づいて関数に別の戻り値を入力できます。
「returnValue」列には関数の戻り値を指定します。これには、関数から返される値を定義します。
その他の列には、指定されたパラメータの値に基づいて、1つの関数コールを別の関数コールと区別するために使用できる修飾子を定義します。これらの各列には、指定された関数コールで使用可能なパラメータを定義します。すべてのパラメータがすべての関数で使用できるわけではありません。パラメータが使用できない場合は、元の表にNA (使用不可)とマークされます。
「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_001
のreturnValue
を持つようにDVMで行を変更した場合、関数によって次の3つの列ノードが返されます。
<column name="SAP_ID">SAP_001</column> <column name="SBL_ID">SBL_001</column> <column name="ORCL_ID">ORCL_001</column>
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
の値)が返されます。
次の情報を備えたHTMLレポートを生成できます。
XSLマップのファイル名、ソース・スキーマとターゲット・スキーマのファイル名、そのルート要素名、およびそのルート要素のネームスペース
ターゲット・ドキュメントのマッピング
マップされていないターゲット・フィールド(必須フィールドを含む)
サンプル・トランスフォーメーション・マップの実行
次の手順に従って、レポートを生成します。
サンプルXMLの生成は、次のパラメータを指定してカスタマイズできます。Oracle JDeveloperの「ツール」メイン・メニューで、「プリファレンス」→「XSLマップ」の順に選択し、「プリファレンス」ダイアログを表示します。「サンプルXMLの生成」で次の設定を変更できます。
繰返し要素の数
この数は、要素の属性maxOccurs
が1
より大きい値に設定されている場合に、要素の繰返し作成数を指定します。指定した値が特定の要素に対するmaxOccurs
属性の値より大きい場合、その特定の要素に対する繰返し作成数は、指定した数ではなく、このmaxOccurs
の値となります。
オプション要素の生成
選択されている場合は、オプション要素(その属性minOccurs
が値0
に設定されている)が必須要素(その属性minOccurs
が0
より大きい値に設定されている)と同様に生成されます。
最大の深さ
サンプルXMLの生成において、オプション要素による再帰の発生を回避するために、オプション要素の生成限度であるXML文書階層ツリーの最大の深さを指定します。
JDeveloper以外のエディタで開発されたXSLTマップがある場合、そのマップをJDeveloperにインポートできます。
外部マップをインポートする手順は次のとおりです。
変数およびパラメータをXSLTマップに追加できます。これらは、マップ・ビューと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では不要です。
パラメータは、グローバル・パラメータおよび名前付きテンプレート・パラメータの両方として、XSLTマップ・エディタに追加できます。
グローバル・パラメータは、XSLTマップの作成時に追加できます。詳細は、「XSLTマップの作成方法」を参照してください。グローバル・パラメータを既存のマップに追加することもできます。
グローバル・パラメータを既存のマップに追加する手順は次のとおりです。
ターゲット・ペイン(マップ・ビューの場合)またはXSLTペイン(XSLTビューの場合)の適切な場所にパラメータ・ノードが表示されます。これにより、XPath式をパラメータにマッピングして、パラメータのデフォルト値を設定できます。
このパラメータはソース・ツリーにも表示されます。これにより、パラメータをXPath式またはXSLTツリー内のノードにマッピングできます。
注意:
他のXSLT要素のように、パラメータを追加することもできます。コンテキスト・メニューまたは「コンポーネント」ウィンドウを使用したXSLT要素の追加の詳細は、「XSLT文の追加方法」を参照してください。
ソース・ツリーとターゲット・ツリーの要素とタイプは置換できます。
要素置換は、次の場合に使用します。
要素が、基礎となるスキーマ内の置換グループの先頭として定義されている場合。要素は抽象でも抽象でなくてもかまいません。置換グループの任意の要素を元の要素と置換できます。
要素がany
要素として定義されている場合。スキーマに定義されているすべてのグローバル要素を置換できます。
タイプ置換は、次の場合に使用します。
基礎となるスキーマでグローバル・タイプを使用でき、そのタイプがソース・ツリーまたはターゲット・ツリーの要素のタイプから導出されている場合。この場合は、グローバル・タイプを要素の元のタイプと置換できます。抽象タイプから導出された任意のタイプをその抽象タイプと置換できます。
ソース・ツリーまたはターゲット・ツリーの要素がanyType
タイプとして定義されている場合。この場合は、スキーマに定義されている任意のグローバル・タイプを置換できます。
タイプ置換は、XMLのxsi:type
属性の使用によってサポートされます。
ソース・ツリーとターゲット・ツリーの要素またはタイプを置換する手順は、次のとおりです。
名前付きテンプレートをXSLTマップに追加できます。これらのテンプレートはXSLTマップ・エディタ内で編集できます。名前付きテンプレートは、xsl:call-template
命令を使用して起動できます。
名前付きテンプレートは、XSLTビューでのみ使用できます。名前付きテンプレートをXSLTマップに追加すると、そのマップはXSLTビューでのみ開くことができます。
名前付きテンプレートは作成されるとまず、編集できるように、XSLTマップ・エディタで開かれます。XSLTツールバーのドロップダウン・リストを使用して、名前付きテンプレートの編集とXSLTマップの編集を切り替えることができます。
図40-47は、XSLTマップ・エディタで編集されている名前付きテンプレートを示しています。左上隅にはドロップダウン・リストがあり、これを使用してXSLTマップと名前付きテンプレートのいずれかを選択できます。
ソース・ツリー、グローバル・パラメータおよび名前付きパラメータがある場合は、左側のソース・ペインに表示されます。右上のXSLTペインには、名前付きテンプレートに関連付けられたXSLTが表示されます。ターゲット・スキーマが使用される場合は、エディタの右下隅にターゲット・ツリーが表示されます。
テンプレート・ルールは、一致属性を含むxsl:template
文です。テンプレート・ルールはXSLTマップ・エディタでサポートされます。テンプレート・ルールはXSLTビューでのみ使用できます。テンプレート・ルールはマップ・ビューではサポートされません。
XSLTマップ・エディタを使用すると、テンプレート・ルールを様々な方法で追加できます。テンプレート・ルールを手動で挿入したり、既存のマッピングをリファクタしてテンプレート・ルールを作成できます。
テンプレート・ルールを手動で追加する場合は、テンプレートをXSLTの適切な場所で起動するためにapply-templates
文も挿入する必要があります。テンプレート・ルールを作成するために既存のマップをリファクタする場合は、apply-templates
文が自動的に挿入されます。
例として、次に示すように、既存のマップのテンプレート・ルールを作成します。
この例では、ターゲットのShippedTo要素およびBilledTo要素にAddressを作成するために、ソースのShipTo要素およびBillTo要素のAddress情報を処理する1つのテンプレートを作成します。次の手順に処理を示します。
ソース・ペインのShipToノードまたはBillToノードの下にあるAddressノードを右クリックして、表示されるコンテキスト・メニューから「新規テンプレート・ルール」を選択します。
「新規テンプレート・ルール」ダイアログが表示されます。「一致ノード」には、ソース・ペインで選択したAddressノードへのパスがあらかじめ移入されています。この一致文字列は、ShipToの下にあるAddress要素に固有のものですが、ソース・ドキュメントのすべての「Address」フィールドを処理するテンプレートを作成する必要があります。
名前Addressのみが含まれるように「一致ノード」の文字列を変更します。これによって、ドキュメントで表示される場所にかかわらず、ソース・ドキュメントのすべてのAddressノードが一致します。
「テンプレートに生成するノードの選択」オプションを選択します。ターゲット・スキーマ・ツリーが表示されます。
テンプレート・ルールが起動されたら、ターゲットにAddress要素をその子とともに作成します。
ShippedTo要素またはBilledTo要素(どちらの要素も同じ構造です)の下にあるAddressノードを選択します。
Addressノードの子を選択するには、[Shift]キーを押したまま、Address要素の最後の子であるZip要素をクリックします。これによって、Address要素およびそのすべての子が選択されます。
「OK」をクリックして、テンプレート・ルールを作成します。
ルールがマップでまだ起動されていないため、テンプレートには警告アイコンが表示され、テンプレートを作成したノードには疑問符(?)アイコンが表示されます。
次に、ターゲットでShippedTo要素およびBilledTo要素にAddress要素を作成するために、ソースのShipTo要素およびBillTo要素の両方のAddress要素に対してテンプレートを起動する必要があります。XSLTで、これらのAddress要素を作成する場所にapply-templates
文を作成する必要があります。次の手順に処理を示します。
XSLTペインでInvoiceノードを右クリックして、表示されるコンテキスト・メニューから「スキーマからの子の追加」→「BilledTo」の順に選択します。BilledToノードが、必要な子ノードとともに挿入されます。
XSLTペインでInvoiceノードを右クリックして、表示されるコンテキスト・メニューから「スキーマからの子の追加」→「ShippedTo」の順に選択します。ShippedToノードが、必要な子ノードとともに挿入されます。
ShippedTo/Addressノードを右クリックして、「削除」を選択します。BilledTo/Addressノードに対しても同じ操作を実行します。作成されたテンプレートを使用してAddressノードを作成します。
ShippedToノードを右クリックして、表示されるコンテキスト・メニューから「子の追加」→「XSL」→「apply-templates」の順に選択します。xsl:apply-templates文が追加されます。
BilledToノードを右クリックして、表示されるコンテキスト・メニューから「子の追加」→「XSL」→「apply-templates」の順に選択します。xsl:apply-templates文が追加されます。
ソース・ペインのShipTo/AddressノードからXSLTペインのShippedTo/apply-templatesノードに線をドラッグします。これによって、apply-templates
文の属性の選択が設定されるため、xsl:apply-templates
文ではShipTo/Addressノードのみが処理されます。
ソース・ペインのBillTo/AddressノードからXSLTペインのBilledTo/apply-templatesノードに線をドラッグします。これによって、apply-templates
文の属性の選択が設定されるため、xsl:apply-templates
文ではBillTo/Addressノードのみが処理されます。
テンプレートの起動を定義したため、この時点でテンプレート・ルール上の警告アイコンが表示されなくなります。テンプレート・ルールをクリックすると、次の図に示すとおり、このテンプレートで処理される2つのAddressノードがハイライト表示されます。
次に、テンプレート・ルールの下のノードをマッピングします。
BillTo/Addressノード、またはShipTo/Addressノードの下にある要素からAddressテンプレート・ルールの下の適切な要素に線をドラッグ・アンド・ドロップします。
ソースのどちらかのAddress (BillToまたはShipTo)からドラッグすると、両方のソースのAddressに線が引かれます。これは、BillTo/AddressとShipTo/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>
既存のテンプレートからコードをリファクタして、新しいテンプレート・ルールを作成できます。これは、前の例でAddressテンプレート・ルールを作成した場合のように、作成した複数のテンプレート・ルールが再使用できる場合に有用です。
「テンプレートに作成」オプションを使用すると、XSLT命令のセクションを複数の場所から起動可能な別のテンプレートにリファクタできます。
次の例では、既存のマッピングをリファクタしてテンプレート・ルールを作成します。
次のマップでは、ソースの各Address要素を処理するXSLTが、各Addressノードに対して繰返されます。管理を容易にするために、冗長コードを再利用可能なテンプレートに統合することもできます。この方法では、後でコードが更新される場合に、複数のコピーを更新する必要がありません。
前述のマップでは、Street1およびStreet2からStreetを作成するXPath concat
式を変更する必要がある場合、変更する必要のあるコピーは2つです。ただし、concat
関数が、両方のAddress要素を作成するために再使用される1つのテンプレートに存在する場合は、今後変更が必要になるconcat
文は1つのみです。
次の手順では、既存のマッピングをリファクタして、Address要素を処理する1つのテンプレートを作成します。
実行ビューには、XSLT文を実行する順序が表示されます。名前付きテンプレートやテンプレート・ルールを使用する複雑なXSLTを作成する際、XSLTテンプレートの実行順序の判断が難しくなることがあります。実行ビューでは、XSLTの実行ツリーを作成することにより、この問題への対応に役立ちます。
実行ツリーは、出力ノードの作成時に表示され、XSLTの実行中、様々な時点でどのテンプレートが起動されるかを正確に示します。
「実行ビュー」ダイアログを起動するには、キャンバス・ペイン(中央)を右クリックして、「実行ビュー」を選択します。または、XSLTツールバーで「XSLTマップの実行ビュー」ボタンをクリックします。
実行ビューはマップ・ビューとXSLTビューの両方で使用できます。ただしこれは、マップに複数のテンプレートが含まれ、そのテンプレートがいつ起動されるかをユーザーが理解している必要がある場合に特に役立ちます。
図40-49は、複数のテンプレートが含まれるXSLTマップの「実行ビュー」ダイアログを示しています。実行ビューでは、match='/'
が含まれるルート・テンプレートが最初に実行されます。次に、Invoice、Description
およびID
ノードが作成されます。さらに、apply-templates
文がShipToテンプレートを起動し、続けてapply-templates
文がBillToテンプレートを起動します。その後、その他のノードおよびテンプレートが作成されます。
「実行ビュー」ツリーで要素をクリックすると、対応する要素がXSLTツリーでハイライト表示されます。たとえば、図40-49に示すように、BillToテンプレートを起動するapply-templates
ノードを特定する場合は、「実行ビュー」でapply-templates
ノードを選択すると、対応するapply-templates
文がXSLTペインでハイライト表示されます。
実行ビューには、名前付きテンプレートへのコールも表示されます。「実行ビュー」ツリーで名前付きテンプレート・コール内のノードを選択すると、XSLTエディタ・ビューが更新され、選択したノードが名前付きテンプレートの実装で表示されます。
実行ビューは、XSLTスタイルシート全体のフローを理解するのに役立ちます。実行ビューを使用して、起動されないテンプレートに関連する問題や、不適切なテンプレートを起動しようとするapply-templates
文を特定できます。
インポートされた名前付きテンプレートまたはテンプレート・ルールを使用する際は、対応するコールが実行ビューに表示されるので、実行ビューを使用して、インポートの優先順位などの問題に対処できます。ただし、実行ビューでは外部XSLTファイルには移動できません。
「実行ビュー」ダイアログには検索機能があり、「実行ビュー」ツリーの特定のノードを検索できます。「ローカル名の検索」フィールド内をクリックして、検索する名前を入力します。
実行ツリーで特定のXSLT要素を表示または非表示にする選択ができます。「オプション」をクリックして、「実行ビュー・オプション」ダイアログを表示します。図40-50は、「実行ビュー・オプション」のデフォルトの選択内容を示しています。
大量のスキーマ・ドキュメントを使用している場合、自動マッピング中、テスト中およびレポート生成中に、メモリー不足エラーが発生する場合があります。XSLTマップ・エディタの使用中にメモリー不足エラーが発生した場合は、JVMのヒープ・サイズを増やして問題を解決する必要があります。
JVMのヒープ・サイズを増やす手順は、次のとおりです。
「プリファレンス」ダイアログを使用して、XSLTマップに関連するプリファレンス(展開の深さなど)や、XSLTマップ・エディタに関連するプリファレンス(初期化オプションなど)を設定します。
XSLTマップのプリファレンスを設定するには、「ツール」メニューから「プリファレンス」を選択します。「プリファレンス」ダイアログの左側のペインに表示されるナビゲーション・ツリーで「XSLマップ」をクリックします。図40-51は、表示される「XSLマップ」ダイアログを示しています。
ソースおよびターゲット・ツリーの展開の深さなど、様々なオプションを設定できます。各フィールドの詳細は、「ヘルプ」ボタンをクリックして参照してください。
XSLTマップのプリファレンスを設定するには、「ツール」メニューから「プリファレンス」を選択します。「プリファレンス」ダイアログの左側のペインに表示されるナビゲーション・ツリーで、「XSLマップ」の横にあるプラス記号(+)をクリックします。これで、XSLマップ・ノードが展開されます。「XSLエディタ」を選択します。図40-52は、「XSLエディタのプリファレンス」ダイアログを示しています。
初期化モードなど、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スキーマで特に役立ちます。このスキーマでは、記述名がスキーマの固定属性値として追加されます。