我使用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>
现在这两个表只需要精确地放在另一个表的上面。对于我的问题,这是一个有效的解决方案。