JavaScript/XSLT バインディング

JavaScript/XSLT バインディング

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

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);

ドキュメントのタグと貢献者

タグ: 
このページの貢献者: silverskyvicto
最終更新者: silverskyvicto,