Как отобразить ту или иную информацию в зависимости от номера страницы в XSL-FO? - PullRequest
0 голосов
/ 28 октября 2011

Я использую XSL-FO для создания PDF.Теперь у меня есть метка, которую я хочу отобразить только на первой странице, и другая метка, которую я хочу отобразить на всех других страницах, например,

Page 1

Last month's balance

Page 2 -n

Previous page's balance

Весь PDF на самом деле является простой таблицей, поэтому речь идет не о титульной странице, которая находится вне данных.Как я могу это сделать?

См. Также этот связанный вопрос: Как можно суммировать некоторые значения на страницу в таблице в XSL-FO?

Ответы [ 2 ]

2 голосов
/ 31 октября 2011

Я не пробовал Предложение Михаила Суляева о master-sequence-master по этой проблеме. Однако использование <fo:marker/> и <fo:retrieve-marker/>, похоже, сработало. Я не уверен, является ли это допустимым решением XSL-FO, но оно работает с Apache fop.

Представляется важным, что <fo:retrieve-marker/> является потомком <fo:static-content/>, согласно спецификации w3.org . Он не может быть частью самой таблицы.

<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>

Теперь две таблицы должны располагаться ровно одна поверх другой. Для моей проблемы это правильный обходной путь.

2 голосов
/ 28 октября 2011

Этого можно достичь либо с помощью fo: marker и fo: retrieve-marker (из fo: static-content), либо с помощью fo: page-sequence-master, который предоставляет различные fo: simple-page- основные записи для первой страницы (@ page-position = "first") и других страниц (= "rest").

В последнем случае вам необходимо по-разному называть статические области на разных простых мастерах страниц и указывать fo: static-content в fo: page-sequence для каждого мастера страниц.

...