XSL-FO在表行上保持一致,结果很奇怪

时间:2017-04-14 05:29:26

标签: xsl-fo

我想将某些元素放在一起。据我所知,最好的方法是

keep-with-next="always"

在桌面上。

它似乎没有像我想象的那样工作。我建立了一个非常基本的测试:

<fo:table-row>
  <fo:table-cell>
    <fo:block>70</fo:block>
  </fo:table-cell>
</fo:table-row>
<fo:table-row>
  <fo:table-cell>
    <fo:block>71</fo:block>
  </fo:table-cell>
</fo:table-row>
<fo:table-row>
  <fo:table-cell>
    <fo:block>72</fo:block>
  </fo:table-cell>
</fo:table-row>
<fo:table-row>
  <fo:table-cell>
    <fo:block>73</fo:block>
  </fo:table-cell>
</fo:table-row>

导致以下分页符:

enter image description here

现在我想将第71和72行保持在一起。

我试图把

keep-with-next="always"
第71行

。我希望第71行被推到下一页。实际发生的是,第70行也被推倒了。这是不需要的,只是以不同的方式将布局分开(另一个应该保持在一起的块是分开的。)

enter image description here

如何将71号线和72号线保持在一起,而单独留下70号线?

1 个答案:

答案 0 :(得分:0)

您获得的结果不一定是错误,因为格式化程序可以根据需要自由选择分页符,只要它们尊重输入中表示的约束:在您的示例中,行# 71和#72确实按要求保持在一起。

但是,您可以使用 中断属性 强制在第70行和第71行之间分页:

<fo:table-row break-after="page">
  <fo:table-cell>
    <fo:block>70</fo:block>
  </fo:table-cell>
</fo:table-row>
<fo:table-row>
  <fo:table-cell>
    <fo:block>71</fo:block>
  </fo:table-cell>
</fo:table-row>

(或在下一行使用break-before="page"

格式化程序必须尊重所有中断属性 尽可能多的保留属性 ({{3}部分在XSL-FO建议书中),这应该产生所需的输出;如果没有,格式化器肯定有一个错误。

关于你写的东西的另一个观察:

  

这是不需要的,只是以不同的方式将布局分开(另一个应该保持在一起的块是分开的。)

如果确实应该将某些内容保持在一起,我认为最好使用保持属性从开头在输入中显式设置该约束,而不是迭代地添加越来越多的属性,直到你得到了理想的结果。