You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:18:19