Search code examples
xmlpdf-generationxsl-fomarker

xsl:fo retrieve-marker not valid child


I need for my xsl:fo transformation an <fo:retrieve-marker> in an table but I don't know if this is possible because I use FOP Processor for my transformation.

If i use the <fo:retrieve-marker> in my table I always get an error message that the tag has to be in an static content.

Here is the table with the marker

                <xsl:call-template name="MMEL-Table-Header"/>

                <!-- Bottom table Line  -->
                <fo:table-footer>
                    <fo:table-row>
                        <fo:table-cell>                                                                             
                            <fo:marker marker-class-name="footer-continued"> <fo:inline>(continued)</fo:inline></fo:marker>
                        </fo:table-cell>
                    </fo:table-row>

                </fo:table-footer>

                <fo:table-body >               

                    <xsl:variable name="identification">
                        <xsl:value-of select="ident/message"/>                                 
                    </xsl:variable>                       
                    <xsl:apply-templates select="ident"><xsl:with-param name="ident" select="$identification"/></xsl:apply-templates>
                    <xsl:apply-templates select="provisos/proviso"><xsl:with-param name="ident" select="$identification"/></xsl:apply-templates>

                <fo:table-row>
                    <fo:table-cell> <fo:retrieve-marker retrieve-position="first-starting-within-page" retrieve-class-name="footer-continued" retrieve-boundary="document" /> </fo:table-cell>
                </fo:table-row>
                </fo:table-body>           
            </fo:table>          

Solution

  • (disclosure: I'm a FOP developer)

    This example has dynamic table header and table footer, so it should cover your requirements:

    • if the table fits in a single page, both table header and table footer are empty
    • if the table is split over several pages
      • the table header is empty for the first page, and in the following ones it says "(continued)"
      • the table footer is empty for the last page, and in the previous ones it says "(continues on the next page)"
    • tested with FOP 2.0 (older versions did not support table markers); due to FOP's current limitations, the non-breaking space &#x00A0; in the table header and table footer is a necessary "placeholder" (the header / footer dimensions are computed just once, without marker content)
    • no formatter-specific extensions, so this could work with other formatters too (XslFormatter supports table markers; XEP has alternative workarounds)

    FO fragment:

      <fo:table table-layout="fixed" width="100%">
        <fo:table-column column-width="100%"/>
        <fo:table-header>
          <fo:table-row>
            <fo:table-cell>
              <fo:block>
                <fo:retrieve-table-marker retrieve-class-name="mc1" 
                    retrieve-position-within-table="first-starting" 
                    retrieve-boundary-within-table="table-fragment"/>
                &#x00A0;
              </fo:block>
            </fo:table-cell>
          </fo:table-row>
        </fo:table-header>
        <fo:table-footer>
          <fo:table-row>
            <fo:table-cell>
              <fo:block>
                <fo:retrieve-table-marker retrieve-class-name="mc2" 
                    retrieve-position-within-table="last-ending" 
                    retrieve-boundary-within-table="table-fragment"/>
                &#x00A0;
              </fo:block>
            </fo:table-cell>
          </fo:table-row>
        </fo:table-footer>
        <fo:table-body>
          <!-- first row -->
          <fo:table-row>
            <fo:table-cell>
              <fo:block>
                <fo:marker marker-class-name="mc1"></fo:marker>
                <fo:marker marker-class-name="mc2">(continues on the next page)</fo:marker>
                cell1
              </fo:block>
            </fo:table-cell>
          </fo:table-row>
          <!-- middle row -->
          <fo:table-row>
            <fo:table-cell>
              <fo:block>
                <fo:marker marker-class-name="mc1">(continued)</fo:marker>
                <fo:marker marker-class-name="mc2">(continues on the next page)</fo:marker>
                cell2
              </fo:block>
            </fo:table-cell>
          </fo:table-row>
          <!-- ... other similar rows ... -->
          <!-- last row -->
          <fo:table-row>
            <fo:table-cell>
              <fo:block>
                <fo:marker marker-class-name="mc1">(continued)</fo:marker>
                <fo:marker marker-class-name="mc2"></fo:marker>
                cell9
              </fo:block>
            </fo:table-cell>
          </fo:table-row>
        </fo:table-body>
      </fo:table>