Apache FOP中fo:table-row的padding-top属性失效问题求助
Apache FOP中fo:table-row的padding-top属性无效问题解决办法
环境配置
- JDK v17
- Apache FOP v2.9
- Saxon HE v12.3
- XSLT 3.0
问题情况
给fo:table-row设置padding-top="15pt"后,属性完全被忽略。参考Data2Type的德语文档显示此操作可行,但实际测试无效;将padding-top移到fo:table-cell上则能正常生效,且生成的FO代码里确实包含fo:table-row的padding-top="15pt"属性,但依旧无效果。
无效代码示例
<xsl:template match="OrderLines"> <fo:table table-layout="fixed" width="100%" border="solid 1pt"> <fo:table-column column-width="18mm"/> <fo:table-column/> <fo:table-body> <xsl:for-each select="OrderLine"> <fo:table-row padding-top="15pt"> <fo:table-cell> <fo:block>SKU</fo:block> </fo:table-cell> <fo:table-cell> <fo:block>Qty</fo:block> </fo:table-cell> </fo:table-row> </xsl:for-each> </fo:table-body> </fo:table> </xsl:template>
有效代码示例
<xsl:template match="OrderLines"> <fo:table table-layout="fixed" width="100%" border="solid 1pt"> <fo:table-column column-width="18mm"/> <fo:table-column/> <fo:table-body> <xsl:for-each select="OrderLine"> <fo:table-row> <fo:table-cell padding-top="15pt"> <fo:block>SKU</fo:block> </fo:table-cell> <fo:table-cell padding-top="15pt"> <fo:block>Qty</fo:block> </fo:table-cell> </fo:table-row> </xsl:for-each> </fo:table-body> </fo:table> </xsl:template>
生成的FO代码片段
<fo:table-row padding-top="15pt"> <fo:table-cell> <fo:block>SKU</fo:block> </fo:table-cell> <fo:table-cell> <fo:block>Qty</fo:block> </fo:table-cell> </fo:table-row>
解决办法
- 规范适配:XSL-FO 1.1官方规范中,
fo:table-row并不支持padding属性,该属性仅对fo:table-cell等元素有效。Data2Type的文档描述可能存在误导,或针对其他FO处理器的特殊实现。 - 批量设置单元格padding:如果不想逐个给单元格加属性,可以用XSLT简化操作:
- 循环为行内所有单元格统一添加属性:
<fo:table-row> <xsl:for-each select="OrderLine/*"> <fo:table-cell padding-top="15pt"> <fo:block><xsl:value-of select="."/></fo:block> </fo:table-cell> </xsl:for-each> </fo:table-row> - 定义复用模板:
<xsl:template match="OrderLine/*" mode="cell-top-padding"> <fo:table-cell padding-top="15pt"> <fo:block><xsl:value-of select="."/></fo:block> </fo:table-cell> </xsl:template> <!-- 调用模板 --> <fo:table-row> <xsl:apply-templates select="OrderLine/*" mode="cell-top-padding"/> </fo:table-row>
- 循环为行内所有单元格统一添加属性:
- 替代方案:space-before属性:若要实现整行上方间距,可给
fo:table-row设置space-before="15pt",这是fo:table-row支持的标准属性,效果类似:<fo:table-row space-before="15pt"> <!-- 单元格内容 --> </fo:table-row>
内容的提问来源于stack exchange,提问作者Dave The Dane
相关产品推荐
相关产品推荐

