XSL FO表行标题内容被粉碎

时间:2013-10-06 17:03:59

标签: xslt xsl-fo apache-fop

我正在创建一个xsl fo表,它将具有不同数量的列。该应用程序使用Apache FOP显示转换后的文档。当列数较少时,一切都显示正常(即单元格的内容居中并完整显示,尽管有些列最终会占用两行,因为文本会换行)。但是,有些表有超过12列,这就是出现问题的地方:在列标题单元格中,列的名称一直是单元格右侧的多行。它看起来像是包装,但即使最后两个字符似乎也被切断了。该文本没有泄漏到相邻的单元格中。

这是输入xml文件,在这种情况下,为了简洁起见,它是表头的一行和主体的一行。我没有包含xsl文档中引用的图表元素,因为该部分正确显示:

<exports>
   <export>
     <table>
        <tblRow>
            <hdrCell>Month</hdrCell>
            <hdrCell>Allow Amt PEPM Med</hdrCell>
            <hdrCell>Allow Amt PEPM Rx</hdrCell>
            <hdrCell>Allow Amt PEPM Med and Rx</hdrCell>
            <hdrCell>Allow Amt PMPM Med</hdrCell>
            <hdrCell>Allow Amt PMPM Rx</hdrCell>
            <hdrCell>Allow Amt PMPM Med and Rx</hdrCell>
            <hdrCell>Employees Avg Med or Rx</hdrCell>
            <hdrCell>Members Avg Med or Rx</hdrCell>
            <hdrCell>Net Pay PEPM Med</hdrCell>
            <hdrCell>Net Pay PEPM Rx</hdrCell>
            <hdrCell>Net Pay PEPM Med and Rx</hdrCell>
            <hdrCell>Net Pay PMPM Med</hdrCell>
            <hdrCell>Net Pay PMPM Rx</hdrCell>
            <hdrCell>Net Pay PMPM Med and Rx</hdrCell>
        </tblRow>
        <tblRow>
            <tblCell>Jan 2010</tblCell>
            <tblCell>11</tblCell>
            <tblCell>202</tblCell>
            <tblCell>213</tblCell>
            <tblCell>26</tblCell>
            <tblCell>30</tblCell>
            <tblCell>56</tblCell>
            <tblCell>56</tblCell>
            <tblCell>44</tblCell>
            <tblCell>11</tblCell>
            <tblCell>22</tblCell>
            <tblCell>33</tblCell>
            <tblCell>12</tblCell>
            <tblCell>12</tblCell>
            <tblCell>24</tblCell>
            <tblCell>1</tblCell>
        </tblRow>

    </table>
</export>

这是将输入文件转换为xsl fo的xsl文件。我是xsl的新手。

<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
   xmlns:fo="http://www.w3.org/1999/XSL/Format">
   <xsl:output method="xml" indent="yes"/>
   <xsl:template match="/">
   <fo:root>
         <fo:layout-master-set>
             <fo:simple-page-master master-name="exportPage">
                 <fo:region-body />
             </fo:simple-page-master>
         </fo:layout-master-set>
         <fo:page-sequence master-reference="exportPage">
             <fo:flow flow-name="xsl-region-body">
                  <fo:block id="chartBlock">
                          <!-- THIS PART WORKS FINE -->
                  </fo:block>
                 <!-- THE PROBLEM PART -->
                 <fo:block id="tableBlock" margin="0.25in">
                        <xsl:apply-templates select="exports/export/table"/>
                 </fo:block>
             </fo:flow>
        </fo:page-sequence>
    </fo:root>

</xsl:template>
    <!-- Creates the table -->
    <xsl:template match="table">
        <fo:table table-layout="fixed" width="100%" >
            <fo:table-header>
                <fo:table-row>
                    <xsl:apply-templates select="tblRow[position() = 1]"/>
                </fo:table-row>
            </fo:table-header>
            <fo:table-body>
                <xsl:apply-templates select="tblRow[position() > 1]"/>
            </fo:table-body>
        </fo:table>
    </xsl:template>

    <xsl:template match="hdrCell">
        <fo:table-cell background-color="#666" border-right-style="solid" border-right-width="1px" border-right-color="white" empty-cells="show">
            <fo:block color="white" font-family="arial, helvetica, sans-serif" font-size="xx-small"><xsl:value-of select="."/></fo:block>
        </fo:table-cell>
    </xsl:template>

    <xsl:template match="tblCell">
   <fo:table-cell border-bottom-style="solid" border-bottom-width="1px"
   border-bottom-color="#E3E3E3">
   <fo:block color="#7E7E7E" font-family="arial, helvetica, sans-serif" font-                                                size="xx-small"><xsl:value-of select="."/></fo:block>
        </fo:table-cell>
    </xsl:template >

    <xsl:template match="tblRow[position() > 1]">
        <fo:table-row>
            <xsl:apply-templates />
        </fo:table-row>
    </xsl:template>

 </xsl:stylesheet>

我已经尝试为每个table-cell的块元素设置padding right属性,希望它将文本向左移动无效。我已经尝试调整每个块元素的'width'属性,该元素是table-cell的子元素。我一般都是xsl的新手,所以我不确定如何继续。指定具有特定宽度的元素会有帮助吗?我该怎么做才能确保表格的整个宽度显示在pdf中并且没有这个混乱,截断的单元格内容?此外,所有单位都在未指定的'px'。

提前致谢,

布氏

1 个答案:

答案 0 :(得分:2)

答案:从周围的区块中移除margin =“0.25in”会产生我认为您期望的结果(当然除了该区块的边距)。要清楚,改变这个:

<fo:block id="tableBlock" margin="0.25in">
      <xsl:apply-templates select="exports/export/table"/>
</fo:block>

并删除margin =“0.25in”。

注意:这不是您从其他格式化程序获得的结果。我在您的原始文件中使用了RenderX,您得到了您期望的结果和正确的结果。我使用了FOP并获得了不正确的结果,但是删除了那个缩进(显然这种缩进在某种程度上不正确地继承到了表格单元的一个维度)。

另外一个注意事项:样本中有15个标题单元格和16个单元格。