使用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>
Run Code Online (Sandbox Code Playgroud)
我的想法是,从widget模板中我可以写出类似的东西:
<xsl:value-of select="$flags/item[1]" />
Run Code Online (Sandbox Code Playgroud)
显然我得到编译错误..我怎么能实现这种事情?
Dim*_*hev 29
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和两个.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>
Run Code Online (Sandbox Code Playgroud)
好吧,我设法通过以下方式绕过这个:
首先在样式表中添加自定义命名空间,例如 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>
Run Code Online (Sandbox Code Playgroud)
然后按以下方式引用:
<xsl:call-template name="widget">
<xsl:with-param name="flags" select="document('')/*/myns:recent-posts-flags" />
</xsl:call-template>
Run Code Online (Sandbox Code Playgroud)
这是有效的,但对于我来说,在<xsl:with-param>标签本身内定义节点集仍然是理想的,就像我给出的第一个例子一样..任何人都认为这是可能的吗?