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

如何通过xsl:call-template传递XML数据至XSLT模板?

如何在XSLT中传递XML节点集到模板并保留结构

完全可以传递XML节点数据到XSLT模板,你的问题出在参数传递和输出的方式上:

问题根源

你在<xsl:with-param>内部使用了<xsl:value-of>,这个指令会提取节点的纯文本内容并转换为字符串,导致传递到模板的是剥离了标签的文本,自然丢失XML结构。

正确实现方法

1. 直接传递节点集(无需<xsl:value-of>)

修改调用模板的代码,直接通过select属性传递节点集:

<xsl:call-template name="schedule">
    <xsl:with-param name="data" select="//root/scheduleData" />
</xsl:call-template>

2. 使用<xsl:copy-of>保留节点结构输出

模板中不要用<xsl:value-of>(仅提取文本),改用<xsl:copy-of>复制完整的节点树:

<xsl:template name="schedule">
    <xsl:param name="data" />
    <fo:block>
      <xsl:copy-of select="$data" />
    </fo:block>
</xsl:template>

3. 逐个处理节点(可选)

如果需要单独处理每个scheduleData节点,可以在模板内循环遍历节点集:

<xsl:template name="schedule">
    <xsl:param name="data" />
    <xsl:for-each select="$data">
        <fo:block>
          <!-- 复制当前节点的完整结构 -->
          <xsl:copy-of select="." />
        </fo:block>
        <!-- 也可以单独处理子节点,比如输出<a>和<b>的文本 -->
        <fo:block>
            a的值:<xsl:value-of select="a" />,b的值:<xsl:value-of select="b" />
        </fo:block>
    </xsl:for-each>
</xsl:template>

版本兼容说明

  • XSLT 1.0:原生支持节点集传递,上述代码直接可用。
  • XSLT 2.0+:节点集被整合为序列,处理逻辑一致,还可以使用更灵活的序列操作语法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:52:15