いくつかのXSLファイルを使用してHTMLに変換したいXMLがいくつかあります。これらのXSLファイルはすべてxsl:importおよびxsl:includeステートメントを介して関連付けられており、変換を完了するためにすべて必要です。
<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
ブラウザーで開いた事前に作成されたXMLファイルでディレクティブを使用すると、必要な出力が表示されるため、XSLが機能することはわかっています。問題は、動的に生成されたXMLでこの機能を複製できるようにしたいということです。
これが可能であることがわかる2つの方法がありますが、どちらにも回避できない制限があるようです。
最初の解決策は、Javascriptを使用してXMLを変換することです。私の知る限り、これにはXSLTProcessorオブジェクトが複数のXSLファイルをロードする必要がありますが、Chrome(およびおそらく他のブラウザー)はxsl:importを十分にサポートしていません-http: //code.google.com/p/chromium/課題/詳細?id = 8441
XMLをiFrameまたは新しいウィンドウに書き込むことも検討しましたが、<?xml-stylesheet type="text/xsl" href="transform.xsl"?>
ディレクティブは結果のウィンドウでコメント化されています。実際、新しいウィンドウに書き込まれるものはすべてHTMLです。XMLを新しいウィンドウに書き込む方法は見つかりませんでした。
では、XSLファイルのセットで変換されたXMLファイルの結果を表示するブラウザーウィンドウを取得するにはどうすればよいですか?
アップデート
それで、これがこの問題に関する私の研究の結果です。
考えられる回避策:emscriptenを使用してxsltprocなどのツールをJavaScriptにコンパイルします。私は実際にこれを行いました-https://github.com/mcasperson/xsltproc.jsを参照してください
問題:Firefoxでは非常に遅く(Chromeで5秒かかるものはFirefoxで30+かかります)、ChromeWebワーカーでコードを実行できません-https ://code.google.com/p/chromium/課題/詳細?id = 252492
考えられる回避策:XSLはまったく使用しないでください。ただし、CSSスタイルシートを使用してXMLを表示してください。
問題:ブラウザがcss attr(atrributename, url)
関数の実装を開始するまで、XML属性のファイル参照を文字列以外のものとして扱う方法がないため、画像を表示できません。
考えられる回避策:すべてのXSLファイルを単一のスタイルシートにマージします
問題:これはある程度可能ですが(複数のxsltスタイルシートのマージを参照)、xsl:importまたはxsl:includeは、xsl:importまたはxsl:includeステートメントの代わりにファイルの内容を単に置き換える場合には引き継がれない特定のセマンティクスを持っています。複数のファイルに分割された大規模なXSL変換の場合、このソリューションでは多くの手動作業が必要になります。
考えられる回避策:XMLの内容をiframeまたは新しいウィンドウに書き出します。
問題:新しいウィンドウまたはiframeにXMLを書き込むことができません。これらの要素に書き込まれるコンテンツは常にHTMLであると見なされ、HTML->BODY要素に挿入されます。
考えられる回避策:XMLを受け取り、XSLスタイルシートディレクティブを使用してそのXMLを返すサーバー側サービスを作成します。その後、サービスURLをsrc
iframeまたは新しいウィンドウの属性として使用できます。
問題:サービスはGETエンドポイントである必要があります。つまり、返されるXMLをクエリパラメーターとして含める必要があります。つまり、最終的にURLの長さに関する問題が発生します。
考えられる回避策: SaxonicaCEのようなjavascriptXSLライブラリを使用します。
問題:これは実際には機能する可能性がありますが(私は試していません)、Saxonica CEはオープンソースではありません(これは私たちのプロジェクトの要件です)。