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

时间:2011-10-28 14:46:55

标签: xslt xsl-fo apache-fop

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

Page 1

Last month's balance

Page 2 - n

Previous page's balance

整个PDF实际上只是一个简单的表,所以这不是一个站在数据之外的封面。我该怎么办?

另请参阅此相关问题:How can I sum up some values per page in a table in XSL-FO?

2 个答案:

答案 0 :(得分:2)

这个可以使用fo:marker和fo:retrieve-marker(来自fo:static-content),或者在fo:page-sequence-master的帮助下实现,它提供了不同的fo:simple-page-第一页的主条目(@ page-position =“first”)和其他页面(=“rest”)。

在后一种情况下,您需要以不同的方式在不同的simple-page-masters上命名静态区域,并在每个页面母版的fo:page-sequence中提供fo:static-content。

答案 1 :(得分:2)

我没有尝试Michael Sulyaev's suggestion about page-sequence-master来解决这个问题。但是,使用<fo:marker/><fo:retrieve-marker/>似乎有效。我不确定这是否是一个有效的XSL-FO解决方案,但它适用于Apache fop。

根据w3.org specification<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>

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