LinuxとWindowsで使用したいxlstファイルを書いています。このファイルでは、MSXML と xsltproc (それぞれ「urn:schemas-microsoft-com:xslt」と「http://exslt.org/common」) の異なる名前空間で宣言されたノード セット関数を使用します。ノードセットを使用するプラットフォームに依存しない方法はありますか?
5 に答える
関数 function-available() を使用して、使用する関数を決定できます。
<xsl:choose>
<xsl:when test="function-available('exslt:node-set')">
<xsl:apply-templates select="exslt:node-set($nodelist)" />
</xsl:when>
<xsl:when test="function-available('msxsl:node-set')">
<xsl:apply-templates select="msxsl:node-set($nodelist)" />
</xsl:when>
<!-- etc -->
</xsl:choose>
このロジックを名前付きテンプレートにラップして、ノードセットをパラメータとして呼び出すこともできます。
はい、優れた普遍的な解決策があります。
EXSLTの関数common:node-set()は、インライン Javascript 関数として実装できるため、Javascript をサポートするすべてのブラウザー (事実上すべての主要なブラウザーで例外なく) で使用できます。
この手法はJulian Reschkeによって最初に発見され、xsl-listで公開された後、 David Carlisleによって公開されました。David Carlisleのブログには、このように実装された common:node-set() 関数が選択したブラウザーで動作するかどうかを示すテスト ページへのリンクもあります。
要約する:
- まずはここに行って説明を読んでください。
- 次に、テスト ページを試します。特に、IE (つまり MSXML) で動作することを確認します。
- 最後に、コードを使用します。
楽しんでください!
Exsltは、プラットフォームに依存しない xslt 拡張機能のセットであると「想定」されていますが、さまざまな xslt プロセッサがそれらを実装することを選択した場合に限ります。
MSXML が実際に exsl:node-set() をサポートしているという証拠がいくつかありますが、確かなことはわかりません。
MSXML の上に exslt を実装することについて議論している古い記事があります。
それ以外の場合は、 function-available() があなたの友達だと思います:)
Firefox 3は、クライアント側のXSLT処理にノードセット(EXSLT 2.0名前空間の改善の一部として)を実装します。
おそらくあなたが探していた答えは完全ではないかもしれませんが、問題の状況によってはそうなる可能性があります。;-)
If there is not a particular reason to use msxml implementation of node-set on windows you coul use exslt one everywhere, by including the implemenation downloaded from http://exslt.org with your stylesheet, exslt howto describes the needed steps. You can use either "Extension namespaces" way or "Named templates" way.