如何根据XSL-FO中的页码显示一个或另一个信息



我使用XSL-FO来创建PDF。现在我有了一个标签,我想只在第一页显示,还有一个标签,我想在所有其他页面上显示,例如

第1页

Last month's balance

第2页- n

Previous page's balance

整个PDF实际上只是一个简单的表格,所以这不是关于数据之外的封面页。我该怎么做呢?

请参阅这个相关问题:如何在XSL-FO中对表中每页的一些值求和?

这可以使用fo:marker和fo:retrieve-marker(来自fo:static-content)来实现,也可以借助fo:page-sequence-master来实现,后者为第一页(@page-position="first")和其他页面(="rest")提供不同的fo:simple-page-master条目。

对于后一种情况,您需要在不同的simple-page-master上以不同的方式命名静态区域,并在fo:page-sequence中为每个page-master提供一个fo:static-content。

我没有尝试过Michael Sulyaev关于page-sequence-master的建议。然而,使用<fo:marker/><fo:retrieve-marker/>似乎有效。我不确定这是否是有效的XSL-FO解决方案,但它适用于Apache。

根据w3.org规范,<fo:retrieve-marker/><fo:static-content/>的后代似乎很重要。它不能是表本身的一部分

<fo:static-content flow-name="xsl-region-before">
  <fo:table>
    <!-- Render <fo:table-column/> elements -->
    <xsl:call-template name="TableColumns"/>
    <!-- fo:table-body, fo:table-row, fo:table-cell, fo:block 
         omitted for the example -->
    <fo:retrieve-marker retrieve-class-name="carryover-label"/>
  </fo:table>
</fo:static-content>

然后,<fo:marker/>元素被定位到数据表本身:

<fo:flow flow-name="xsl-region-body">
  <fo:table>
    <!-- Render the same <fo:table-column/> elements -->
    <xsl:call-template name="TableColumns"/>
    <fo:table-body>
      <xsl:for-each select="/data-path">
        <!-- fo:table-row, fo:table-cell, fo:block 
             omitted for the example -->
        <xsl:choose>
          <xsl:when test="position() = 1">
            <fo:marker marker-class-name="carryover-label">
              Last month's balance</fo:marker>
          </xsl:when>
          <xsl:otherwise>
            <fo:marker marker-class-name="carryover-label">
              Last page's balance</fo:marker>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:for-each>
    </fo:table-body>
  </fo:table>
</fo:flow>

现在这两个表只需要精确地放在另一个表的上面。对于我的问题,这是一个有效的解决方案。

最新更新