XSLT转换XML为DocBook时,表格特定元素无法输出
嘿,我碰到过不少类似的DocBook转换坑,尤其是处理复杂表格格式的时候。你说的这个<?dbhtml bgcolor="#EEEEEE" ?>处理指令输出不了的问题,核心原因是XSLT默认不会自动生成或保留这类处理指令——得手动在模板里明确处理才行,我给你几个实用的解决方案:
1. 直接在模板中生成目标处理指令
如果是要给特定单元格添加背景色PI,你可以用XSLT的<xsl:processing-instruction>元素主动生成。比如假设你匹配表格单元格的模板是这样的:
<xsl:template match="ns:td"> <entry> <!-- 生成dbhtml背景色处理指令 --> <xsl:processing-instruction name="dbhtml"> <xsl:text>bgcolor="#EEEEEE"</xsl:text> </xsl:processing-instruction> <!-- 输出单元格原有内容 --> <xsl:apply-templates/> </entry> </xsl:template>
这里要注意:<xsl:processing-instruction>的name属性对应PI的目标(也就是dbhtml),内部的文本就是PI的具体内容。如果需要动态判断(比如只有满足条件的单元格才加背景色),套个<xsl:if>或者<xsl:choose>就行。
2. 保留源XML中已有的处理指令
如果你的源XML里已经存在这些dbhtml PI,但转换时丢失了,那得加一个专门匹配处理指令的模板,让XSLT把它原样复制到输出里:
<xsl:template match="processing-instruction('dbhtml')"> <xsl:processing-instruction name="dbhtml"> <xsl:value-of select="."/> </xsl:processing-instruction> </xsl:template>
要是你的源PI带命名空间,记得在match里加上前缀,比如ns:processing-instruction('dbhtml')。
3. 注意几个细节
- 命名空间:你的模板里用到了
ns:c...这类带前缀的节点,一定要确保样式表开头已经正确声明了对应命名空间,比如:<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ns="http://你的源XML命名空间URL"> - 位置:DocBook的处理指令通常要紧跟在目标元素(比如
<entry>)的起始标签之后才会生效,别把PI放到单元格内容的末尾或者其他位置。 - 批量处理:复杂表格可以把添加PI的逻辑封装成模板,需要的时候调用,避免重复代码:
然后在单元格模板里调用:<xsl:template name="add-gray-bg"> <xsl:processing-instruction name="dbhtml">bgcolor="#EEEEEE"</xsl:processing-instruction> </xsl:template><xsl:call-template name="add-gray-bg"/>
内容的提问来源于stack exchange,提问作者Norbert
相关产品推荐
相关产品推荐

