首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fo:内联容器元素的XSL-FO溢出处理

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

Stack Overflow用户
提问于 2016-02-25 12:59:42
回答 1查看 3.6K关注 0票数 1

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

我的问题是:如果iherit内容对当前页面太长,如何才能将fo:inline-container中的内容(例如,fo:块元素)分解到新页面?

已使用的Fomatters: AHF 6.2,Apache FOP 2.1

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

下面是一个简短的代码摘录:

代码语言:javascript
复制
<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:内联容器,但并没有进入新的页面。我认为这与周围的fo:块元素有关,该元素将所有内容保存在一个页面上。

任何建议在这里都是有帮助的。提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-25 21:48:17

什么起作用

使用fo:列表块

(好吧,你说你不想用这个把戏.无论如何,这是可行的,可以作为最后的手段使用)

您可以将边框放在fo:list-item-label中,将“普通”文本放在fo:list-item-body中。

代码语言:javascript
复制
        <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:块容器

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

代码语言:javascript
复制
        <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行,则会导致边缘溢出到页面底部边距或重叠下一个边距,其中X是对应的普通文本的orphans属性(例如,边框有三行长,而普通文本有orphans="2")。

什么不起作用

使用fo:浮子

即使FOP支持侧浮动,我也不认为使用它们会达到预期的输出,因为文本会在它周围流动,返回到使用所有可用的水平空间:

代码语言:javascript
复制
        <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>

使用fo:内联容器

我认为问题中的代码不像预期的那样工作,这不是因为外部fo:block中缺少了什么,而是因为包含长文本的fo:inline-container中缺少了什么:overflow属性。

如果未指定,则其默认值为"auto",这意味着格式化对象处理器可以随心所欲地执行(即使溢出也可能显示内容)。在使用overflow="repeat"时,如果需要,处理器应该创建其他区域,以便将内容拆分为页面:

代码语言:javascript
复制
        <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>

然而,不支持overflow="repeat" (我不能用Antenna进行测试,但一致性页表示支持)。

(披露:我是一名不活动的FOP开发人员)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35628056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档