XSLT 1.0を使用して、基本的に小さなノードセットを作成し、それを次のようなパラメーターとしてテンプレートに渡そうとしています。
<xsl:call-template name="widget">
<xsl:with-param name="flags">
<items>
<item>widget.recent-posts.trim-length=100</item>
<item>widget.recent-posts.how-many=3</item>
<item>widget.recent-posts.show-excerpt</item>
</items>
</xsl:with-param>
</xsl:call-template>
アイデアは、widget
テンプレート内から次のようなものを書くことができるということです。
<xsl:value-of select="$flags/item[1]" />
明らかに、コンパイルエラーが発生します。どうすればこの種のことを実現できますか?
XSLT 1.0には一時ツリーを動的に作成する方法(非標準)がありますおよびそれらのXPath式を評価しますただし、これにはxxx:node-set()
関数を使用する必要があります =。
_xsl:variable
_または_xsl:param
_の本体内にノードが動的に作成される場合は常に、その_xsl:variable
_/_xsl:param
_のタイプはRTF(結果ツリーフラグメント)およびW3 XSLT 1.0仕様。 RTFに対して評価できるXPath式の種類を厳しく制限します。
回避策として、ほとんどすべてのXSLT 1.0ベンダーには独自のxxx:node-set()
拡張機能関数があり、RTFを受け取り、そこから通常のノードセットを生成します。
xxx
プレフィックス(または選択した他のプレフィックス)がバインドされている名前空間は、ベンダーによって異なります。 MSXMLと2つの.NET XSLTプロセッサの場合は、_"urn:schemas-Microsoft-com:xslt"
_です。 EXSLTライブラリは名前空間を使用します:_"http://exslt.org/common"
_。この名前空間EXSLTは多くのXSLT 1.0プロセッサに実装されており、可能であればxxx:node-set()
拡張を使用することをお勧めします。
簡単な例を示します:
_<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-Microsoft-com:xslt"
xmlns:ext="http://exslt.org/common"
exclude-result-prefixes="ext msxsl"
>
<xsl:template match="/">
<xsl:variable name="vTempRTF">
<a>
<b/>
</a>
</xsl:variable>
<xsl:copy-of select="ext:node-set($vTempRTF)/a/*"/>
</xsl:template>
</xsl:stylesheet>
_
さて、私はこれを次の方法でうまく回避することができました:
最初に、カスタム名前空間をスタイルシートに追加します。 xmlns:myns="http://my.ns.com"
次に、スタイルシートの上部でノードセットを定義します。
<myns:recent-posts-flags>
<item>widget.recent-posts.trim-length=100</item>
<item>widget.recent-posts.how-many=3</item>
<item>widget.recent-posts.show-excerpt</item>
</myns:recent-posts-flags>
次に、次の方法で参照します。
<xsl:call-template name="widget">
<xsl:with-param name="flags" select="document('')/*/myns:recent-posts-flags" />
</xsl:call-template>
これは機能しますが、最初の例のように、<xsl:with-param>
タグ自体の中にノードセットを定義することは、やはり理想的です。誰でも可能だと思いますか?