如何在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,建议创建自定义插件扩展预处理流程:
- 在插件目录下创建
plugin.xml:
<plugin id="com.yourcompany.updatemap"> <feature extension="dita.conductor.target.relative" file="integrator.xml"/> </plugin>
- 创建
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
相关产品推荐
相关产品推荐

