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

ユーザーの中には、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文でコピーおよび変更できます。