如何通过XSLT级联结构(result-document)生成递归章节多文件?
使用XSLT递归生成嵌套章节的多文件输出
嘿,这个需求我熟得很!用XSLT的<xsl:result-document>配合递归模板就能完美实现——既可以生成对应每个章节的XML文件,还能轻松处理无限嵌套的递归结构。下面给你一套直接能用的方案:
假设的规范输入XML结构
先把你给出的递归结构调整成标准XML格式(原写法不符合XML语法),这里假设每个章节节点用chapter标签,通过number属性标识章节编号:
<root> <chapter number="1"> <content>Chapter 1的相关信息</content> <chapter number="1.1"> <content>Chapter 1.1的相关信息</content> <chapter number="1.1.1"> <content>Chapter 1.1.1的相关信息</content> </chapter> <content>Chapter 1.1的其他相关信息</content> </chapter> <chapter number="1.2"> <content>Chapter 1.2的相关信息</content> <chapter number="1.2.1"> <content>Chapter 1.2.1的相关信息</content> </chapter> </chapter> <content>Chapter 1的其他相关信息</content> </chapter> </root>
实现的XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- 匹配根节点,启动递归处理流程 --> <xsl:template match="/root"> <xsl:apply-templates select="chapter"/> </xsl:template> <!-- 处理每个chapter节点的核心递归模板 --> <xsl:template match="chapter"> <!-- 生成当前章节对应的XML文件 --> <xsl:result-document method="xml" encoding="UTF-8" href="chapter_{@number}.xml"> <chapter> <number><xsl:value-of select="@number"/></number> <!-- 提取当前章节的内容(自动排除子chapter节点) --> <xsl:copy-of select="node()[not(self::chapter)]"/> </chapter> </xsl:result-document> <!-- 递归处理当前章节的所有子chapter节点 --> <xsl:apply-templates select="chapter"/> </xsl:template> </xsl:stylesheet>
关键细节说明
- 递归逻辑:模板会先处理当前章节生成对应文件,再自动递归遍历所有子章节,完美适配你的嵌套结构。
- 文件命名:通过
chapter_{@number}.xml直接生成你需要的格式(比如chapter_1.xml、chapter_1.1.xml)。 - 内容隔离:用
node()[not(self::chapter)]确保每个文件只包含当前章节的内容,不会混入子章节的信息。 - 环境要求:这个方案需要支持XSLT 2.0及以上的处理器,比如Saxon(主流工具如Oxygen XML、Saxon-HE都支持)。
最终输出效果
运行后会在指定目录生成以下文件:
chapter_1.xml:包含Chapter 1的所有非子章节内容chapter_1.1.xml:包含Chapter 1.1的所有非子章节内容chapter_1.1.1.xml:包含Chapter 1.1.1的内容chapter_1.2.xml:包含Chapter 1.2的所有非子章节内容chapter_1.2.1.xml:包含Chapter 1.2.1的内容
如果你的输入XML结构和假设略有不同(比如章节编号是节点名而非属性),只需要调整模板里的@number部分即可,比如改成substring(local-name(), 8)(如果节点名是Chapter1、Chapter1.1这类格式)。
内容的提问来源于stack exchange,提问作者user3711142
相关产品推荐
相关产品推荐

