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

Joh*_*eri 26 xslt xslt-1.0

使用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: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>
Run Code Online (Sandbox Code Playgroud)


Joh*_*eri 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>
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>标签本身内定义节点集仍然是理想的,就像我给出的第一个例子一样..任何人都认为这是可能的吗?