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

XSLT中如何将一个模板的输出作为参数传递给另一个模板

XSLT模板输出作为参数传递的实现方法

完全可以实现该需求,你现有代码存在几处语法错误,修正后即可正常运行。


现有代码的问题

  • 语法使用错误:xsl:with-param不能直接作为xsl:template的子节点,必须依附于模板调用指令;命名模板不能直接通过$模板名的形式引用,必须通过xsl:call-template显式调用。
  • 拼写不一致:你定义的供数模板名存在拼写错误,若前后引用名称不匹配会直接触发模板不存在的报错。
  • 参数缺失:供数模板定义了context/attrib/case三个必填入参,你调用时没有传入对应值,运行时会报错。

正确实现逻辑

核心思路是先用变量捕获目标模板的输出结果,再将该变量作为参数传入后续模板/转换逻辑,兼容XSLT 1.0/2.0/3.0的通用写法如下:

<xsl:template name="maintemplate">
  <!-- 1. 调用供数模板,将输出结果捕获到变量中 -->
  <xsl:variable name="secondTemplateOutput">
    <xsl:call-template name="secondtemplate">
      <!-- 传入供数模板需要的三个参数,替换为实际业务取值即可 -->
      <xsl:with-param name="context" select="实际需要传入的上下文节点"/>
      <xsl:with-param name="attrib" select="实际需要匹配的attribute属性值"/>
      <xsl:with-param name="case" select="实际需要匹配的case属性值"/>
    </xsl:call-template>
  </xsl:variable>

  <!-- 2. 对捕获的输出做二次转换,直接调用原有translate逻辑即可 -->
  <xsl:value-of select="translate($secondTemplateOutput,' -:','')" />

  <!-- 如果需要把该输出传给其他模板,按如下写法传参即可
  <xsl:call-template name="其他模板名">
    <xsl:with-param name="inputParam" select="$secondTemplateOutput"/>
  </xsl:call-template>
  -->
</xsl:template>

<!-- 供数模板:统一命名,避免拼写不一致问题 -->
<xsl:template name="secondtemplate">
  <xsl:param name="context"/>
  <xsl:param name="attrib"/>
  <xsl:param name="case"/>
  <xsl:value-of select='$context/value[@attribute=$attrib and @case=$case]' />
</xsl:template>

版本兼容注意事项

  • XSLT 1.0环境下,上述无select属性的变量捕获到的内容是结果树片段(RTF):如果只是做字符串处理(比如当前用的translate字符替换),可以直接使用;如果需要对片段内的节点做XPath遍历、筛选操作,需要调用对应处理器支持的node-set()扩展函数将其转为常规节点集后再操作。
  • XSLT 2.0及以上版本已经移除了结果树片段的限制,捕获到的变量直接是可操作的节点序列,不需要额外转换即可执行任意XPath操作。

内容的提问来源于stack exchange,提问作者Sharma_Abhinav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 22:42:29