XSL 2.0如何为同一参数传入多值?求可变参数模板方案
XSL 2.0 可变参数模板实现方案
在XSL 2.0中没有原生的可变参数(variadic)模板语法,但可以通过以下几种替代方案实现类似效果,按灵活性和简洁性排序:
1. 利用序列(Sequence)传递可变参数(推荐)
XSL 2.0原生支持序列(任意类型值的集合),这是实现可变参数最简洁的方式,无需额外包装节点:
定义模板
<xsl:template name="i"> <!-- 接收任意类型的序列参数 --> <xsl:param name="args" as="item()*"/> <!-- 遍历序列中的每一项 --> <xsl:for-each select="$args"> <xsl:value-of select="."/> </xsl:for-each> </xsl:template>
调用模板
直接传入多个值组成的序列,用逗号分隔:
<xsl:template match="f"> <xsl:call-template name="i"> <xsl:with-param name="args" select="./@one, ./@two"/> </xsl:call-template> </xsl:template>
这种方式支持传递字符串、属性、节点、数字等任意类型的项,比节点集更灵活。
2. 优化你当前的节点集传递方案
你的思路是可行的,但代码存在语法错误(<xsl:with-param>的闭合标签写法有误),修正后的版本如下:
定义模板(保持你的逻辑)
<xsl:template name="i"> <xsl:param name="args"/> <xsl:for-each select="$args/*"> <xsl:value-of select="."/> </xsl:for-each> </xsl:template>
调用模板(修正语法错误)
<xsl:template match="f"> <xsl:call-template name="i"> <!-- 注意这里是闭合标签,不是自闭合格式 --> <xsl:with-param name="args"> <a><xsl:value-of select="./@one"/></a> <a><xsl:value-of select="./@two"/></a> </xsl:with-param> </xsl:call-template> </xsl:template>
这种方式需要将参数包装成节点,适合需要传递带结构的内容时使用,但比序列方案繁琐。
3. 多参数+默认值(适合参数数量有限的场景)
如果你的参数数量是有限的(比如最多3个),可以给参数设置默认空序列,实现类似可选参数的效果:
定义模板
<xsl:template name="i"> <xsl:param name="arg1" as="item()?"/> <xsl:param name="arg2" as="item()?"/> <xsl:param name="arg3" as="item()?"/> <!-- 将非空参数合并成序列遍历 --> <xsl:for-each select="$arg1, $arg2, $arg3[.!='']"> <xsl:value-of select="."/> </xsl:for-each> </xsl:template>
调用模板
可以传入1到3个参数,未传入的会使用默认值:
<xsl:call-template name="i"> <xsl:with-param name="arg1" select="./@one"/> <xsl:with-param name="arg2" select="./@two"/> </xsl:call-template>
这种方式适合参数数量固定且较少的场景,可读性更强,但扩展性不如序列方案。
内容的提问来源于stack exchange,提问作者yegor256
相关产品推荐
相关产品推荐

