JavaScript/XSLT バインディング

JavaScript/XSLT バインディング

JavaScript は XSLTProcessor オブジェクトを通して XSLT 変換を実行できます。インスタンス化されると、XSLTProcessor には変換で使用される XSLT スタイルシートを引数として取るXSLTProcessor.importStylesheet() メソッドがあります。スタイルシートは XML 文書として渡す必要があります。つまりXSLTProcessor.importStylesheet() を呼び出す前に .xsl ファイルをページでロードする必要があります。これは XMLHttpRequest または XMLDocument.load() (en-US) で行うことができます。

Figure 1 : XSLTProcessor のインスタンス化

  var xsltProcessor = new XSLTProcessor();

  // Load the xsl file using synchronous (third param is set to false) XMLHttpRequest
  var myXMLHTTPRequest = new XMLHttpRequest();
  myXMLHTTPRequest.open("GET", "example.xsl", false);
  myXMLHTTPRequest.send(null);

  var xslRef = myXMLHTTPRequest.responseXML;

  // Finally import the .xsl
  xsltProcessor.importStylesheet(xslRef);

実際の変換では、XSLTProcessor には XML ドキュメントが必要です。このドキュメントは、最終的な結果を得るためにインポートされた XSL ファイルと一緒に使用されます。XML ドキュメントは、図 1 に示すようにロードされた別個の XML ファイルでも、既存のページの一部でもかまいません。ページの DOM の一部を処理するには、最初にメモリー内に XML 文書を作成する必要があります。処理対象の DOM が id の exampleを持つ要素に含まれていると仮定すると、その DOM はメモリ内 XML ドキュメントの Document.importNode() メソッドを使用して "複製"できます。Document.importNode() は、ドキュメント間(この場合は HTML ドキュメントから XML ドキュメントへ)の DOM フラグメントを転送することを可能にします。最初のパラメータはクローンを作成する DOM ノードを参照します。2 番目のパラメータを "true" にすることですべての子孫も同様にクローンします (深いクローン)。複製された DOM は図 2 に示すように、Node.appendChild() を使用して簡単に XML ドキュメントに挿入できます。

Figure 2 : ドキュメントの DOM の一部に基づいて XML ドキュメントを作成する

  // create a new XML document in memory
  var xmlRef = document.implementation.createDocument("", "", null);

  // we want to move a part of the DOM from an HTML document to an XML document.
  // importNode is used to clone the nodes we want to process via XSLT - true makes it do a deep clone
  var myNode = document.getElementById("example");
  var clonedNode = xmlRef.importNode(myNode, true);

  // add the cloned DOM into the XML document
  xmlRef.appendChild(clonedNode);

スタイルシートをインポートしたら、XSLTProcessor は実際の変換に 2 つのメソッド、つまりXSLTProcessor.transformToDocument()XSLTProcessor.transformToFragment() を実行する必要があります。XSLTProcessor.transformToDocument() は完全な XML ドキュメントを返しますが、XSLTProcessor.transformToFragment() は既存のドキュメントに簡単に追加できるドキュメントフラグメントを返します。どちらも、変換される最初のパラメーターとして XML 文書を取り込みます。 XSLTProcessor.transformToFragment() は第 2 のパラメータ、すなわち生成されたフラグメントを所有するドキュメントオブジェクトを必要とします。生成されたフラグメントが現在の HTML ドキュメントに挿入される場合はドキュメントを渡すだけで十分です。

Figure 2.1 : 文字列 'XML Soup' からの XML 文書の作成

IE loadXML メソッドを使用して XML を含む文字列をロードすることができますが、Mozilla で同じことをするためにいくつかの微調整とチューニングを行う必要があります。これは DomParser によって処理されるため、DomParser.no を使用してドキュメントを作成する必要があります。

var parser = new DOMParser();
var doc = parser.parseFromString(aStr, "text/xml");

Figure 3 : 変換の実行

  var fragment = xsltProcessor.transformToFragment(xmlRef, document);