XSL-FO как распространять нумерацию страниц из шаблона в другой - PullRequest
0 голосов
/ 19 февраля 2020

Это мой первый опыт печати XSL-FO.

Существует 2 шаблона, каждый из которых имеет свой собственный макет. Xsl

Необходимо изменить нумерацию страниц второго шаблона, чтобы преемник первого.

Пример

шаблон 1 имеет 4 страницы, затем шаблон 2 должен начинаться с номера страницы. 5 не 1!

У меня есть идеи, но они все еще не работают; это создать третий шаблон, который вызывает эти 2 шаблона

<xsl:template>
        <xsl:call-template name="templateOne" />
        <!-- <xsl:block break-after="page"/> -->
        <xsl:call-template name="templateTwo" />
        <!-- <xsl:block break-after="page"/> -->
</xsl:template>

Макет templateOne:

<xsl:template match="/">
        <fo:root>       
            <xsl:call-template name="LayoutMasterSet"/>
            <xsl:variable name="TheVeryLastPage" select="."/>
            <xsl:choose>
                <xsl:when test="$titel='Anwendungsprotokoll'">
                    <fo:page-sequence master-reference="landscape" initial-page-number="1" format="1">
                        <!-- Kopfzeile -->
                        <xsl:call-template name="StandardKopfzeile">
                            <xsl:with-param name="TheVeryLastPage"><xsl:value-of select="$TheVeryLastPage"/></xsl:with-param>
                        </xsl:call-template>
                        <!-- Fusszeile -->
                        <xsl:call-template name="StandardFusszeile">
                            <xsl:with-param name="TheVeryLastPage"><xsl:value-of select="$TheVeryLastPage"/></xsl:with-param>
                        </xsl:call-template>
                        <fo:flow flow-name="xsl-region-body">
                            <fo:block font-size="8pt" line-height="10pt">
                                <xsl:apply-templates select="/*"/>
                            </fo:block>
                            <fo:block id="{generate-id($TheVeryLastPage)}"/>
                        </fo:flow>
                    </fo:page-sequence>
                </xsl:when>
                <xsl:otherwise>
                    <fo:page-sequence master-reference="default-pages" initial-page-number="1" format="1">
                        <!-- Kopfzeile -->
                        <xsl:call-template name="StandardKopfzeile">
                            <xsl:with-param name="TheVeryLastPage"><xsl:value-of select="$TheVeryLastPage"/></xsl:with-param>
                        </xsl:call-template>
                        <!-- Fusszeile -->
                        <xsl:call-template name="StandardFusszeile">
                            <xsl:with-param name="TheVeryLastPage"><xsl:value-of select="$TheVeryLastPage"/></xsl:with-param>
                        </xsl:call-template>
                        <fo:flow flow-name="xsl-region-body">
                            <fo:block font-size="8pt" line-height="10pt">
                                <xsl:apply-templates select="/*"/>
                            </fo:block>
                            <fo:block id="{generate-id($TheVeryLastPage)}"/>
                        </fo:flow>
                    </fo:page-sequence>
                </xsl:otherwise>
            </xsl:choose>
        </fo:root>
    </xsl:template>

Макет templateTwo:

<xsl:template match="/">
        <fo:root xsl:use-attribute-sets="font.arial.8.normal.black">
            <xsl:call-template name="LayoutMasterSet"/>
            <xsl:variable name="TheVeryLastPage" select="."/>
            <fo:page-sequence master-reference="default-pages" initial-page-number="1" format="1">
                <xsl:call-template name="StandardHeader"/>
                <xsl:call-template name="GeneralFooter">
                    <xsl:with-param name="TheVeryLastPage">
                        <xsl:value-of select="$TheVeryLastPage"/>
                    </xsl:with-param>
                </xsl:call-template>
                <xsl:apply-templates select="/*"/>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>
    <!-- ++++++++++++++++++++++++++++++++++Layout Master Set+++++++++++++++++++++++++++++++++++++++++++++ -->
    <xsl:template name="LayoutMasterSet">
        <fo:layout-master-set>
            <fo:simple-page-master master-name="any-page" page-height="297mm" page-width="210mm" margin-top="1.5cm" margin-bottom="1.5cm" margin-left="1.5cm" margin-right="1.5cm">
                <fo:region-body margin-top="2cm" margin-bottom="2cm" column-count="{$columns}"/>
                <fo:region-before extent="2cm" region-name="region-before"/>
                <fo:region-after extent="2cm" region-name="region-after"/>
            </fo:simple-page-master>
            <fo:page-sequence-master master-name="default-pages">
                <fo:repeatable-page-master-alternatives>
                    <fo:conditional-page-master-reference page-position="any" master-reference="any-page"/>
                </fo:repeatable-page-master-alternatives>
            </fo:page-sequence-master>
        </fo:layout-master-set>
    </xsl:template>

Эта идея не это дает мне:

saving .xsl. <anonymous development build> javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}table" is not a valid child of "fo:page-sequence"!

ERROR |17:33:05,752|DefaultExceptionHandler.logException:75 (WorkerThread 17:31:48)[-1] TRANSFORMATION_ERROR [] <anonymous development build>
de.vodafone.core.exception.BadProcessingException: [-1] TRANSFORMATION_ERROR []
    at de.vodafone.app.epos.shared.print.fop.FopPrintService.addToPageable(FopPrintService.java:165)
    at de.vodafone.app.epos.shared.print.fop.FopPrintService.print(FopPrintService.java:78)
    at de.vodafone.app.epos.shared.print.fop.PrintServiceDelegator.print(PrintServiceDelegator.java:53)
    at de.vodafone.app.epos.shared.print.activity.AbstractPrintAgent.execute(AbstractPrintAgent.java:213)
    at de.vodafone.app.epos.shared.activity.ActivityManager.execute(ActivityManager.java:78)
    at de.vodafone.app.epos.client.plugin.order.manager.common.presentation.AbstractOrderFacade.executeActivities(AbstractOrderFacade.java:210)
    at de.vodafone.app.epos.client.plugin.order.manager.common.presentation.SingleCustomerOrderFacade.handleAfterSave(SingleCustomerOrderFacade.java:101)
    at de.vodafone.app.epos.client.plugin.fixednet.activation.mvc.FNActivationFacade.handleAfterSave(FNActivationFacade.java:370)
    at de.vodafone.app.epos.client.plugin.order.manager.common.presentation.AbstractOrderFacade.save(AbstractOrderFacade.java:335)
    at de.vodafone.app.epos.client.plugin.order.manager.common.presentation.AbstractOrderFacade.save(AbstractOrderFacade.java:298)
    at de.vodafone.app.epos.client.plugin.order.manager.common.presentation.AbstractOrderFacade.send(AbstractOrderFacade.java:117)
    at de.vodafone.app.epos.client.plugin.order.manager.common.presentation.AbstractOrderController.send(AbstractOrderController.java:943)
    at de.vodafone.app.epos.client.plugin.order.manager.common.presentation.AbstractOrderController.onSend(AbstractOrderController.java:861)
    at de.vodafone.app.epos.client.plugin.order.manager.common.presentation.AbstractOrderController$10.doExecuteCommand(AbstractOrderController.java:1258)
    at de.vodafone.app.epos.client.framework.ui.action.AbstractWidgetActionUIJob.execute(AbstractWidgetActionUIJob.java:45)
    at de.vodafone.app.epos.client.framework.ui.action.RunnableBuilder$CommandRunnable.run(RunnableBuilder.java:196)
    at de.vodafone.app.epos.client.framework.ui.action.AbstractUIJob.run(AbstractUIJob.java:50)
    at EDU.oswego.cs.dl.util.concurrent.QueuedExecutor$RunLoop.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:748)
Caused by: javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}table" is not a valid child of "fo:page-sequence"! (Siehe Position 17:276)
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:469)
    at de.vodafone.app.epos.shared.print.fop.FopPrintService.addToPageable(FopPrintService.java:156)
    ... 18 more
Caused by: org.apache.fop.fo.ValidationException: "{http://www.w3.org/1999/XSL/Format}table" is not a valid child of "fo:page-sequence"! (Siehe Position 17:276)
    at org.apache.fop.events.ValidationExceptionFactory.createException(ValidationExceptionFactory.java:38)
    at org.apache.fop.events.EventExceptionManager.throwException(EventExceptionManager.java:54)
    at org.apache.fop.events.DefaultEventBroadcaster$1.invoke(DefaultEventBroadcaster.java:175)
    at com.sun.proxy.$Proxy1.invalidChild(Unknown Source)
    at org.apache.fop.fo.FONode.invalidChildError(FONode.java:534)
    at org.apache.fop.fo.FONode.invalidChildError(FONode.java:517)
    at org.apache.fop.fo.pagination.PageSequence.validateChildNode(PageSequence.java:147)
    at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.startElement(FOTreeBuilder.java:267)
    at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:171)
    at org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1020)
    at org.apache.xerces.parsers.AbstractSAXParser.startElement(Unknown Source)
    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.apache.xalan.transformer.TransformerIdentityImpl.transform(TransformerIdentityImpl.java:452)
    ... 19 more

Потому что я не тот, кто пишет эти огромные шаблоны, я не смог найти неверное расположение fo: table внутри fo: page-sequence

Более того, номер страницы не распространяется. Я думаю определить параметр, который изначально на 1 и установлен последней страницей templateOne, будет увеличен на 1 и инициализирован на первой странице шаблона 2 сразу после исправления предыдущего исключения формирования.

Ваша помощь действительно ценится Большое спасибо Мариам

1 Ответ

1 голос
/ 20 февраля 2020

Чтобы решить проблему fo:table, вам нужно fo:flow внутри вашей fo:page-sequence (см. https://www.w3.org/TR/xsl11/#fo_page -последовательность ). У templateOne он есть (но свойства fo:block внутри fo:flow могут быть помещены в fo:flow, а fo:block может быть опущено). templateTwo не имеет fo:flow внутри fo:page-sequence.

Другая ваша проблема в том, что оба шаблона создают fo:root. fo:root, как следует из названия, root документа FO. Поскольку генерируемый вами документ FO также является документом XML, документ может содержать только один элемент 'document', т. Е. Один fo:root.

. См. Эту схему в разделе 6.4.1.6, Древовидная структура пагинации, рекомендации XSL 1.1 (https://www.w3.org/TR/xsl11/#d0e7181)

Pagination tree structure diagram from https://www.w3.org/TR/xsl11/#d0e7181

Однако на диаграмме не показано, что fo:root может содержать несколько fo:page-sequence (см. https://www.w3.org/TR/xsl11/#fo_root).

Чтобы заставить templateOne и templateTwo работать вместе, вы должны сгенерировать один fo:root и один fo:layout-master-set и иметь templateOne и templateTwo генерируют контент, начиная с уровня fo:page-sequence. Что-то вроде:

fo:root
  fo:layout-master-set
  fo:page-sequence (generated by templateOne)
  fo:page-sequence (generated by templateTwo)

Если вы все это сделаете, то решите вопрос в названии. Значение по умолчанию для свойства initial-page-number (см. https://www.w3.org/TR/xsl11/#initial -page-number ) для каждого fo:page-sequence заставит второе fo:page-sequence начинаться с номера страницы после номера последней страницы предыдущего fo:page-sequence.

Другая скрытая проблема заключается в том, что как templateOne, так и templateTwo включают:

<xsl:apply-templates select="/*"/>

Если вы обрабатываете один исходный документ, то вы получите две копии вашего контента. Мы не сможем вам в этом помочь, если не узнаем больше о структуре XML, которую вы пытаетесь обработать.

...