经Apache FOP与Ant转DocBook的CALS表格表头旋转参数失效求解
解决CALS表格表头旋转90度但参数被忽略的问题
首先咱们得捋清楚问题根源:你用的<?dbfo?>处理指令本身没问题,但大概率是放置位置不对、XSL转换时没保留这些指令,或是没配合正确的表格属性让FO处理器识别。下面给你几个落地可行的方案:
方案1:调整dbfo指令位置+配合entry属性优化
dbfo指令必须放在<entry>的内容内部,同时给entry设置对齐和垂直对齐属性,避免旋转后内容偏移。试试这种写法:
<table frame="all"> <title>Title</title> <tgroup cols="3"> <thead> <!-- 移除valign="bottom",旋转后这个属性的方向会混乱,换成middle让内容居中 --> <row> <entry align="center" valign="middle"> <?dbfo orientation="90"?> <?dbfo rotated-width="1in"?> 表头1 </entry> <entry align="center" valign="middle"> <?dbfo orientation="90"?> <?dbfo rotated-width="1in"?> 表头2 </entry> <entry align="center" valign="middle"> <?dbfo orientation="90"?> <?dbfo rotated-width="1in"?> 表头3 </entry> </row> </thead> <!-- 表格内容节点... --> </tgroup> </table>
方案2:直接用DocBook扩展的CALS表格属性
多数DocBook转FO的转换器(比如Apache FOP、XEP)支持直接在<entry>上设置rotate和rotated-width属性,比处理指令更稳定可靠:
<entry rotate="90" rotated-width="1in" align="center" valign="middle">表头1</entry>
这种写法不需要额外的处理指令,转换器会直接识别属性并生成旋转的FO内容。
方案3:确保XSL转换保留处理指令
如果你的XSL文件是用来生成DocBook的,要检查XSLT模板在处理<entry>节点时,没有过滤掉内部的处理指令。比如你的模板应该保留processing-instruction()节点,而不是只复制文本内容。参考示例模板:
<xsl:template match="entry"> <entry> <!-- 复制entry的所有属性 --> <xsl:copy-of select="@*"/> <!-- 复制entry下所有子节点,包括处理指令 --> <xsl:copy-of select="node()"/> </entry> </xsl:template>
额外注意点
- 确认FO处理器版本:比如Apache FOP 2.0+对旋转表格内容的支持比较完善,旧版本可能存在兼容性bug。
rotated-width值要合理:这个参数是旋转后表头占据的水平宽度(对应原状态下的高度),设置过小会导致表头内容被截断。
试试上面的方案,应该能解决参数被忽略的问题。
内容的提问来源于stack exchange,提问作者Johannes M.
相关产品推荐
相关产品推荐

