xsl:result-document是xslt 2.0+中生成多个输出文件的核心指令,需指定href属性定义目标uri,支持动态路径构造、格式控制及校验选项,常用于将xml中多个元素分别输出为独立文件。

在XSLT 2.0及以上版本中,xsl:result-document 是生成多个输出文件的核心机制。它允许你在一次转换过程中,将不同节点集或内容分别写入独立的文件(或URI),而不是仅输出到主结果树。
基本语法与必需属性
xsl:result-document 必须指定 href 属性(目标文件路径/URI),且需配合 XSLT 2.0+ 处理器(如 Saxon-HE/PE/EE、BaseX、Altova RaptorXML)使用。XSLT 1.0 不支持该指令。
-
href:字符串表达式,决定输出文件路径(支持相对路径、绝对路径、file:// 或其他协议 URI) -
format(可选):引用xsl:output声明的 name,控制编码、缩进、DOCTYPE 等 -
validation(可选):控制是否校验输出是否符合 schema("strict" / "lax" / "preserve" / "strip") - 内容体即为该文件的输出内容(可以是任意序列:元素、文本、文档节点等)
常见使用场景示例
比如你有一份 XML 文档,包含多个 <article></article>,希望每个 article 输出为单独的 HTML 文件:
<xsl:for-each select="articles/article">
<xsl:result-document href="output/article-{position()}.html">
<html>
<body>
<h1><xsl:value-of select="title"/></h1>
<p><xsl:value-of select="content"/></p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/ai/2303" title="维普科创助手"><img
src="https://img.php.cn/upload/ai_manual/001/246/273/175764730134033.png" alt="维普科创助手"></a>
<div class="aritcle_card_info flexColumn">
<a href="/ai/2303" title="维普科创助手">维普科创助手</a>
<p>AI驱动的一站式科研资源服务平台</p>
</div>
<a href="/ai/2303" title="维普科创助手" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div>
</body>
</html>
</xsl:result-document>
</xsl:for-each>
注意:href 中的路径支持动态构造(如用 concat()、replace()、position() 或 @id),便于按数据特征命名文件。
注意事项与限制
多个 xsl:result-document 可以共存,但需确保目标 URI 不冲突;重复写入同一 URI 的行为由处理器定义(Saxon 默认覆盖,部分处理器可能报错)。
- 不能在
xsl:template的匹配模式中直接嵌套xsl:result-document作为顶层指令 —— 它必须出现在模板体内部、且不在 XPath 表达式中 - 若需生成目录页(如 index.html),建议先用变量或临时树收集元信息,再统一生成,避免顺序依赖问题
- 文件路径中的特殊字符(如空格、中文)应使用
encode-for-uri()处理,例如:href="output/{encode-for-uri(@title)}.html" - Saxon 支持
method="xhtml"等格式控制,但需提前定义对应xsl:output name="xhtml"
调试与路径定位技巧
输出路径默认相对于“启动转换时的工作目录”,不是 XSLT 文件所在目录。若不确定路径效果,可先用 xsl:message 打印实际 href 值:
<xsl:message>Writing to: <xsl:value-of select="@href"/></xsl:message>
也可用 resolve-uri(@href) 查看解析后的绝对 URI,辅助排查路径错误。









