You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

解决办法

  1. 规范适配:XSL-FO 1.1官方规范中,fo:table-row并不支持padding属性,该属性仅对fo:table-cell等元素有效。Data2Type的文档描述可能存在误导,或针对其他FO处理器的特殊实现。
  2. 批量设置单元格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>
      
  3. 替代方案: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:40:18