XSL: FO Сохранить заголовок только для первой страницы - PullRequest
0 голосов
/ 11 октября 2019

У меня проблема с сохранением "region-before" только для первой страницы. Посмотрите мой код:

    <fo:layout-master-set>
            <fo:simple-page-master master-name="first" margin-right="0.5cm" margin-left="0.5cm" margin-bottom="0.5cm" margin-top="0.75cm" page-width="21cm" page-height="29.7cm">

                <fo:region-body region-name="xsl-region-body" margin-top="{$extra-body-margin-top+15.6-$header-margin}cm" margin-bottom="3.5cm" />
                <fo:region-before region-name="xsl-region-before"  extent="17cm" overflow="hidden" />
                <fo:region-after region-name="xsl-region-after" extent="2.8cm" overflow="hidden" />
            </fo:simple-page-master>
            <fo:page-sequence-master master-name="psmA">
                <fo:repeatable-page-master-alternatives>
                    <fo:conditional-page-master-reference master-reference="first" page-position="any" />
                </fo:repeatable-page-master-alternatives>
            </fo:page-sequence-master>

    </fo:layout-master-set>

Если я изменю позицию страницы = "first", и мой регион будет больше первой страницы, я получу ошибку. Моя идея состоит в том, чтобы держать регион-ранее только на первой странице, а регион-тело и регион-нижний колонтитул следуют за следующими страницами. Легко ли играть с моим кодом?

1 Ответ

1 голос
/ 11 октября 2019
  1. Установите вторую fo:simple-page-master, у которой нет fo:region-before.
  2. Добавьте вторую fo:conditional-page-master-reference, чтобы мастер страницы first использовался только на первой странице (используя page-position="first"), а для остальных страниц используется другой мастер страницы (используя page-position="any").

Это работает, потому что средство форматирования использует первую альтернативу, для которой выполняются все его условия (см. https://www.w3.org/TR/xsl11/#fo_repeatable-page-master-alternatives). Именно поэтому вы ставите тот, у которого page-position="any" последний, потому что это условие всегда верно.

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <fo:layout-master-set>
    <fo:simple-page-master master-name="first" margin-right="0.5cm" margin-left="0.5cm" margin-bottom="0.5cm" margin-top="0.75cm" page-width="21cm" page-height="29.7cm">

      <fo:region-body region-name="xsl-region-body" margin-top="1cm" margin-bottom="3.5cm" />
      <fo:region-before region-name="xsl-region-before"  extent="17cm" overflow="hidden" />
      <fo:region-after region-name="xsl-region-after" extent="2.8cm" overflow="hidden" />
    </fo:simple-page-master>
    <fo:simple-page-master master-name="rest" margin-right="0.5cm" margin-left="0.5cm" margin-bottom="0.5cm" margin-top="0.75cm" page-width="21cm" page-height="29.7cm">

      <fo:region-body region-name="xsl-region-body" margin-top="1cm" margin-bottom="3.5cm" />
    </fo:simple-page-master>
    <fo:page-sequence-master master-name="psmA">
      <fo:repeatable-page-master-alternatives>
        <fo:conditional-page-master-reference master-reference="first" page-position="first" />
        <fo:conditional-page-master-reference master-reference="rest" page-position="any" />
      </fo:repeatable-page-master-alternatives>
    </fo:page-sequence-master>

  </fo:layout-master-set>

  <fo:page-sequence master-reference="psmA">
    <fo:static-content flow-name="xsl-region-before">
      <fo:block>before</fo:block>
    </fo:static-content>
    <fo:flow flow-name="xsl-region-body" font-size="12pt" line-height="11pt">
      <fo:block>content</fo:block>
      <fo:block break-before="page">more content</fo:block>
    </fo:flow>
  </fo:page-sequence>
</fo:root>
...