XSLT作为XML转换的核心技术,除了将单个XML文档转换为单个输出文件外,还支持通过xsl:result-document指令生成多个独立的输出文件,这在需要拆分数据、按模块输出内容的场景中非常实用。

xsl:result-document的基本语法
xsl:result-document是XSLT 2.0引入的指令,必须作为<xsl:stylesheet>或<xsl:transform>的子元素或嵌套在其他XSLT指令内部使用,基本结构如下:
<xsl:result-document href="输出文件路径" format="输出格式名称">
<!-- 输出内容 -->
</xsl:result-document>
其中href属性指定输出文件的路径和名称,format属性可选,用于引用<xsl:output>定义的输出格式,若不指定则使用默认的输出格式。
核心属性说明
| 属性名 | 作用说明 |
|---|---|
| href | 必填属性,指定输出文件的URI路径,支持相对路径和绝对路径,相对路径基于当前XSLT转换的执行目录 |
| format | 可选属性,值为<xsl:output>元素的name属性值,用于指定该输出文件的格式规则 |
| validation | 可选属性,指定输出内容的验证模式,可选值为strict、lax、preserve、strip |
基础使用示例
假设我们有一个存储学生信息的XML文件,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student id="1">
<name>张三</name>
<class>一班</class>
<score>90</score>
</student>
<student id="2">
<name>李四</name>
<class>二班</class>
<score>85</score>
</student>
<student id="3">
<name>王五</name>
<class>一班</class>
<score>92</score>
</student>
</students>
我们需要将每个学生的信息生成单独的一个HTML文件,同时生成一个包含所有学生列表的总文件,对应的XSLT代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 定义默认输出格式为HTML -->
<xsl:output method="html" encoding="UTF-8"/>
<!-- 匹配根节点,生成总列表文件 -->
<xsl:template match="/">
<html>
<head>
<title>学生总列表</title>
</head>
<body>
<h1>所有学生信息</h1>
<ul>
<xsl:for-each select="students/student">
<li>
<a href="student_{@id}.html">
<xsl:value-of select="name"/>
</a>
</li>
<!-- 生成单个学生的详情文件 -->
<xsl:result-document href="student_{@id}.html">
<html>
<head>
<title>
<xsl:value-of select="name"/>的详情页
</title>
</head>
<body>
<h1>
<xsl:value-of select="name"/>的信息
</h1>
<p>班级:<xsl:value-of select="class"/></p>
<p>分数:<xsl:value-of select="score"/></p>
</body>
</html>
</xsl:result-document>
</xsl:for-each>
</ul>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
执行上述XSLT转换后,会生成一个index.html总列表文件,以及student_1.html、student_2.html、student_3.html三个学生详情文件,实现了多文件输出。
按条件生成不同格式的文件
xsl:result-document还支持结合条件判断生成不同格式的输出文件,比如我们可以将一班学生的信息输出为XML格式,二班学生的信息输出为HTML格式:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!-- 定义XML格式输出 -->
<xsl:output name="xmlFormat" method="xml" encoding="UTF-8"/>
<!-- 定义HTML格式输出 -->
<xsl:output name="htmlFormat" method="html" encoding="UTF-8"/>
<xsl:template match="/students">
<xsl:for-each select="student">
<xsl:choose>
<xsl:when test="class='一班'">
<xsl:result-document href="class1_student_{@id}.xml" format="xmlFormat">
<student_info>
<student_id>
<xsl:value-of select="@id"/>
</student_id>
<student_name>
<xsl:value-of select="name"/>
</student_name>
<student_score>
<xsl:value-of select="score"/>
</student_score>
</student_info>
</xsl:result-document>
</xsl:when>
<xsl:when test="class='二班'">
<xsl:result-document href="class2_student_{@id}.html" format="htmlFormat">
<html>
<body>
<p>学生ID:<xsl:value-of select="@id"/></p>
<p>学生姓名:<xsl:value-of select="name"/></p>
<p>学生分数:<xsl:value-of select="score"/></p>
</body>
</html>
</xsl:result-document>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
注意事项
- xsl:result-document仅支持XSLT 2.0及以上版本,使用XSLT 1.0的处理器无法识别该指令
- href属性指定的路径需要保证目录存在,否则会抛出文件写入异常
- 不要在xsl:result-document内部再嵌套xsl:result-document,部分处理器不支持多层嵌套的多文件生成
- 如果输出文件路径中包含中文,需要确保处理器的编码配置正确,避免出现乱码问题
使用xsl:result-document时,建议先测试小批量数据的转换效果,确认输出路径和格式符合预期后再处理大规模数据,避免生成大量无效文件占用存储空间。
XSLTxsl:result-documentXML多文件生成XSLT转换修改时间:2026-06-16 04:12:41