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

前

H XSLTエディタでの大規模なスキーマの操作

XSLTエディタには、編集中のXSLTマップの入力ドキュメントおよび出力ドキュメントをXML表現で示したソース・ツリーおよびターゲット・ツリーが表示されます。ルート要素定義を選択すると、エディタによってXSDスキーマ・ドキュメントからこれらのツリーが作成されます。

これらのスキーマ・ツリーは大規模になり、XSLTエディタなどのグラフィカルなマッピング・ツールでの操作が難しくなることがあります。スキーマ・ドキュメントの中には、親ノードごとに数百の子ノードを定義しているものもあります。このような親ノードのいくつかをツリーで展開した場合、XSLTマップを作成する際スクロール・スルーすることになるツリー・ノードが数千個生成される可能性があります。

スキーマは非常に大きくても、マッピングがスパースな場合、つまりマッピングされているターゲット・ノードが非常に少ない場合、ユーザーはマッピングする必要のないノードを絶えずスクロール・スルーする必要があります。これに対し、マッピングがスパースでなく、多数のマッピングが存在する場合、多数の線が交差し、マッピングがわかりにくくなります。

この付録では、スパースなマップとスパースでないマップの両方に対するストラテジおよび見にくさを低減する方法について説明します。

H.1 スパース・マッピング

スキーマは多くの場合、多様な可能性に対応するよう作成されます。このようなスキーマがソースおよびターゲットのツリーの生成に使用されると、ツリーに非常に多くの(場合によっては数百万の)ノードが含まれる可能性があります。ただし、多くの場合、ユーザーが使用または移入する必要があるのは、スキーマに定義されているノードのうちごく一部のみです。

スパース・マッピングの処理には様々な方法があります。

サンプルXMLを使用したスキーマの生成

12c XSLTエディタにはXMLドキュメントからスキーマを作成する機能があり、これをソースまたはターゲットのツリーのスキーマ・ドキュメントとして使用できます。ソースまたはターゲット(あるいはその両方)用にサンプルXMLドキュメントがある場合、このドキュメントを使用してマップに必要なノードのみを含む小さなスキーマ・ドキュメントを作成できます。

サンプル・ソースおよびターゲットXMLドキュメントを使用してXSLTマップを作成するには、新規XSLマップのソースまたはターゲットのスキーマを選択する際、「XMLから生成」オプションを選択します。

「スキーマの選択」ダイアログ

スキーマが生成され、Schemasフォルダに配置されます。このスキーマを使用してマッピングのソースおよびターゲットのツリーを作成すると、元のサンプルXMLドキュメントに存在するノードのみが含まれます。

小さなサンプル・スキーマと大規模なスキーマの間で切り替える必要がある場合、キャンバスのコンテキスト・メニューから「ソースまたはターゲット・スキーマの置換/追加」を選択します。Schemasフォルダの小さなサンプル・スキーマまたは大規模なスキーマを選択します。

「ソース・スキーマの置換/追加」メニュー項目

XSLTビューの使用

12cのエディタには、設計ビュー・タブ内で使用可能な新規ビューが含まれています。これが、XSLTビューです。XSLTエディタ・ツールバーの右上の「XSLT」ボタンをクリックして使用します。

「XSLT」ボタン

XSLTビューには、XSLTファイル内に存在する文が表示されます。以前にソースXMLエディタでXSLTを編集したことのあるユーザーには、このビューの良さがわかるでしょう。XSLTソースでの文の出現と同じように編成されています。このビューを使用すると、作成中のマッピングの簡約版が表示されます。たとえば、大規模ターゲット・スキーマのマップのマップ・ビューでの表示を次に示します。スキーマでツリーの後半に出現するノードへのマップの線が表示の下端で切れていることに注意してください。

マップ・ビュー

同じマッピングのXSLTビューでの表示を次に示します。

XSLTビュー

この場合、使用されていないターゲット・ノードがスペースを取ることがなく、すべてのマッピングが明確にわかります。新規ターゲット要素をスキーマから追加する必要がある場合、コンテキスト・メニューで「スキーマからの子の追加」オプションを使用します。

親ノードのコンテキスト・メニューから「スキーマからの子の追加」オプションを選択すると、選択および追加可能な子ノードのリストが表示されます。親ノードのこのメニューから「すべての属性」/「すべての要素」/「すべての必須」を選択することもできます。

「スキーマからの子の追加」メニュー項目

さらに付け加えると、ノードがこのようにして追加された場合、挿入したノードのすべての必要な子が自動的に追加されます。前述の例では、ns2:records要素を追加するよう選択した場合、ツリー内の正しい位置に挿入され、これに必要なns1:idノードが自動的に追加されます。

ns2:records要素のns:Idノード

ソース・ビューでの編集に慣れている場合、ソース・ビューと設計ビューの間を簡単に移動できるオプションが12.2.1.0.0で追加されました。XSLTパネルで任意のノードを右クリックし、「ソース・ビュー内の検索」を選択します。

「ソース・ビュー内の検索」コンテキスト・メニュー項目

ソース・ビューが開き、ノードが選択されています。

ソース・ビュー

設計ビューのノードに戻るには、ソース・ビューで「設計ビュー内の検索」オプションを選択します。

XSLTビューを使用して任意のXSLT文を挿入することもでき、XSLTビューで名前付きテンプレートおよび一致するテンプレート(テンプレート・ルール)を使用できます。XSLTビューの詳細は、「XSLTビューでのXSLTマップの編集」を参照してください。

H.1.1 XSLTビューのクイック・スタート

プリファレンスを設定してXSLTエディタを常にXSLTビューで起動できます。この設定では、開始するためのターゲット・ノードの自動作成も制御されます。XSLTビュー用のプリファレンスを設定するには、「ツール」→「プリファレンス」を選択して「プリファレンス」ダイアログを起動します。「XSLマップ」→「XSLエディタ」を選択します。

「プリファレンス」ダイアログ

XSLTビューで起動するには、XSLTビュー初期化オプションを選択し、希望のオプションを選択します。大規模なスキーマの操作の場合、生成する子のレベル数の限度を設定することをお薦めします。

XSLTマップを作成する際、これらのオプションが使用されます。また、これらのオプションは、キャンバスのコンテキスト・メニューから「XSLTマップのクリア」オプションを選択した場合に使用されます。

「XSLTマップのクリア」コンテキスト・メニュー項目

特定のマップについてプリファレンス設定が適していない場合、プリファレンスに変更を加え、「XSLTマップのクリア」を選択して初期マップを再生成します。

H.2 非スパース・マッピング

時として、大量のターゲット要素を含む、つまり大量のマッピングを含むマップを作成したり、変更する必要がある場合があります。このようなマップを編集する場合、編集内容を追跡することが困難なことがあります。そのような場合のために12c XSLTエディタには、ユーザーがマッピングのスコープを設定し、選択したターゲット・ノードより下のマッピングのみを表示できる新しい機能があります。

たとえば、次のような非スパース・マッピングがあるとします。

多数のマッピングを示すJDev Editor。

ターゲット・ツリー内の操作対象部分にマッピングのスコープを設定できます。ターゲット・ノードを右クリックして、「表示スコープの設定」を選択します。

「表示スコープの設定」コンテキスト・メニュー

表示は、選択したターゲット・ノードにスコープが設定されています。この部分以外のマッピングを示す線はすべて描かれません。ソース・ツリーは簡約化されてマップされているノードのみ表示されます。

ターゲット・ノードにスコープが設定された表示

スコープ内の部分で作業を続けることができます。

ソース・ツリー内の非表示の部分を展開して、追加のマッピングに必要なノードを表示できます。ソース・ツリーで任意の非表示のアイテムを右クリックし、ツリー内の検索および表示するノードの選択のためのオプションを含むポップアップ・メニューを表示します。

非表示とマークされたアイテムのポップアップ・メニュー

このポップアップから行う検索は、現在選択している非表示の部分以外にも及ぶため、検索するノードを含む正しい非表示部分を選択する必要はありません。

メイン・コンテキスト・メニューには、ソース・ツリーの一部を非表示にしたり、展開するオプションもあります。ツリー内の非表示でないノードを右クリックすると、選択したノードの兄弟および子を表示したり、非表示にするオプションがあります。

「マップされていない兄弟の非表示」コンテキスト・メニュー項目

ターゲット・ツリーで、「スキーマからの子の追加」オプションを使用してスキーマからノードを追加できます。

「スキーマからの子の追加」オプション

スコープ付きの表示を終了するには、スコープ外のターゲット・ノードをクリックするか、ターゲット・ツリーのコンテキスト・メニューから「表示スコープの終了」を選択します。

H.3 テキストの見にくさの低減

12cのXSLTエディタには、ソースおよびターゲット・ツリーでノード名および他の情報を略記する機能があります。キャンバスのコンテキスト・メニューから「テキスト短縮」オプションを選択すると、接頭辞が非表示になり、特定のタイプのノードのテキストが略記されます。

略記の前:

略記の前

略記の後:

略記の後

ノード名のテキストの略記を定義できるカスタム表示オプション構成ファイルを作成することもできます。たとえば、前述の例では、CustomerPartyListという語句が多くのノード名に出現します。カスタム表示オプション構成ファイルを使用して、これをCPLと略記できます。そうすると、$EscapedSyncCustomerPartyListEBMなどのノード名は、ツリーで$EscapedSyncCPLEBMと表示されます。

これによって、XSLTや生成されたXPath文内のノード名は変更されません。ツリー・ノードに出現する名前にのみ適用され、スキーマ・ノード定義で使用されている名前が冗長な場合の全体的な見にくさの低減に役立ちます。

カスタム表示オプション構成ファイルは、XSLエディタのプリファレンス下でロードできます。詳細は、「カスタマイズ・ファイルをインポートしてXSLTマップ・エディタの表示プリファレンスを指定する方法」を参照してください。

H.4 ツリーの検索

大規模なスキーマで要素名を検索すると、検索に時間がかかることがあります。12.1.3では、検索に取消しオプションはありません。これが12.2.1で追加されました。

検索に時間がかかる場合、プリファレンスでツリーの「展開の深さ」を減らすことで、ツリー・サイズを小さくすることができます。「ツール」→「プリファレンス」に移動します。ナビゲータから「XSLマップ」を選択します。「拡張オプションの表示」ボタンをクリックし、「XMLスキーマ最大展開の深さ」オプションの「展開の深さ」を小さな値に変更します。単一レベルに数百個の子があるツリーの場合、この値を10レベル前後にする必要があります。これは、ここで設定したレベルより下は検索されないということですが、ツリーに数百万個のノードが含まれる場合もあり、その場合は検索に時間がかかります。

H.5 大規模な入力ドキュメントのコピーと変更

ユーザーの中には、XSLTエディタの自動マップ機能を使用して入力XMLドキュメントをコピーしようとするユーザーがいるかもしれません。ただし、自動マップではスキーマ内のノードごとに特定のXSLT文が生成されます。大規模なスキーマでは、これは入力ドキュメントの効率的なコピー方法ではありません。これによって非常に大きなサイズのXSLTファイルが生成される可能性があります。これらのファイルはロードに時間がかかり、編集が困難です。さらに、ユーザーのマッピングがスパースの場合、スキーマには定義されているが、実行時には存在しないノードに対して実行するXSLTが数千行生成され、非効率です。

12cのXSLTエディタでは、一致するテンプレート(テンプレート・ルール)の作成がサポートされるようになりました。特に、ソース・ツリー内のすべてのノードをコピーできるアイデンティティ・テンプレートを追加できるようになりました。次の手順を実行します。

  1. XSLTビューに切り替えます。
  2. 「コンポーネント」ウィンドウから「XSLTテンプレート」を選択します。
  3. アイデンティティ・テンプレートを「その他のテンプレート」セクションからxsl:stylesheetノードの左側にドラッグ・アンド・ドロップします。正しい位置にドロップすると、テンプレートがスタイルシート・ノードの子として追加されることを示す緑色のハイライトが表示されます。

    アイデンティティ・テンプレートのドラッグ・アンド・ドロップ

  4. 元のルートのmatch="/"テンプレートをXSLTから削除します。

    表示は次のようになります。

    XSLTマップの表示

    入力ドキュメント内の各ノードが、アイデンティティ・テンプレートによって処理されます。これは、ソース・ツリーの各ノードのバブルがハイライト表示されることで示されます。このハイライト表示は、選択したテンプレートのコンテキスト・ノードを示すものです。各ノードが処理される際、xsl:copy文が実行され、ノードが出力にコピーされます。apply-templates文は、現在処理されているコンテキスト・ノードの子ノードを続けて処理するようプロセッサに指示します。これで入力ドキュメント全体がコピーされます。

    追加テンプレートを追加し、コピーの際、ツリーに変更を加えることができます。たとえば、単に入力ツリーからノードを削除する必要があるとします。これは、出力から削除するノードに対する空のテンプレートを追加することで行うことができます。つまり、このノードを処理すると何も出力されず、実質的にはツリーからノードが削除されることになります。

    ノードに対する空のテンプレートを追加するには、ソース・ノードを右クリックし、「新規テンプレート・ルール」を選択します。

    「新規テンプレート・ルール」メニュー項目

    表示された新規テンプレート・ダイアログで「OK」をクリックします。テンプレートが追加されます。アイデンティティ・テンプレートが選択されている場合のノードの表示との違いに注意してください。バブルはハイライト表示されておらず、アイデンティティ・テンプレートで処理されていないことを示しています。

    バブルがハイライト表示されていない表示。

    新しい空のテンプレートを選択すると、このノードがハイライト表示され、このテンプレートがノードを処理し、処理時に何も出力しないことを示します。

    新しい空のテンプレートの選択。

    ここで、別のノードのテキストを大文字にする必要もあるとします。明示的にそのノードを処理して大文字にする別のテンプレートを作成します。ソース・ツリーでBrokenPlaceノードから「新規テンプレート・ルール」オプションを選択してテンプレートを作成します。「新規テンプレート・ルール」ダイアログが表示されたら、テンプレートで作成するノードを選択します。

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

    「OK」をクリックすると、テンプレートとノードが作成されます。大文字関数をノードに割り当てます。

    大文字関数の適用

    このノードが出力に作成されるとき、そのテキストは大文字になります。

    このようにすると、大規模な入力XMLを非常に少ないXSLT文でコピーおよび変更できます。

H.6 要素置換およびタイプ置換を使用したテスト・ファイルの生成

XSLTエディタでは、導出されたタイプおよびXSDに定義された置換グループに基づいて要素およびタイプの置換を行うことができます。多くのスキーマには、置換グループの要素またはxsi:typeを使用して導出されたタイプの要素でオーバーロードできる抽象要素またはタイプが含まれます。

XSLTエディタのテスト・ツールでは、置換された要素を含む入力XMLドキュメントの生成は現在サポートされません。そのため、ソース・ツリーで置換が行われたXSLTマップを起動すると、次の警告が表示されます。

警告メッセージ

ユーザーは、生成された入力ドキュメントを変更するか、独自のテスト入力ファイルを提供する必要があります。xsi:type定義または必要な要素の置換に正しい構文を使用してユーザー自身が入力ドキュメントで置換を行う必要がありますが、これは簡単ではありません。複数の置換が行われた大規模なスキーマの場合、より難しくなります。

XSLTエディタを使用すると、要素が正しく置換され、適切なネームスペース/接頭辞がすべて定義された入力ドキュメントを生成できます。これを入力テスト・ドキュメントのテンプレートにします。

前述のマッピングでは、ソース・ツリーで2つの置換が行われています。1つ目は、スキーマ・ドキュメントで定義された置換グループの置換された要素CommentListです。2つ目は、スキーマ・ドキュメントで定義された、導出されたアイテム・タイプのItemタイプ置換です。

このマップをテストするためのテスト入力ファイルとして使用できるドキュメントを生成する小さなXSLTマップを作成します。これには、正しいxsi:typeおよびソース・ドキュメントに定義された要素置換情報が含まれる必要があります。

既存のマップのPurchaseOrderソースのテスト入力として使用できるPurchaseOrderドキュメントを出力する必要があるため、ソースにはスキーマ・ドキュメントを選択せず、ターゲットにはPurchaseOrderスキーマを選択して新しいマップを作成します。

スキーマからの子の追加を使用し、PurchaseOrderソースで行ったのと同じ置換をPurchaseOrderターゲットに行い、次のようなマップを作成します。

サンプル・マップ

このXSLTをテスト・ツールで実行し、PurchaseOrderテンプレート・ドキュメントを作成します。

「XSLマップのテスト」ダイアログ

これによって、テスト用の正しい置換を含む、テスト入力ドキュメントのテンプレートが生成されます。

生成されたテンプレート

定義されたフィールドに適切なテスト・データを入力できます。あるいは、テスト・ファイルを生成するXSLTにデータ値を定義し、テスト・ファイルに事前移入できます。