fo中的孤儿和寡妇:用于控制fo:table-cell内的分页符的表

时间:2013-10-10 20:36:50

标签: xslt pdf-generation xsl-fo apache-fop

在单元格中使用包含大量文本的表格时,我遇到了样式问题。不幸的是,文本被分页符分开。如下图所示, row3 中的 paragraph1 除以分页符。

Unfortunate page-break within the cells of **row3**

我们需要的是 row3 paragraph1 line1 与段落的其余部分一起放到下一页。

我们尝试使用“孤儿”和“寡妇”之类的属性,但这些属性似乎对表格单元格没有任何影响。我们还尝试使用带有保持在一起属性的块,但段落可能大于一个页面,以便内容被切断。我们可以提出的唯一另一件事是使用 keep-with-next 和我们在行的前几段使用的fo:blocks。但这看起来很草率,复杂,更像是经验法则。

我已经整理了一个可以使用http://www.utilities-online.info/foprender/进行测试的“最小”示例。我希望你能帮我解决问题。也许你也可以告诉我为什么“孤儿”和“寡妇”似乎在这里不起作用。

提前谢谢!

XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <item>
        <heading>head1</heading>
        <description>
            <p>row1 paragraph1 line1
            row1 paragraph1 line2
            row1 paragraph1 line3
            row1 paragraph1 line4
            row1 paragraph1 line5</p>

            <p>row1 paragraph2 line1
            row1 paragraph2 line2
            row1 paragraph2 line3
            row1 paragraph2 line4</p>
        </description>
    </item>
    <item>
        <heading>head1</heading>
        <description>
            <p>row2 paragraph1 line1
            row2 paragraph1 line2
            row2 paragraph1 line3
            row2 paragraph1 line4
            row2 paragraph1 line5</p>

            <p>row2 paragraph2 line1
            row2 paragraph2 line2
            row2 paragraph2 line3
            row2 paragraph2 line4
            row2 paragraph2 line5
            row2 paragraph2 line6
            row2 paragraph2 line7</p>
        </description>
    </item>
    <item>
        <heading>head1</heading>
        <description>
            <p>row3 paragraph1 line1
            row3 paragraph1 line2
            row3 paragraph1 line3
            row3 paragraph1 line4
            row3 paragraph1 line5</p>

            <p>row3 paragraph2 line1
            row3 paragraph2 line2
            row3 paragraph2 line3
            row3 paragraph2 line4</p>
        </description>
    </item>
</root>

XSL

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">
    <xsl:output encoding="UTF-8" indent="yes" method="xml" standalone="no" omit-xml-declaration="no"/>

    <xsl:template match="//root">
        <fo:root language="DE">
            <fo:layout-master-set>
                <fo:simple-page-master master-name="A4-landscape" page-height="21cm" page-width="29.7cm" margin-top="5mm" margin-bottom="5mm" margin-left="5mm" margin-right="5mm">
                    <fo:region-body margin-top="25mm" margin-bottom="20mm"/>
                    <fo:region-before region-name="xsl-region-before" extent="25mm" display-align="before" precedence="true"/>
                </fo:simple-page-master>
            </fo:layout-master-set>
            <fo:page-sequence master-reference="A4-landscape">
                <fo:flow reference-orientation="0" border-collapse="collapse" flow-name="xsl-region-body">
                    <fo:table>
                        <fo:table-column column-width="80%"/>
                        <fo:table-body>
                            <xsl:apply-templates select="item"/>
                        </fo:table-body>
                    </fo:table>
                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>

    <xsl:template match="item">
        <fo:table-row>
            <fo:table-cell border="solid">
                <fo:block>
                    <xsl:value-of select="heading"/>
                </fo:block>
                <fo:block linefeed-treatment="preserve" orphans="4" widows="4">
                    <xsl:apply-templates select="description"/>
                </fo:block>
            </fo:table-cell>
        </fo:table-row>
    </xsl:template>

    <xsl:template match="//description/p">
        <fo:inline><xsl:value-of select="text()"/></fo:inline>
    </xsl:template>
</xsl:stylesheet>

编辑将p-tag添加到xml输入中。我发布了错误的xml版本。

1 个答案:

答案 0 :(得分:1)

根据您的输入,您可能会运气不好,除非数据完全一样,并且您尝试一些递归来将数据分隔为空白行。如果您的数据是这样的(这与您的XSL相匹配,但您没有“p”元素):

    <description>
        <p>row2 paragraph1 line1
        row2 paragraph1 line2
        row2 paragraph1 line3
        row2 paragraph1 line4
        row2 paragraph1 line5</p>
        <p>row2 paragraph2 line1
        row2 paragraph2 line2
        row2 paragraph2 line3
        row2 paragraph2 line4
        row2 paragraph2 line5
        row2 paragraph2 line6
        row2 paragraph2 line7</p>
    </description>

然后您可以将“保持”设置为“p”级别以将内容保持在一起。因为您的输入没有,所以您需要编写一个创建单独块的模板,并对作为description元素的子节点的一个text()节点应用保留。

如果这也是你的意图,它还需要保留换行符。

好的,现在如果您的数据真的是写的(带有换行符和最终输出中的单独行),则将每行放入一个表行并使用位置来确定您希望保留的几个在一起。