如何避免xsltproc转换DocBook XML时重复生成HTML代码?
解决DocBook XSL转换中文本重复与
渲染问题 问题根源
你遇到的重复问题,大概率是自定义<description>模板中同时使用了<xsl:value-of select="."/>和<xsl:apply-templates/>:
<xsl:value-of select="."/>会提取<description>下所有文本节点的内容(包括子标签里的文本)<xsl:apply-templates/>会递归处理所有子节点(比如<code>),再次输出文本内容,最终导致重复
而注释掉<xsl:apply-templates/>后,子节点(如<code>)无法被DocBook默认模板处理,自然没法渲染成代码格式。
解决方案1:正确自定义<description>模板
如果需要给<description>添加自定义结构(比如外层容器),同时保留子节点的默认渲染逻辑,只需要去掉多余的<xsl:value-of>,只保留<xsl:apply-templates/>处理子节点:
<xsl:template match="description">
<!-- 自定义外层容器 -->
<div class="custom-description">
<!-- 仅处理子节点,交给默认模板渲染(包括<code>) -->
<xsl:apply-templates select="node()"/>
</div>
</xsl:template>
解决方案2:复用默认模板逻辑
如果只是想在默认<description>处理基础上扩展(比如加额外样式),可以用<xsl:next-match/>调用默认模板,再包裹自定义结构:
<xsl:template match="description">
<div class="description-wrapper">
<!-- 调用DocBook默认的description模板处理逻辑 -->
<xsl:next-match/>
</div>
</xsl:template>
验证方法
- 用
xsltproc重新转换XML:xsltproc --output output.html your-custom.xsl your-docbook.xml
- 查看生成的HTML:
<description>内的文本无重复<code>标签会被渲染成<code>或<pre>格式(取决于DocBook默认模板配置)
内容的提问来源于stack exchange,提问作者tohoyn
相关产品推荐
相关产品推荐

