XSLT 1.0 - 创建节点集并作为参数传递

时间:2010-10-07 09:54:33

标签: xslt

使用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]" />

显然我遇到了编译错误..我怎么能实现这种事情呢?

2 个答案:

答案 0 :(得分:28)

XSLT 1.0中有一种方法(非标准)动态创建临时树并评估它们上的XPath表达式,但是这需要使用xxx:node-set()函数

每当在xsl:variablexsl: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>标签中定义节点集,就像我给出的第一个例子一样..有人认为这是可能的吗?