[SOA/BPM] 12c XSLT Editor – XSLT View Overview

原文はこちら。
https://blogs.oracle.com/integration/entry/12c_xslt_editor_xslt_view

XLST Viewは新しい12c XSLTエディタが提供する2つのグラフィカルビューの一つです。
12c XSLTエディタのグラフィカルビューに関する概要は、以下のリンクをご覧ください。
12c XSLT Editor Overview
https://blogs.oracle.com/integration/entry/12c_xslt_editor_overview
http://orablogs-jp.blogspot.jp/2016/04/12c-xslt-editor-overview.html
任意のXSLTファイルをグラフィカルに編集可能なXSLT Viewは、XSLT開発者でXSLTの知識があり、XSLTソースコードをテキストエディタで書いたことがある方向けです。
XSLT Viewはグラフィカルにソースを閲覧できるので、テキストエディタでXSLTソースを編集するよりも多くのメリットがあります。そのメリットの多くは上記のXSLT Editor Overviewのエントリに記載しています。これらのメリットを、サンプルを使って確認するのがよいと思いますので、このエントリでは、アイデンティティテンプレートを使って複雑なXSLTマップを作成することにします。

今回の例では、PurchaseOrder to PurchaseOrderのマップを作成します。


このマッピングの目的は、ソース・ツリーからターゲット・ツリーへコピーすること、そしてコピー中にShipTo CustomerNameをBillTo Addressにコピーして、ShipTo とBillTo 要素で同じCustomerNameを使うようにします。
同じことは、明示的に各ノードをマッピングすることでもできますが、identityテンプレートを使ってソースをコピーすることもできます。identityテンプレートは入力ドキュメントを出力ドキュメントコピーする際によく使われますが、コピー中に変更する際にも使われます。実行時にソースからの入力がソーススキーマで定義された要素の個数に比べて少ない場合、スキーマの各ノードに対して明示的にXSLTステートメントを作成する場合と比較して、identityテンプレートを使ったツリーのコピーのほうが圧倒的に高速です。

ツールバーの右上にある[XSLT]ボタンをクリックし、XSLTビューに遷移します。右上方に現在編集中の実際のXSLTステートメントが表示されています。下方にはターゲットスキーマが表示されています。

現時点で持っている唯一のXSLTはxsl:templateステートメントと、出力側のPurchaseOrderドキュメントのルートノードのためのリテラル要素であることがわかります。

xsl:templateを選択し、stylesheetノードだけ残して削除することもできます。

コンポーネント・ウインドウを開き、XSLTテンプレートやMiscellaneousテンプレートを選択し、Identityテンプレートをxsl:stylesheetノードの左側にドラッグ&ドロップすることができます。緑色の強調表示はテンプレートをstylesheetノードの子要素として挿入することができることを示しています(エディタの背後にはXSLTスキーマドキュメントがあり、このXSLTスキーマドキュメントのおかげで、利用者がXSLTスキーマ定義に従って、XSLTステートメントを適切な位置に配置することができます。エディタはXMLスキーマに従って、テンプレートをどこに配置できるかを知っているため、強調表示することができます)。

ドラッグ&ドロップの後、xsl:stylesheet ノードの下に追加した新しいテンプレートノードを展開します。


このタイミングでこのXSLTを実行すると、XSLTの3行がソースドキュメント全体を出力側にコピーします。XSLTでリテラルの出力ノードが存在しないことに注意してください。出力ノードはxsl:copyステートメントが作成していますが、これは再帰的に入力ドキュメントの各ノードを出力側にコピーする指示を再帰的に呼び出しています。

また、ソースとXSLTツリーに見られる紫色のバブルを使った強調表示に注意してください。ただ、現時点ではこのバブルが存在することに注意してください。内容は別のテンプレートをXSLTに追加した後に説明します。

では、別のテンプレートを作成し、ShipToデータを出力側のXMLのBillToセクションにコピーしましょう。エディタを使ってmatched templateを新規作成する方法はたくさんありますが、(別のエントリで書きたいので)ここではその中の一つの方法をご紹介します。
入力側のBillToノードを処理するテンプレートを作成したいので、ソースツリーのBillToノードを右クリックし、新規テンプレート・ルール(matched template)を選択します。この操作の結果ダイアログが現れます。このダイアログで、テンプレートのための一致文字列を定義し、作成したいターゲットスキーマから任意のノードを選択することができます。

ソースノードからテンプレート作成時に、選択されたソース・ノードに基づいて、一致する文字列を作成する時にエディタが推論します。それゆえ、私たちがやるべきことは、新規テンプレート内で作成されるようBillToノード(出力)を選択して、OKをクリックするだけでよいのです。


ここで、ツリーの紫色のバブルは、一致したテンプレートに対応するコンテキストノードを示しています。

簡単に言うと、コンテキストノードという言葉をご存じない場合、XSLTエディタはソースドキュメントのルートから着信XMLドキュメントの処理を開始します。デフォルトテンプレートを使ってソースツリーをルートから移動します。ソースツリーを通過すると、現在のノードに一致するXSLTソースでユーザーが作成したテンプレートを探します。1個以上のテンプレートが現在の処理中のノードに一致する場合、プロセッサはそのノードにとって最も一致するテンプレートを選択するロジックを有しています。その後、当該ノードのためのテンプレートを実行します。この結果、ノードは特定のテンプレートに対するコンテキストノードです。
XPath式を記述する場合、XPath式を実行する際のコンテキストノードを知ることは非常に重要です。それは相対XPath式はコンテキストノードを基準にして評価されるためです。軸もまたコンテキストノードに関連付けられています。

上記のXSLTには2個のテンプレートがあります。先ほど追加したBillToテンプレートをクリックすると、ソースのBillToノードが強調表示されることがわかります。これがそのテンプレートのコンテキストノードです。テンプレートで作成された相対PathのXPath式が、入力のBillToノード(コンテキストノード)に関連していることがわかります。
元のテンプレート(下)をクリックすると、BillToソースノードでは紫のバブルが現れないことに注意してください。これはつまり、プロセッサがBillToソースノードに最もマッチするのは2番目のテンプレートであって、1個目のテンプレートでは処理しない、ということを示しています。

XSLTはxsl:copyステートメントを使って(BillToノードを除いて)入力ツリー全体をコピーします。BillToノードを処理すると、プロセッサは2個目のテンプレートを呼び出し、テンプレート内に配置するように選択するものをすべて書き出します。
BillToの情報を新しいテンプレートにコピーしたいのですが、ShipTo要素のCustomerNameを新たなBillTo/CustomerNameとして利用します。このやり方には様々ありますが、自動マップを使って、BillToからBillToへドラッグ&ドロップすることで、自動的に必要なノードを追加することができます。ターゲットスキーマパネル(下図のxslt)からノードを追加することもできますし、Add Child(子を追加)を使ってノードを手作業で追加することもできます。
その他にも、テンプレートのBillToノードを右クリックし、Add Children From Schema(スキーマから子を追加)を選択して、ターゲットノードにノードを追加することができます。

All Elements(すべての要素)を選択し、BillToノードの下に追加します。ソースのBillTo要素をドラッグ&ドロップして、下図のようにテンプレートに相対PathのXPath式を作成します。

すると、CustomerNameをShipToからBillToへドラッグ&ドロップすることができますので、これにより、絶対PathのXPath式を作成します(下図)。ここでの基本的なルールは以下の通りです。
  • コンテキストノードの下のコンテキスト領域(紫の領域)からテンプレートへドラッグ&ドロップすると、相対Pathを取得する
  • コンテキスト領域の外部からテンプレートにドラッグ&ドロップすると、絶対Pathを取得する

XSLT Viewにはほかにもまだまだ機能があります。次回のエントリでそうした機能をご紹介したいと思います。

0 件のコメント:

コメントを投稿