无法在我的xsl中添加<fo:=“”inline =“”>元素

时间:2016-11-16 17:06:17

标签: xml xsl-fo

在我的工作中,我遇到了一个小虫子。只需要在一个小文本部分下划线。 但是我在尝试添加标签时遇到错误。 它给我错误报告,它不是一个有效的孩子。

错误如下:

Caused by: javax.xml.transform.TransformerException: org.apache.fop.fo.ValidationException: "fo:inline" is not a valid child of "fo:flow"! (See fo:flow, "Mademoiselle ADS S, 1, 10000 TRO...")
    at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2304)
    at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:682)
    at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2336)
    at org.apache.xalan.templates.ElemTemplate.execute(ElemTemplate.java:393)
    at org.apache.xalan.templates.ElemCallTemplate.execute(ElemCallTemplate.java:247)
    at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2336)
    at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:682)
    at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2336)
    at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:682)
    at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2336)
    at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:682)
    at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2336)
    at org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode(TransformerImpl.java:2202)
    at org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1276)
    at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:673)
    at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1192)
    at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1170)
    at com.albiran.ebiza.utilitaires.PDFGenerator.produceXMLData(PDFGenerator.java:117)
    at com.satec.pdf.SAPDFGenerator.generatePDF(SAPDFGenerator.java:163)
    at com.albiran.ebiza.envoi.AsyncAttachment.getPath(AsyncAttachment.java:41)
    ... 3 more

xsl文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:import href="SAPdfUtils.xsl" />
    <xsl:output method="xml" encoding="ISO-8859-1" />

    <xsl:template match="/">
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <!-- ******************************** Déclaration, des pages ************************** -->
            <fo:layout-master-set>
                <fo:simple-page-master master-name="mainpage"
                    page-width="21cm" page-height="29.7cm" margin-top="1cm"
                    margin-bottom="1cm" margin-left="1cm" margin-right="1cm">
                    <fo:region-body region-name="xsl-region-body"
                        extent="0cm" margin-top="5cm" margin-bottom="2.5cm" margin-left="2cm"
                        margin-right="2cm" />
                </fo:simple-page-master>
            </fo:layout-master-set>

            <fo:page-sequence master-reference="mainpage"
                font-family="Arial">

                <!-- ******************************** Body ************************** -->
                <fo:flow flow-name="xsl-region-body" font-size="12pt"
                    font-family="Arial" text-align="justify">

                    <!-- Page 1 -->
                    <xsl:call-template name="break" />
                    <xsl:call-template name="page1" />
                    <fo:block break-after="page" />

                </fo:flow>
            </fo:page-sequence>
        </fo:root>
    </xsl:template>

    <xsl:template name="page1">
        <fo:table table-layout="fixed">
            <fo:table-column column-width="60%" />
            <fo:table-column column-width="40%" />
            <fo:table-body>
                <fo:table-row text-align="left" font-weight="bold">
                    <xsl:call-template name="cellBreak" />
                    <fo:table-cell>
                        <fo:block>
                            <xsl:value-of select="/document/contractor/nameLong" />
                        </fo:block>
                        <xsl:call-template name="break" />
                        <fo:block>
                            <xsl:value-of select="/document/contractor/road" />
                        </fo:block>
                        <xsl:call-template name="break" />
                        <fo:block>
                            <xsl:value-of select="/document/contractor/city" />
                        </fo:block>
                    </fo:table-cell>
                </fo:table-row>
            </fo:table-body>
        </fo:table>
        <xsl:call-template name="break" />
        <xsl:call-template name="break" />
        <xsl:call-template name="break" />
        <fo:block text-align="right">
            Paris, le
            <xsl:value-of select="/document/date" />
        </fo:block>
        <xsl:call-template name="break" />

        <fo:block font-weight="bold">
            Votre référence client : N°
            <xsl:value-of select="/document/contractor/id" />
        </fo:block>
        <fo:block font-weight="bold">
            N° de contrat :
            <xsl:value-of select="/document/policy/id" />
        </fo:block>
        <fo:block font-weight="bold">
            Intitulé du produit :
            <xsl:value-of select="/document/policy/productName" />
        </fo:block>
        <xsl:call-template name="break" />
        <xsl:call-template name="break" />


            <fo:inline text-decoration="underline">
            Objet : Remise en vigueur de votre contrat d’assurance.
            </fo:inline>

        <fo:block padding="-10px">
            <fo:leader leader-length="90%" leader-pattern="rule"
                rule-style="solid" rule-thickness="0.1mm" color="black" />
        </fo:block>
        <xsl:call-template name="break" />
        <xsl:call-template name="break" />
        <xsl:call-template name="break" />

        <fo:block>
            <xsl:value-of select="/document/contractor/longTitle" />
            <xsl:text>,</xsl:text>
        </fo:block>
        <xsl:call-template name="break" />
        <xsl:call-template name="break" />

        <fo:block>
            Suite à votre règlement du 
            <xsl:value-of select="/document/dateOfThePayment" />
            de votre prime de
            <xsl:value-of select="/document/unpaidAmount" />
            <xsl:call-template name="space" />
            <xsl:text>€</xsl:text>
            <xsl:call-template name="space" />
            pour la période du
            <xsl:value-of select="/document/startDate" />
            au
            <xsl:value-of select="/document/endDate" />
            , nous vous confirmons la remise en vigueur votre contrat d’assurance en date d’effet du 
            <xsl:value-of select="/document/reinstatementDate" />
            .
        </fo:block>
        <xsl:call-template name="break" />

        <fo:block>
            Nous restons à votre disposition. 
        </fo:block>
        <xsl:call-template name="break" />




        <fo:block>
            Nous vous prions de croire,
            <xsl:value-of select="/document/contractor/longTitle" />
            <xsl:text>, en l'expression de nos sentiments dévoués.</xsl:text>
        </fo:block>
        <xsl:call-template name="break" />
        <xsl:call-template name="break" />

        <fo:table table-layout="fixed">
            <fo:table-column column-width="60%" />
            <fo:table-column column-width="40%" />
            <fo:table-body>
                <fo:table-row>
                    <xsl:call-template name="cellBreak" />
                    <fo:table-cell>
                        <fo:block>
                            Votre Conseiller SATEC
                        </fo:block>
                        <xsl:call-template name="break" />
                        <fo:block>
                            Tél. : 
                            <xsl:value-of select="/document/satecPhone" />
                        </fo:block>
                    </fo:table-cell>
                </fo:table-row>
            </fo:table-body>
        </fo:table>
    </xsl:template>

    <xsl:template name="cellBreak">
        <fo:table-cell>
            <xsl:call-template name="break" />
        </fo:table-cell>
    </xsl:template>

    <xsl:template name="tableLineBreak">
        <fo:table-row>
            <xsl:call-template name="cellBreak" />
        </fo:table-row>
    </xsl:template>

</xsl:stylesheet>

我不太遗憾地对xsl文件有太多经验。并且iv看到人们有这个问题,但出于不同的原因。

提前感谢您,如果我遗漏了一些简单或微不足道的事情,我很抱歉,我不知道这里可能存在什么问题。

1 个答案:

答案 0 :(得分:1)

您的fo:inline应位于fo:block或类似内容中。

如果您查看fo:flowhttps://www.w3.org/TR/xsl/#fo_flow)的定义,您会看到其内容模型为(%block;)+。如果您按照从%block;到其定义的链接,您会看到块级FO是:

  • 块容器
  • 表和字幕
  • 列表块

您还可以将fo:float或任何“中立容器”用作fo:flow的孩子。

在所有这些中,只有fo:block可以直接包含fo:inline

如果您使用oXygen XML编辑器,则可以使用 focheck https://github.com/AntennaHouse/focheck)验证您的FO文件,然后再将其提交给您的FO处理器。