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

如何在DITA OT预处理前动态更新DITAMAP的topicref元素

DITA OT 3.7.1 预处理前动态更新topicref 解决步骤

1. 校验XSL模板的正确性

确保XSL模板能正确匹配并修改topicref元素,同时保留地图的其他结构和属性。示例模板如下:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <!-- 保留ditamap根元素的完整结构 -->
  <xsl:template match="ditamap">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 匹配目标topicref并修改属性,比如替换href -->
  <xsl:template match="topicref[@href='old-topic.dita']">
    <xsl:copy>
      <xsl:attribute name="href">new-topic.dita</xsl:attribute>
      <!-- 保留除href外的其他属性和子节点 -->
      <xsl:apply-templates select="@*[name()!='href']|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 默认模板:复制所有未匹配的节点和属性 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

2. 正确配置updatemap Target

你的Target必须调用DITA OT内置的xslt任务,将修改后的地图输出到预处理临时目录(后续预处理步骤会从该目录读取文件)。示例配置:

<target name="updatemap" depends="preprocess.init">
  <xslt in="${args.input}" 
        out="${dita.temp.dir}/${map.root.file}" 
        style="path/to/your/updatemap.xsl">
    <!-- 可添加自定义参数,比如动态传递修改规则 -->
    <param name="custom-param" select="'your-value'"/>
  </xslt>
</target>
  • 关键参数:${dita.temp.dir}是DITA OT内置的临时目录变量,${map.root.file}代表输入地图的文件名,确保输出路径与预处理的读取路径一致。

3. 调整preprocess Target的依赖顺序

必须保证updatemap在preprocess.init之后、其他核心预处理子任务(如map-validate、topic-fetch)之前执行,否则修改会晚于预处理的文件读取步骤。正确的依赖配置:

<target name="preprocess" depends="preprocess.init, updatemap, map-validate, topic-fetch, map-link, ..."/>

4. 验证修改效果

运行构建时添加-v参数查看详细日志,确认updatemap任务已执行,同时检查临时目录(默认是项目根目录下的temp文件夹)中的地图文件,确认topicref已被正确修改。示例构建命令:

dita -f xhtml -i your-map.ditamap -v

5. 推荐:使用自定义插件扩展(避免修改核心文件)

不要直接修改DITA OT安装目录下的核心build_preprocess.xml,建议创建自定义插件扩展预处理流程:

  1. 在插件目录下创建plugin.xml:
<plugin id="com.yourcompany.updatemap">
  <feature extension="dita.conductor.target.relative" file="integrator.xml"/>
</plugin>
  1. 创建integrator.xml重定义preprocess目标:
<target name="preprocess" depends="preprocess.init, updatemap, original.preprocess"/>
<!-- 导入原始预处理目标 -->
<import file="${dita.plugin.org.dita.base.dir}/build_preprocess.xml"/>
<!-- 定义你的updatemap Target -->
<target name="updatemap" depends="preprocess.init">
  <xslt in="${args.input}" out="${dita.temp.dir}/${map.root.file}" style="xsl/updatemap.xsl"/>
</target>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:31:32