如何通过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
相关产品推荐
相关产品推荐

