Xslt fo:table中的孤儿和寡妇控制fo:table单元格中的分页符

Xslt fo:table中的孤儿和寡妇控制fo:table单元格中的分页符,xslt,pdf-generation,xsl-fo,apache-fop,Xslt,Pdf Generation,Xsl Fo,Apache Fop,当使用单元格中包含大量文本的表格时,我面临一个样式问题。有时文本不幸被分页符隔开。如下图所示,第3行的第1段被分页符分开 我们需要的是将第3行第1行与本段其余部分一起放到下一页 我们尝试使用“孤儿”和“寡妇”等属性,但这些属性在表单元格中似乎没有任何效果。我们还尝试使用带有keep-together属性的block,但段落可能大于一页,因此内容会被截断。我们唯一能想到的另一件事是在一行的前几段中使用fo:blocks使用keep with next。但这看起来草率、复杂,更像是一种经验估计 我

当使用单元格中包含大量文本的表格时,我面临一个样式问题。有时文本不幸被分页符隔开。如下图所示,第3行的第1段被分页符分开

我们需要的是将第3行第1行与本段其余部分一起放到下一页

我们尝试使用“孤儿”和“寡妇”等属性,但这些属性在表单元格中似乎没有任何效果。我们还尝试使用带有keep-together属性的block,但段落可能大于一页,因此内容会被截断。我们唯一能想到的另一件事是在一行的前几段中使用fo:blocks使用keep with next。但这看起来草率、复杂,更像是一种经验估计

我已经整理了一个“最小”的例子,可以使用。我希望你能帮我解决问题。也许你也可以告诉我为什么“孤儿”和“寡妇”在这里不起作用

提前谢谢你

XML:


标题1
第1行第1段第1行
第1行第1段第2行
第1行第1段第3行
第1行第1段第4行
第1行第1段第5行

第1行第2段第1行 第1行第2段第2行 第1行第2段第3行 第1行第2段第4行

标题1 第2行第1段第1行 第2行第1段第2行 第2行第1段第3行 第2行第1段第4行 第2行第1段第5行

第2行第2段第1行 第2行第2段第2行 第2行第2段第3行 第2行第2段第4行 第2行第2段第5行 第2行第2段第6行 第2行第2段第7行

标题1 第3行第1段第1行 第3行第1段第2行 第3行第1段第3行 第3行第1段第4行 第3行第1段第5行

第3行第2段第1行 第3行第2段第2行 第3行第2段第3行 第3行第2段第4行

XSL



EDIT将p标记添加到xml输入中。我发布了错误的xml版本。

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


第2行第1段第1行
第2行第1段第2行
第2行第1段第3行
第2行第1段第4行
第2行第1段第5行

第2行第2段第1行 第2行第2段第2行 第2行第2段第3行 第2行第2段第4行 第2行第2段第5行 第2行第2段第6行 第2行第2段第7行

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

如果这也是您的意图,那么还需要保留换行符


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

我很好奇为什么这个问题被标记为
xslt
-这真的是一个关于转换过程的问题吗,或者只是关于生成什么XSL-FO?我想xslt中可能有计算字符或手动计算分页符的功能。。。虽然这看起来比其他任何事情都复杂。很公平,我只是想知道。你需要保持在一排的块中。寡妇和孤儿不是一个关于表格的概念,而是一个关于段落和在页面末尾将行保持在一起的概念。如果您的输入数据如您所示,那么您需要对其进行解析,并通过理解作为空行的中断来构建单独的块元素。或者通过在对象(段落)周围添加标记来修复(荒谬的)输入数据。。。输入中的“p”标记在哪里?我懂了。。。UH没有。我在编辑中更正了输入数据。我发布了错误版本的xml示例。很抱歉我们试着用积木把它们保持在一起。遗憾的是,这些段落可能比一整页还大。内容将被切断。在重新审视这个问题时。您使用表格进行此操作有什么原因吗?您正在将其格式化为表,而这些表只有一行。为什么?边界?边框也适用于块,您可以将标题格式化为块,其余行格式化为块。使用“保持在标题上”使其与下面的块保持一致,然后使用“寡妇和孤儿”。感谢您跟上我的步伐。我们正在生成的“报告”相当复杂。我从其他人那里接手了这项任务,我猜他有HTML思维
<?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>
<?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>
    <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>