简体   繁体   中英

XSL-FO page-number 2a, 2b

In my XSL-FO: I need to show the page numbers in the footer.

  • My page layout is normally: page 1, 2, 3, 4, 5.
  • Sometimes page 2 is replaced by 2a and 2b, and so the flow should be: 1, 2a, 2b, 3, 4, 5.
  • Pages 2a and 2b are just extended pages of page 2. Page 2 shows two tables. Page 2a is the first table (extended) on one page, and page 2b is the second table (extended) on another page.

What I need:
When the two tables should be on separate pages, show these pages numbers as 2a and 2b, otherwise when the two tables should be on one page, show Page 2.

Will I need an additional <fo:simple-page-master> and <fo:conditional-page-master-reference> for this this? If so, I am not sure how to organize it, nor how to get the page numbers shown as 2a and 2b. I know you can use this for letters: <fo:page-number format="a"/> .

This XML flag determines what should be printed. If "1" is here, then page 2a and 2b should be printed, and if "0" is here, then page 2 should be printed.

<PAGE2FLAG>1</PAGE2FLAG>

Thank you for your help!

Here's my stylesheet:

<xslt:stylesheet xmlns:xslt="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xslt:output method="xml" indent="yes" encoding="utf-8"/>
<xslt:param name="XFTemplateName">Document</xslt:param>
<xsl:template match="/">
    <fo:root>
        <fo:layout-master-set>
            <fo:simple-page-master master-name="first-page" page-width="8.5in" page-height="11in">
                <fo:region-body region-name="xsl-region-body" column-count="2" margin="0.4in 0.4in 0.4in 0.4in"/>
                <fo:region-before region-name="xsl-region-before" display-align="after" extent="0.7in"/>
                <fo:region-after region-name="xsl-region-after" extent="0.7in"/>
                <fo:region-start region-name="xsl-region-start" extent="0.7in"/>
                <fo:region-end region-name="xsl-region-end" extent="0.7in"/>
            </fo:simple-page-master>
            <fo:simple-page-master master-name="other-page" page-width="8.5in" page-height="11in">
                <fo:region-body region-name="xsl-region-body" column-count="2" margin="0.4in 0.4in 0.4in 0.4in"/>
                <fo:region-before region-name="xsl-region-before" display-align="after" extent="0.7in"/>
                <fo:region-after region-name="xsl-region-after-other" extent="0.7in"/>
                <fo:region-start region-name="xsl-region-start" extent="0.7in"/>
                <fo:region-end region-name="xsl-region-end" extent="0.7in"/>
            </fo:simple-page-master>                
            <fo:page-sequence-master master-name="default">
                <fo:repeatable-page-master-alternatives maximum-repeats="no-limit">
                    <fo:conditional-page-master-reference page-position="first" master-reference="first-page"/>
                    <fo:conditional-page-master-reference master-reference="other-page"/>
                </fo:repeatable-page-master-alternatives>
            </fo:page-sequence-master>
        </fo:layout-master-set>
        <fo:page-sequence master-reference="default" font-family="Helvetica">
            <fo:static-content flow-name="xsl-region-before">
                <fo:block start-indent="-20.000pt" end-indent="-20.000pt">&#xa0;</fo:block>
            </fo:static-content>
            <xslt:comment> FIRST PAGE ONLY FOOTER </xslt:comment>
            <fo:static-content flow-name="xsl-region-after">
                <fo:block start-indent="-20.000pt" end-indent="-20.000pt">
                    <fo:block text-align-last="justify">
                        <fo:inline font-size="8pt">DOCUMENT</fo:inline>
                        <fo:inline font-size="14pt">
                            <xslt:comment> BARCODE GOES HERE </xslt:comment>
                        </fo:inline>
                        <fo:leader leader-pattern="space"/>
                        <fo:inline font-size="8pt">
                            PAGE <fo:page-number format="1"/> OF 5                  
                            · FORM ID #<xsl:value-of select="XMLDOC/FORMID"/>
                        </fo:inline>
                    </fo:block>
                </fo:block>
            </fo:static-content>
            <xslt:comment> ALL OTHER PAGES FOOTER </xslt:comment>
            <fo:static-content flow-name="xsl-region-after-other">
                <fo:block start-indent="-20.000pt" end-indent="-20.000pt">
                    <fo:block text-align-last="justify">
                        <fo:inline font-size="8pt">DOCUMENT</fo:inline> 
                        <fo:inline font-size="14pt">&#xa0;</fo:inline>
                        <fo:leader leader-pattern="space"/>
                        <fo:inline font-size="8pt">
                            PAGE <fo:page-number format="1"/> OF 5              
                            · FORM ID #<xsl:value-of select="XMLDOC/FORMID"/>
                        </fo:inline>
                    </fo:block>
                </fo:block>
            </fo:static-content>                
            <fo:static-content flow-name="xsl-region-start">
                <fo:block> </fo:block>
            </fo:static-content>
            <fo:static-content flow-name="xsl-region-end">
                <fo:block> </fo:block>
            </fo:static-content>
            <fo:flow flow-name="xsl-region-body">
                <fo:block>
                    <xslt:comment> THIS IS PAGE 1 </xslt:comment>
                </fo:block>
                <fo:block break-before="page"/>

                <fo:block>
                    <fo:table>
                        <xslt:comment> PAGE 2 (First Table) </xslt:comment>
                    </fo:table>                     
                </fo:block>

                <xsl:if test="XMLDOC/PAGE2FLAG = 1">
                    <xslt:comment> This IF and BREAK separates the two tables into two pages. </xslt:comment>
                    <xslt:comment> These are the two pages that I want Page 2a and Page 2b. </xslt:comment>
                    <xslt:comment> In my printout, they are being shown as Page 2 and Page 3. </xslt:comment>
                    <fo:block break-before="page"/>
                </xsl:if>                   

                <fo:block>
                    <fo:table>
                        <xslt:comment> PAGE 2 (Second Table) </xslt:comment>
                    </fo:table>                     
                </fo:block>

                <fo:block break-before="page"/>                 
                <fo:block>
                    <xslt:comment> THIS IS PAGE 3 </xslt:comment>
                </fo:block>

                <fo:block break-before="page"/>                     
                <fo:block>
                    <xslt:comment> THIS IS PAGE 4 </xslt:comment>
                </fo:block>

                <fo:block break-before="page"/>                 
                <fo:block>
                    <xslt:comment> THIS IS PAGE 5 </xslt:comment>
                </fo:block>             
            </fo:flow>
        </fo:page-sequence>
    </fo:root>
</xsl:template>

As per @Jean-François Savard suggestion, I have added <fo:retrieve-marker> and <fo:marker> into my code.

Note that in the produced FO file each <fo:marker> must be the first child of a <fo:block> , or you will get the error "fo:marker" must be declared before "(%block;)" .

My issue has been resolved: it's working how I want it, with either page 2 or page 2a and 2b showing properly.

<xslt:stylesheet xmlns:xslt="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xslt:output method="xml" indent="yes" encoding="utf-8"/>
<xslt:param name="XFTemplateName">Document</xslt:param>
<xsl:template match="/">
    <fo:root>
        <fo:layout-master-set>
            <fo:simple-page-master master-name="first-page" page-width="8.5in" page-height="11in">
                <fo:region-body region-name="xsl-region-body" column-count="2" margin="0.4in 0.4in 0.4in 0.4in"/>
                <fo:region-before region-name="xsl-region-before" display-align="after" extent="0.7in"/>
                <fo:region-after region-name="xsl-region-after" extent="0.7in"/>
                <fo:region-start region-name="xsl-region-start" extent="0.7in"/>
                <fo:region-end region-name="xsl-region-end" extent="0.7in"/>
            </fo:simple-page-master>
            <fo:simple-page-master master-name="other-page" page-width="8.5in" page-height="11in">
                <fo:region-body region-name="xsl-region-body" column-count="2" margin="0.4in 0.4in 0.4in 0.4in"/>
                <fo:region-before region-name="xsl-region-before" display-align="after" extent="0.7in"/>
                <fo:region-after region-name="xsl-region-after-other" extent="0.7in"/>
                <fo:region-start region-name="xsl-region-start" extent="0.7in"/>
                <fo:region-end region-name="xsl-region-end" extent="0.7in"/>
            </fo:simple-page-master>                
            <fo:page-sequence-master master-name="default">
                <fo:repeatable-page-master-alternatives maximum-repeats="no-limit">
                    <fo:conditional-page-master-reference page-position="first" master-reference="first-page"/>
                    <fo:conditional-page-master-reference master-reference="other-page"/>
                </fo:repeatable-page-master-alternatives>
            </fo:page-sequence-master>
        </fo:layout-master-set>
        <fo:page-sequence master-reference="default" font-family="Helvetica">
            <fo:static-content flow-name="xsl-region-before">
                <fo:block start-indent="-20.000pt" end-indent="-20.000pt">&#xa0;</fo:block>
            </fo:static-content>
            <xslt:comment> FIRST PAGE ONLY FOOTER </xslt:comment>
            <fo:static-content flow-name="xsl-region-after">
                <fo:block start-indent="-20.000pt" end-indent="-20.000pt">
                    <fo:block text-align-last="justify">
                        <fo:inline font-size="8pt">DOCUMENT</fo:inline>
                        <fo:inline font-size="14pt">
                            <xslt:comment> BARCODE GOES HERE </xslt:comment>
                        </fo:inline>
                        <fo:leader leader-pattern="space"/>
                        <fo:inline font-size="8pt">
                            PAGE <fo:retrieve-marker retrieve-class-name="page_number"/> OF 5
                        </fo:inline>
                    </fo:block>
                </fo:block>
            </fo:static-content>
            <xslt:comment> ALL OTHER PAGES FOOTER </xslt:comment>
            <fo:static-content flow-name="xsl-region-after-other">
                <fo:block start-indent="-20.000pt" end-indent="-20.000pt">
                    <fo:block text-align-last="justify">
                        <fo:inline font-size="8pt">DOCUMENT</fo:inline> 
                        <fo:inline font-size="14pt">&#xa0;</fo:inline>
                        <fo:leader leader-pattern="space"/>
                        <fo:inline font-size="8pt">
                            PAGE <fo:retrieve-marker retrieve-class-name="page_number"/> OF 5
                        </fo:inline>
                    </fo:block>
                </fo:block>
            </fo:static-content>                
            <fo:static-content flow-name="xsl-region-start">
                <fo:block> </fo:block>
            </fo:static-content>
            <fo:static-content flow-name="xsl-region-end">
                <fo:block> </fo:block>
            </fo:static-content>
            <fo:flow flow-name="xsl-region-body">
                <fo:marker marker-class-name="page_number">1</fo:marker>
                <fo:block>
                    <xslt:comment> THIS IS PAGE 1 </xslt:comment>
                </fo:block>
                <fo:block break-before="page"/>

                <fo:block>
                    <xsl:if test="XMLDOC/PAGE2FLAG = 0">
                        <fo:marker marker-class-name="page_number">2</fo:marker>
                    </xsl:if>
                    <xsl:if test="XMLDOC/PAGE2FLAG = 1">
                        <fo:marker marker-class-name="page_number">2a</fo:marker>
                    </xsl:if>
                    <fo:table>
                        <xslt:comment> PAGE 2 (First Table) </xslt:comment>
                    </fo:table>                     
                </fo:block>

                <xsl:if test="XMLDOC/PAGE2FLAG = 1">
                    <xslt:comment> This IF and BREAK separates the two tables into two pages. </xslt:comment>
                    <xslt:comment> These are the two pages that I want Page 2a and Page 2b. </xslt:comment>
                    <xslt:comment> In my printout, they are being shown as Page 2 and Page 3. </xslt:comment>
                    <fo:block break-before="page"/>
                </xsl:if>                   

                <fo:block>
                    <xsl:if test="XMLDOC/PAGE2FLAG = 0">
                        <fo:marker marker-class-name="page_number">2</fo:marker>
                    </xsl:if>
                    <xsl:if test="XMLDOC/PAGE2FLAG = 1">
                        <fo:marker marker-class-name="page_number">2b</fo:marker>
                    </xsl:if>
                    <fo:table>
                        <xslt:comment> PAGE 2 (Second Table) </xslt:comment>
                    </fo:table>                     
                </fo:block>

                <fo:block break-before="page"/>                 
                <fo:block>
                    <fo:marker marker-class-name="page_number">3</fo:marker>
                    <xslt:comment> THIS IS PAGE 3 </xslt:comment>
                </fo:block>

                <fo:block break-before="page"/>
                    <fo:marker marker-class-name="page_number">4</fo:marker>
                    <xslt:comment> THIS IS PAGE 4 </xslt:comment>
                </fo:block>

                <fo:block break-before="page"/>
                    <fo:marker marker-class-name="page_number">5</fo:marker>
                    <xslt:comment> THIS IS PAGE 5 </xslt:comment>
                </fo:block>             
            </fo:flow>
        </fo:page-sequence>
    </fo:root>
</xsl:template>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM