fo:内联容器元素的XSL-FO溢出处理

时间:2016-02-25 12:59:42

标签: xslt stylesheet xslt-2.0 xsl-fo

fo:内联容器元素的XSL-FO溢出处理

我的问题是:如果iherit内容如何可以将 fo:inline-container 中的内容(例如 fo:block 元素)分解为新页面现在太长了吗?

二手Fomatters:AHF 6.2,Apache FOP 2.1

  • 转换必须适用于两种格式化程序;因此,使用fo:float元素的简单解决方案是不可能的。

这是一个简短的代码提取:

<xsl:template match="myElement">
    <fo:block>
        <fo:inline-container inline-progression-dimension="33.333%">
            <fo:block>
                Marginalia Headline
            </fo:block>
        </fo:inline-container>

        <fo:inline-container inline-progression-dimension="66.666%">
            <fo:block>
                Imagine this is a very long text ...
            </fo:block>
            <fo:block>
                Imagine this is a very long text ...
            </fo:block>
            <fo:block>
                Imagine this is a very long text ...
            </fo:block>
            <!-- MANY MORE fo:blocks -->
        </fo:inline-container>
    </fo:block>
</xsl:template>

问题是,内容溢出了fo:inline-container,但没有打破新页面。我认为这与周围的fo:block 元素有关,它将所有内容保存在一个页面上。

任何建议在这里都会有所帮助。提前谢谢!

1 个答案:

答案 0 :(得分:2)

什么有效

使用fo:list-block

(好吧,你说过你不想使用这个技巧......无论如何这都有用,可以作为最后的手段使用)

您可以将旁注纳入fo:list-item-label和&#34;正常&#34; fo:list-item-body中的文字:

        <fo:list-block provisional-distance-between-starts="33.333%">
            <fo:list-item>
                <fo:list-item-label end-indent="label-end()">
                    <fo:block>
                        Marginalia Headline
                    </fo:block>
                </fo:list-item-label>
                <fo:list-item-body start-indent="body-start()">
                    <fo:block>
                        Lorem ipsum dolor ...
                    </fo:block>
                    <!-- other blocks ... -->
                </fo:list-item-body>
            </fo:list-item>
        </fo:list-block>

使用溢出的fo:block-container

或者,您可以使用更平坦的格式化对象序列,将边缘放入零高度块容器,以便下面的普通文本块将以相同的高度开始:

        <fo:block-container height="0pt" overflow="visible" keep-with-next.within-page="always">
            <fo:block end-indent="66.666%">
                Marginalia Headline
            </fo:block>
        </fo:block-container>
        <fo:block start-indent="33.333%">
            Lorem ipsum dolor ...
        </fo:block>
        <!-- other blocks ... -->

请注意,此解决方案可能导致边缘溢出到页面底部边距或重叠下一个边缘,如果它产生多于X行,其中X是其相应正常文本的orphans属性(例如, marginalia长三行,而普通文本有orphans="2")。

什么不起作用

使用fo:float

即使FOP支持侧浮动,我也不认为使用它们会实现所需的输出,因为文本会绕过它,返回使用所有可用的水平空间:

        <fo:block>
            <fo:float float="left">
                <fo:block width="33.333%" background-color="#AAFFFF">Marginalia Headline</fo:block>
            </fo:float>
            <fo:block background-color="#FFAAFF">
                Lorem ipsum dolor ...
            </fo:block>
            <!-- other blocks ... -->
        </fo:block>

output using floats

使用fo:inline-container

我认为问题中的代码没有按预期工作,不是因为外部fo:block中缺少某些内容,而是因为包含长文本的fo:inline-container中缺少某些内容:{{1属性。

如果未指定,则其默认值为overflow,这意味着格式化对象处理器可以按照自己的喜好进行操作(即使溢出也可能显示内容)。使用"auto"处理器应根据需要创建其他区域,以便将内容拆分为页面:

overflow="repeat"

然而,FOP 支持 <fo:block> <fo:inline-container inline-progression-dimension="33.333%"> <fo:block> Marginalia Headline </fo:block> </fo:inline-container><fo:inline-container inline-progression-dimension="66.666%" overflow="repeat"> <fo:block> Lorem ipsum dolor ... </fo:block> <!-- other blocks ... --> </fo:inline-container> </fo:block> (我无法使用Antenna House XslFormatter进行测试,但conformance page表示支持它。)

(披露:我是非活跃的FOP开发者)

相关问题