XSL-FO页面主机替代方案有时会耗尽

时间:2016-04-19 09:15:13

标签: xsl-fo

我有一些强大的书籍样式表。目前,我无法弄清楚问题出在哪里。我的样式表有时会起作用,有时候不起作用,这取决于TOC的长度,我可以根据我想要包含在其中的级别动态地改变它。

我的样式表以这种方式工作(我的意图是):

Imprints 部分在 Title-Page 上开始,在偶数页上结束,如果TOC的最后一页是奇数,则在那之后放一个空白页它:

        <fo:page-sequence-master master-name="Imprints">
            <fo:repeatable-page-master-alternatives>
                <fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank" page-position="any"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.Title-Page" odd-or-even="odd" page-position="first"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.CopyRight-Page" odd-or-even="even" page-position="rest"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.TOC" odd-or-even="odd" page-position="rest"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.TOC" odd-or-even="even" page-position="rest"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.TOC" odd-or-even="odd" page-position="last"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.TOC" odd-or-even="even" page-position="last"/>
            </fo:repeatable-page-master-alternatives>
        </fo:page-sequence-master>

让主要部分 Content-Pages 从TOC之后的第一个奇数页(或其后的空白页)开始,让每一章从前一章之后的奇数页开始(最后一页或空白)并以偶数页结束。如果最后一页应该是奇数,强制一个空白页面(这里我想可能是问题,因为我使用整个部分以及特定的章节):

        <fo:page-sequence-master master-name="Content-Pages">
            <fo:repeatable-page-master-alternatives>
                <fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" odd-or-even="odd" page-position="first"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank" page-position="any"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even" page-position="rest"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd" page-position="rest"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even" page-position="last"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd" page-position="last"/>
            </fo:repeatable-page-master-alternatives>
        </fo:page-sequence-master>

我这样打电话给他们(我不确定force-page-count="even"force-page-count="end-on-even"之间有什么区别。我查了一些文档,但我仍然不清楚):

    <fo:page-sequence master-reference="Imprints" force-page-count="even">
        <fo:flow flow-name="xsl-region-body">
            <fo:block>
                <xsl:apply-templates select="//tei:TEI/tei:teiHeader" mode="draft"/>
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
    <fo:page-sequence master-reference="PageMaster.CopyRight-Page">
        <fo:flow flow-name="xsl-region-body">
            <fo:block xsl:use-attribute-sets="p">
                © Copyright!
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
    <fo:page-sequence master-reference="PageMaster.TOC">
        <fo:flow flow-name="xsl-region-body">
            <fo:block>
                <xsl:apply-templates select="//tei:TEI/tei:text" mode="toc"/>
            </fo:block>
        </fo:flow>
    </fo:page-sequence>
    <xsl:for-each select="//tei:div[@n='1']">
        <fo:page-sequence master-reference="Content-Pages" force-page-count="end-on-even">
            <fo:static-content flow-name="Region-Before-Left">
                <fo:block xsl:use-attribute-sets="running-header-left">
                    <fo:inline xsl:use-attribute-sets="running-header-pageno-left">
                        <fo:page-number/>
                    </fo:inline>
                </fo:block>
            </fo:static-content><!-- Running header right -->
            <fo:static-content flow-name="Region-Before-Right">
                <fo:block xsl:use-attribute-sets="running-header-right">
                    <fo:inline xsl:use-attribute-sets="running-header-pageno-right">
                        <fo:page-number/>
                    </fo:inline>
                </fo:block>
            </fo:static-content>
            <fo:static-content flow-name="xsl-footnote-separator">
                <fo:block>
                    <fo:leader xsl:use-attribute-sets="footnote-separator"/>
                </fo:block>
            </fo:static-content>
            <fo:flow flow-name="xsl-region-body">
                <xsl:apply-templates select="."/>
            </fo:flow>
        </fo:page-sequence>
    </xsl:for-each>

如果它失败并抛出Subsequences exhausted in page-sequence-master "Content-Pages", cannot recover. (No context info available),则有助于更改force-page-count或向PageMaster.Page-Right.First添加另一个引用,并使其可以在even个页面上生效。有些章节有时会从奇数页开始,但有页码(不应该这样)。真的很混乱。

甚至添加:

<fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" odd-or-even="odd" page-position="rest"/>

......没有帮助。

我使用最后一个Saxon HE和Apache FOP 1.1。

更新

根据@Tony_Graham的进展:

        <fo:page-sequence-master master-name="Imprints">
            <fo:repeatable-page-master-alternatives>
                <fo:conditional-page-master-reference master-reference="PageMaster.Title-Page" odd-or-even="odd" page-position="first"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.CopyRight-Page" odd-or-even="even" page-position="rest"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.TOC"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
            </fo:repeatable-page-master-alternatives>
        </fo:page-sequence-master>
        <fo:page-sequence-master master-name="Content-Pages">
            <fo:repeatable-page-master-alternatives>
                <fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" odd-or-even="odd" page-position="first"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even" page-position="rest"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd" page-position="rest"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even" page-position="last"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd" page-position="last"/>
                <fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/>
            </fo:repeatable-page-master-alternatives>

其余的:

<fo:page-sequence master-reference="Imprints" force-page-count="end-on-even">
...

<fo:page-sequence master-reference="PageMaster.CopyRight-Page" initial-page-number="auto-odd">
...

1 个答案:

答案 0 :(得分:2)

force-page-count="end-on-even"放在fo:page-sequence 之前每个要在奇数页面上开始的fo:page-sequence。或者,在initial-page-number="auto-odd"上设置fo:page-sequence。见https://www.w3.org/TR/xsl11/#initial-page-number

force-page-count="even"表示如果页面序列在偶数页面上开始,则它将在奇数页面上结束以使其成为偶数页面,反之亦然,如果它在奇数页面上开始。无论页面序列是在奇数页还是偶数页上开始,force-page-count="end-on-even"都会在奇数页上完成。 (AH Formatter的扩展名以'double-even'结尾,除此之外,还强制整个文档的页数在偶数页上结束,等等。请参阅https://www.antennahouse.com/product/ahf63/ahf-ext.html#axf.force-page-count)但是,很可能{ {1}}会做你需要的。

此外:

  1. 您无需使用两个不同的initial-page-number重复fo:conditional-page-master-reference来选择相同的网页母版。这与odd-or-even一个fo:conditional-page-master-reference相同,因为默认值为odd-or-even。见https://www.w3.org/TR/xsl11/#odd-or-even
  2. 您可以删除显式any,因为这是默认值。
  3. “Imprints”有两个'odd-or-even =“even”page-position =“rest”',所以第二个永远不会被使用。
  4. 为奇数/偶数和休息/最后选择相同的“PageMaster.TOC”可以简化为page-position="any"
  5. <强>更新

    您可以将当前page-position="any"更改为:

    fo:page-sequence-master

    <fo:page-sequence-master master-name="Imprints"> <fo:repeatable-page-master-alternatives> <fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/> <fo:conditional-page-master-reference master-reference="PageMaster.Title-Page" page-position="first"/> <fo:conditional-page-master-reference master-reference="PageMaster.CopyRight-Page" odd-or-even="even" page-position="rest"/> <fo:conditional-page-master-reference master-reference="PageMaster.TOC"/> </fo:repeatable-page-master-alternatives> </fo:page-sequence-master> <fo:page-sequence-master master-name="Content-Pages"> <fo:repeatable-page-master-alternatives> <fo:conditional-page-master-reference master-reference="PageMaster.Blank" blank-or-not-blank="blank"/> <fo:conditional-page-master-reference master-reference="PageMaster.Page-Right.First" page-position="first"/> <fo:conditional-page-master-reference master-reference="PageMaster.Page-Left" odd-or-even="even"/> <fo:conditional-page-master-reference master-reference="PageMaster.Page-Right" odd-or-even="odd"/> </fo:repeatable-page-master-alternatives> 内,“从孩子序列开始按顺序测试条件”,因此您希望首先放置最不可能的替代品。 (参见https://www.w3.org/TR/xsl11/#fo_repeatable-page-master-alternatives)你也想在最后有一个全能的选择,但你已经覆盖了它。

    但是,当版权页面和ToC分别位于引用特定页面主页的单独页面序列中时,我不明白为什么“Imprints”包括“PageMaster.CopyRight-Page”和“PageMaster.TOC”。你可能想要更像的东西:

    fo:repeatable-page-master-alternatives