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

DITA OT HTML转换时按章节创建文件夹并移动关联文件的实现方法

DITA-OT 按章节拆分输出HTML及资源实现方案

基于你提供的bookmap结构和DITA-OT 3.4.1版本环境,可通过以下两种方案实现按章节创建文件夹、分类存储HTML和关联图片的需求:


方案1:修改XSLT模板控制输出路径(推荐)

该方案直接调整DITA-OT原生转换逻辑,无需额外后处理,适配性更强:

  1. 新建自定义DITA-OT插件,或在现有自定义HTML转换插件中新增XSLT文件,例如xsl/custom-output-path.xsl
  2. 重写生成HTML文件名的核心模板,识别每个topic所属的父级chapter,将chapter的navtitle作为上级目录,示例代码如下:
<xsl:template match="*[contains(@class, ' topic/topic ')]" mode="generate-html-filename">
  <xsl:variable name="chapter" select="ancestor-or-self::*[contains(@class, ' bookmap/chapter ')][1]"/>
  <xsl:variable name="chapter-dir">
    <xsl:choose>
      <xsl:when test="$chapter">
        <!-- 替换navtitle中的非法文件名字符,空格转下划线,删除特殊符号 -->
        <xsl:value-of select="replace(replace($chapter/topicmeta/navtitle, '\s+', '_'), '[^\w\u4e00-\u9fa5\-]', '')"/>
        <xsl:text>/</xsl:text>
      </xsl:when>
      <xsl:otherwise/>
    </xsl:choose>
  </xsl:variable>
  <!-- 拼接最终输出路径 -->
  <xsl:value-of select="concat($chapter-dir, replace(@href, '\.xml$', '.html'))"/>
</xsl:template>
  1. 同步重写图片复制的模板,将topic引用的图片输出到对应章节目录下,同时修改HTML中img标签的src属性,匹配新的资源路径。
  2. 在插件的plugin.xml中注册该XSLT文件,使其在HTML转换时覆盖默认模板即可。

方案2:ANT脚本后处理(改造成本低)

如果不想修改DITA-OT原生转换逻辑,可以通过ANT脚本对默认输出的文件做二次整理:

  1. 先正常运行DITA-OT HTML转换,将所有文件输出到临时目录,例如./temp_html_out
  2. 新增ANT处理任务,读取bookmap解析章节与下属topic的对应关系,示例脚本片段如下:
<target name="split-by-chapter">
  <!-- 读取bookmap提取章节信息 -->
  <xmlproperty file="your-bookmap.ditamap" keepRoot="false"/>
  <for list="${chapter.navtitle}" param="chapter-title">
    <sequential>
      <!-- 创建章节文件夹,处理非法字符 -->
      <var name="dir-name" value="${replace(replace(@{chapter-title}, '\s+', '_'), '[^\w\u4e00-\u9fa5\-]', '')}"/>
      <mkdir dir="./output/${dir-name}"/>
      <!-- 移动对应章节的HTML文件 -->
      <move todir="./output/${dir-name}">
        <fileset dir="./temp_html_out">
          <filename name="**/${chapter[navtitle=@{chapter-title}]//topicref/@href/.replace('.xml', '.html')}"/>
        </fileset>
      </move>
      <!-- 移动对应章节的图片资源 -->
      <move todir="./output/${dir-name}">
        <fileset dir="./temp_html_out">
          <present targetdir="./temp_html_out">
            <mapper type="glob" from="*.html" to="*.{png,jpg,gif,svg}"/>
          </present>
        </fileset>
      </move>
    </sequential>
  </for>
</target>
  1. 运行该ANT任务即可得到按章节拆分的输出目录。

注意事项

  • 处理章节名称时一定要做非法字符过滤,避免Windows、Linux等不同操作系统的文件名兼容问题
  • 如果存在跨章节引用的公共图片,建议单独存放到根目录的images公共文件夹,避免重复复制多份
  • DITA-OT 3.4.1默认HTML5转换的模板优先级为0,自定义模板需要设置更高的priority属性确保生效

内容的提问来源于stack exchange,提问作者Rahul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:39:04