Mozilla JavaScript インターフェイスを使用した XSL 変換

この文書では、 Mozilla 1.2 の JavaScript インターフェイスと XSLT 処理エンジン (TransforMiiX) について説明します。

XSLTProcessorの作成

まず、XSLTProcessor オブジェクトを作成する必要があります。

var processor = new XSLTProcessor();

スタイルシートの指定

これを使用するには、 XSLTProcessor.importStylesheet() メソッドを使用してスタイルシートをインポートする必要があります。これには単一の引数があり、インポートする XSLT スタイルシートの DOM ノードを指定します。

Note: インポートはライブです。つまりインポート後にスタイルシートの DOM を変更すると、処理に反映されます。 DOM を変更するよりも、スタイルシートの引数を使用することが推奨されています。通常より簡単に、より良いパフォーマンスを得ることができます。

var testTransform = document.implementation.createDocument("", "test", null);
// just an example to get a transform into a script as a DOM
// XMLDocument.load is asynchronous, so all processing happens in the
// onload handler
testTransform.addEventListener("load", onload, false);
testTransform.load("test-transform.xml");
function onload() {
  processor.importStylesheet(testTransform);
}

XSLTProcessor.importStylesheet() には引数、つまり DOM ノードが 1 つ必要です。そのノードが文書ノードの場合、完全な XSL Transform またはリテラル結果要素の変換を渡すことができます。そうでない場合は、 xsl:stylesheet または xsl:transform 要素でなければなりません。

文書の変換

XSLTProcessor.transformToDocument() または XSLTProcessor.transformToFragment() メソッドを使用すると、インポートされた XSLT スタイルシートを使用して文書を変換することができます。

transformToDocument

XSLTProcessor.transformToDocument() は変換するソースノードを1つ引数として、変換結果とともに新しい Document を返します。

var newDocument = processor.transformToDocument(domToBeTransformed);

結果のオブジェクトはスタイルシートの出力メソッドに依存します。

transformToFragment

DocumentFragment ノードを返す XSLTProcessor.transformToFragment() を使用することもできます。フラグメントを別のノードに追加すると、そのフラグメントのすべての子が透過的に追加され、フラグメント自体はマージされないため、これは便利です。したがってフラグメントは、完全な文書オブジェクトのオーバーヘッドなしにノードを移動して格納するのに便利です。

XSLTProcessor.transformToFragment() は、変換するソース文書(上記)とフラグメントを所有する Document オブジェクトの 2 つの引数をとります(すべてのフラグメントは文書が所有しなければなりません)。

var ownerDocument = document.implementation.createDocument("", "test", null);
var newFragment = processor.transformToFragment(domToBeTransformed, ownerDocument);

XSLTProcessor.transformToFragment() は、所有文書自体が HTMLDocument の場合、またはスタイルシートの出力メソッドが HTML の場合、 HTML DOM オブジェクトを生成します。これは、XSLTProcessor.transformToFragment() がこの要素の作成に使用されることはほとんどないので、結果の最上位要素のみが <html> の場合、HTML DOMオブジェクトを生成しません。これをオーバーライドする場合は、通常の方法で出力メソッドを通常どおりに設定できます。

transforming HTML

残念ながら、XSLT を使用して HTML ノードを変換することは現在サポートされていません。パターンや式で小文字のノード名を使用してノードがnull名前空間にあるかのように扱う場合、いくつかのことが成り立ちますが、これはあまりうまくテストされていないため、すべての状況で機能しない可能性があります。これは将来のリリースで変更される可能性もあります。

しかし XHTML の変換は期待通りに機能するはずです。

引数の設定

スタイルシートの引数XSLTProcessor.setParameter()XSLTProcessor.getParameter()XSLTProcessor.removeParameter() の各メソッドを使用して制御することができます。これらはすべて XSLTProcessor.setParameter() が設定する引数の値の 3 分の 1 を使用して、名前空間 URI とローカル名を最初の 2 つの引数として取ります。例については、 Gecko の XSLT/JavaScript インターフェイスを参照してください。

リセット

XSLTProcessor オブジェクトは、すべてのスタイルシートと引数を削除してプロセッサーを初期状態に戻すために使用できる XSLTProcessor.reset() メソッドも実装しています。このメソッドは Gecko 1.3 以降で実装されています。

リソース

以下のものは XSLTProcessor オブジェクトのインターフェイスを反映しています。

XPCOM コンポーネントから XSLTProcessor を使用

XPCOM コンポーネントから XSLTProcessor をインスタンス化するには、コンストラクターがコンポーネント内で定義されていないため、別の構文が必要です。

次のようにする代わりに、

var processor = new XSLTProcessor();

次のようにします。

var processor = Components.classes["@mozilla.org/document-transformer;1?type=xslt"]
                          .createInstance(Components.interfaces.nsIXSLTProcessor);

関連情報

原著情報

  • 著者: Mike Hearn
  • 最終更新日: 2005 年 12 月 21 日
  • 著作権情報: Copyright (C) Mike Hearn