You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:00:55