如何在主XSLT文件中调用另一XSLT处理特定节点集?
在主XSLT中调用外部模板实现特定节点集转换
当然可以实现,核心是通过导入/包含外部模板或在主逻辑中直接调用外部XSLT两种方式,完成特定节点集的转换。以下是具体实现方案:
1. 整合外部模板到主XSLT
如果第二个XSLT仅包含针对特定节点集的模板,最直接的方式是在主XSLT顶部用<xsl:include>或<xsl:import>引入它:
<xsl:include>:将外部XSLT内容直接插入主文件,模板优先级与主文件一致(同名模板主文件会覆盖外部)<xsl:import>:外部模板优先级低于主文件,主文件同名模板会优先执行
示例代码
主XSLT(main.xsl):
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 引入外部模板文件 --> <xsl:include href="specific-templates.xsl"/> <xsl:template match="/"> <root> <!-- 调用外部模板处理目标节点集 --> <xsl:apply-templates select="target-node-set"/> </root> </xsl:template> </xsl:stylesheet>
外部模板文件(specific-templates.xsl):
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="target-node-set"> <!-- 针对该节点集的转换逻辑 --> <processed-node> <xsl:value-of select="child-node"/> </processed-node> </xsl:template> </xsl:stylesheet>
2. 在主模板中直接调用外部XSLT转换节点集
如果需要在主XSLT的某个模板/函数内,单独对特定节点集执行外部XSLT转换,可根据XSLT版本选择方案:
XSLT 1.0 实现
<xsl:template match="/"> <xsl:variable name="target-nodes" select="target-node-set"/> <!-- 加载外部XSLT并应用到目标节点 --> <xsl:apply-templates select="$target-nodes" mode="external-transform"> <xsl:with-param name="external-xslt" select="document('specific-templates.xsl')"/> </xsl:apply-templates> </xsl:template> <xsl:template match="*" mode="external-transform"> <xsl:param name="external-xslt"/> <xsl:apply-templates select="." select="$external-xslt"/> </xsl:template>
XSLT 2.0+ 实现(更简洁)
<xsl:template match="/"> <xsl:variable name="target-nodes" select="target-node-set"/> <!-- 直接调用外部XSLT转换节点集 --> <xsl:result-document> <xsl:transform href="specific-templates.xsl" select="$target-nodes"/> </xsl:result-document> </xsl:template>
注意:不同XSLT处理器(如Saxon、Xalan)对特性支持略有差异,需结合使用的工具调整。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

