如何指示fo:block跨页

时间:2019-05-23 02:22:07

标签: xsl-fo

我有一个fo:block,它可能跨越一个页面。我想在该块所在的第一页底部放置一些类似“续”的文字。

源文档在标记内具有一系列

我看到的唯一方法是在正确的位置在源文档中添加一个下一页继续,但是在编写文档时需要不断进行编辑。

是否要测试以查看某个块是否跨越页面?

源文档:

<recipe page-break="auto">
  <instructions>
    <step>The first thing to do</step>
    <step>The second thing to do</step>
  </instructions>
<recipe>

样式表的相关部分:

<xsl:template match="recipe">
  <xsl:variable name="pbi"><xsl:choose><xsl:when test="@page-break"><xsl:value-of select="@page-break"/></xsl:when><xsl:otherwise>avoid</xsl:otherwise></xsl:choose></xsl:variable>
  <xsl:variable name="pbb"><xsl:choose><xsl:when test="@page-break">always</xsl:when><xsl:otherwise>auto</xsl:otherwise></xsl:choose></xsl:variable>
  <fo:block page-break-inside="{$pbi}" page-break-before="{$pbb}" margin-bottom="1.5em">
    <xsl:apply-templates select="instructions/step" mode="plain"/>
  </fo:block>
</xsl:template>

谢谢。

2 个答案:

答案 0 :(得分:2)

虽然Tony的建议有效,但仅适用于支持该构造的格式化程序。正如他的建议,将纯标记插入页脚中也可以做到这一点。您可能对内容末尾和页脚之间的垂直空间的控制较少,但这取决于您的内容。

您只需在页脚区域使用检索标记,例如:

    <fo:static-content flow-name="footer">
        <fo:block-container text-align="left" margin-left="1in">
            <fo:block><fo:retrieve-marker retrieve-class-name="continued" retrieve-boundary="page" retrieve-position="last-starting-within-page"/>
            </fo:block>
        </fo:block-container>
    </fo:static-content>

现在,在流程中,您有一些块,当该块中断页面时,您希望消息出现在该块中。您使用类似这样的内容:

 <fo:block-container>
    <fo:marker marker-class-name="continued">I am continued on next page ...</fo:marker>
    <fo:block margin-top="6pt">I am some text that will break across the page somewhere. When I do break the footer should have continued. I am some text that will break across the page somewhere. When I do break the footer should have continued. </fo:block>
 <!-- More content here, whatever you need -->

 </fo:block-container>
 <fo:block-container keep-with-previous.within-page="always">
     <fo:marker marker-class-name="continued"></fo:marker>
 </fo:block-container>

块容器内的第一个标记将创建一个带有所需连续文本的“标记”。如果页面在该块内中断,则标记将被拖入页脚区域。第二个标记可以有效地“清除”它,因为它没有内容。它被拉到页脚,但为空白,因此什么也没有出现。

结果是这样的,没有继续的文本存在(第1、3、4页),除非页面在用连续的消息标记的区域(第2页)内中断。

enter image description here

答案 1 :(得分:1)

使用标记。将所有内容都放在fo:table中,然后在fo:retrieve-table-marker中使用fo:table-footer(请参阅https://www.w3.org/TR/xsl11/#fo_retrieve-table-marker),或者在fo:retrieve-marker中将fo:static-content用于{{ 1}}。区别在于,使用fo:region-after方法时,“继续”指示可以立即显示在页面上的最后一个文本之后(如本例中所示),而不是使用{{1 }}方法。

Formatted sample

fo:table

如果您可以解决FOP中已记录(固定的表布局,检索到的标记不能更改块级数)和未记录(对放置{{1}的位置感到困惑)的情况,则可以对FOP执行fo:retrieve-marker方法},必须将<fo:table table-layout="fixed"> <fo:table-footer> <fo:retrieve-table-marker retrieve-class-name="footer-continued" retrieve-position-within-table="last-ending"/> </fo:table-footer> <fo:table-body> <fo:table-row> <fo:marker marker-class-name="footer-continued"> <fo:table-row> <fo:table-cell padding="3pt"> <fo:block text-align="right" font-style="italic">continued.....</fo:block> </fo:table-cell> </fo:table-row> </fo:marker> <fo:table-cell padding="3pt"> <fo:block>The first thing to do</fo:block> </fo:table-cell> </fo:table-row> ... <fo:table-row> <fo:marker marker-class-name="footer-continued" /> <fo:table-cell padding="3pt"> <fo:block>The fourth thing to do</fo:block> </fo:table-cell> </fo:table-row> </fo:table-body> </fo:table> 移至fo:retrieve-table-marker)限制:

fo:retrieve-table-marker