XSL-FO fo: repeatable-page-master-alternatives не работает должным образом - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу добавить номер страницы в нижний колонтитул, если количество страниц больше одной, но не для, если есть только одна страница.

Я попробовал следующий код, но он показывает номер страницы во всех случаях:

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
        <fo:layout-master-set>
            <fo:simple-page-master master-name="singlePage" page-height="800pt" page-width="612pt" margin-top="0pt" margin-bottom="46pt" margin-left="26pt" margin-right="26pt">
                <fo:region-body margin-top="110pt" margin-bottom="65pt" />
                <fo:region-before extent="72pt" />
                <fo:region-after region-name="xsl-region-after-single" extent="75pt" />
            </fo:simple-page-master>

            <fo:simple-page-master master-name="multiPage" page-height="800pt" page-width="612pt" margin-top="0pt" margin-bottom="46pt" margin-left="26pt" margin-right="26pt">
                <fo:region-body margin-top="110pt" margin-bottom="65pt" />
                <fo:region-before extent="72pt" />
                <fo:region-after region-name="xsl-region-after-multi" extent="75pt" />
            </fo:simple-page-master>

            <fo:page-sequence-master master-name="allPages">
                <fo:repeatable-page-master-alternatives>
                   <fo:conditional-page-master-reference page-position="any" master-reference="multiPage"/>
                   <fo:conditional-page-master-reference page-position="only" master-reference="singlePage"/>
                </fo:repeatable-page-master-alternatives>
            </fo:page-sequence-master>
        </fo:layout-master-set>

        <fo:page-sequence master-reference="allPages">
            <fo:static-content flow-name="xsl-region-before">
                <fo:block>content</fo:block>
            </fo:static-content>
            <fo:static-content flow-name="xsl-region-after-single">
                <fo:block>content</fo:block>
            </fo:static-content>
            <fo:static-content flow-name="xsl-region-after-multi">
                    <fo:block>content</fo:block>
                    <fo:block text-align="right">
                        <fo:inline><fo:page-number font-weight="normal"/>/<fo:page-number-citation ref-id = "lastPage"/></fo:inline>
                    </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 id = "lastPage"/>
            </fo:flow>
        </fo:page-sequence>
    </fo:root>

Если я изменю порядок альтернатив, номер страницы никогда не будет показан:

<fo:page-sequence-master master-name="allPages">
    <fo:repeatable-page-master-alternatives>
        <fo:conditional-page-master-reference page-position="only" master-reference="singlePage"/>
        <fo:conditional-page-master-reference page-position="any" master-reference="multiPage"/>
    </fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>

Я использую FOP 2.0

Спасибо за ваши ответы.

1 Ответ

0 голосов
/ 08 ноября 2018

Ваш второй вариант работает для меня как с FOP 2.0, так и с FOP 2.2:

<fo:page-sequence-master master-name="allPages">
    <fo:repeatable-page-master-alternatives>
        <fo:conditional-page-master-reference page-position="only" master-reference="singlePage"/>
        <fo:conditional-page-master-reference page-position="any" master-reference="multiPage"/>
    </fo:repeatable-page-master-alternatives>
</fo:page-sequence-master>

Вы пробовали это с достаточным количеством контента, чтобы создать вторую страницу? Например, добавьте <fo:block break-before="page">content</fo:block>, чтобы вызвать вторую страницу.

Если вы измените текст содержимого в вашем fo:static-content на fo:region-after, тогда вы получите лучшее представление о том, какой fo:conditional-page-master-reference используется; e.g.:

<fo:static-content flow-name="xsl-region-after-single">
   <fo:block>after single</fo:block>
</fo:static-content>

Способ работы fo:conditional-page-master-reference (https://www.w3.org/TR/xsl11/#fo_conditional-page-master-reference)) заключается в том, что он выбирается, если он является первой альтернативой, для которой выполняются все его подусловия. Если для создания второй страницы достаточно содержимого, тогда подусловие page-position="only" больше не выполняется, поэтому средство форматирования должно повторить попытку с другими альтернативами.

Форматировщик должен повторить попытку, потому что если это не так, то fo:repeatable-page-master-alternatives (https://www.w3.org/TR/xsl11/#fo_repeatable-page-master-alternatives) не удовлетворяет его ограничениям (мой акцент):

Подпоследовательность страниц, отображаемых на этот спецификатор подпоследовательности, удовлетворяет ограничениям этого спецификатора подпоследовательности, если (a) подпоследовательность страниц состоит из нуля или более страниц, (b) каждая страница генерируется с использованием fo: simple-page-master, на который ссылается одна из альтернатив, являющихся дочерними для fo: repeatable-page-master-alternatives, (c) условия для этой альтернативы верны , (d) эта альтернатива является первой альтернативой в последовательности детей, для которой выполняются все условия, и (e) длина подпоследовательности меньше или равна значению «максимум-повторений».

...