使用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]" />
显然我遇到了编译错误..我怎么能实现这种事情呢?
答案 0 :(得分:28)
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>
答案 1 :(得分:6)
好吧,我设法通过以下方式解决了这个问题:
首先在样式表中添加自定义命名空间,例如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>
标签中定义节点集,就像我给出的第一个例子一样..有人认为这是可能的吗?