【问题标题】:How to properly allow page break in fop xml?如何正确允许 fop xml 中的分页符?
【发布时间】:2014-12-04 00:16:41
【问题描述】:

我正在使用 FOP 1.1 从 xml 文档生成 pdf 文件。 FOP 文档在这里http://xmlgraphics.apache.org/fop/

pdf 文档生成良好。但是,我不断收到此严重警告消息。我不知道如何解决这个问题。

SEVERE: Invalid property value encountered in break-after="": org.apache.fop.fo.expr.PropertyException: No conversion defined ; property:'break-after' (No context info available)
org.apache.fop.fo.expr.PropertyException: No conversion defined ; property:'break-after'
        at org.apache.fop.fo.properties.PropertyMaker.make(PropertyMaker.java:446)
        at org.apache.fop.fo.PropertyList.convertAttributeToProperty(PropertyList.java:413)
        at org.apache.fop.fo.PropertyList.addAttributesToList(PropertyList.java:321)
        at org.apache.fop.fo.FObj.processNode(FObj.java:122)
        at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.startElement(FOTreeBuilder.java:280)
        at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:175)
        at org.apache.xml.serializer.ToXMLSAXHandler.closeStartTag(ToXMLSAXHandler.java:204)
        at org.apache.xml.serializer.ToSAXHandler.flushPending(ToSAXHandler.java:277)
        at org.apache.xml.serializer.ToXMLSAXHandler.endElement(ToXMLSAXHandler.java:243)
        at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:1399)
        at org.apache.xalan.templates.ElemApplyTemplates.transformSelectedNodes(ElemApplyTemplates.java:393)
        at org.apache.xalan.templates.ElemApplyTemplates.execute(ElemApplyTemplates.java:176)
        at org.apache.xalan.templates.ElemApplyTemplates.transformSelectedNodes(ElemApplyTemplates.java:393)
        at org.apache.xalan.templates.ElemApplyTemplates.execute(ElemApplyTemplates.java:176)
        at org.apache.xalan.templates.ElemApplyTemplates.transformSelectedNodes(ElemApplyTemplates.java:393)
        at org.apache.xalan.templates.ElemApplyTemplates.execute(ElemApplyTemplates.java:176)
        at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411)
        at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:1374)
        at org.apache.xalan.templates.ElemApplyTemplates.transformSelectedNodes(ElemApplyTemplates.java:393)
        at org.apache.xalan.templates.ElemApplyTemplates.execute(ElemApplyTemplates.java:176)
        at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411)
        at org.apache.xalan.templates.ElemChoose.execute(ElemChoose.java:139)
        at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411)
        at org.apache.xalan.templates.ElemElement.constructNode(ElemElement.java:339)
        at org.apache.xalan.templates.ElemElement.execute(ElemElement.java:288)
        at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411)
        at org.apache.xalan.templates.ElemElement.constructNode(ElemElement.java:339)
        at org.apache.xalan.templates.ElemElement.execute(ElemElement.java:288)
        at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411)
        at org.apache.xalan.templates.ElemElement.constructNode(ElemElement.java:339)
        at org.apache.xalan.templates.ElemElement.execute(ElemElement.java:288)
        at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411)
        at org.apache.xalan.templates.ElemElement.constructNode(ElemElement.java:339)
        at org.apache.xalan.templates.ElemElement.execute(ElemElement.java:288)
        at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411)
        at org.apache.xalan.templates.ElemElement.constructNode(ElemElement.java:339)
        at org.apache.xalan.templates.ElemElement.execute(ElemElement.java:288)
        at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411)
        at org.apache.xalan.templates.ElemElement.constructNode(ElemElement.java:339)
        at org.apache.xalan.templates.ElemElement.execute(ElemElement.java:288)
        at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411)
        at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:1374)
        at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411)
        at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:1374)
        at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411)
        at org.apache.xalan.templates.ElemLiteralResult.execute(ElemLiteralResult.java:1374)
        at org.apache.xalan.templates.ElemApplyTemplates.transformSelectedNodes(ElemApplyTemplates.java:393)
        at org.apache.xalan.templates.ElemApplyTemplates.execute(ElemApplyTemplates.java:176)
        at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates(TransformerImpl.java:2411)
        at org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode(TransformerImpl.java:2281)
        at org.apache.xalan.transformer.TransformerImpl.transformNode(TransformerImpl.java:1367)
        at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:709)
        at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1284)
        at org.apache.xalan.transformer.TransformerImpl.transform(TransformerImpl.java:1262)
        at org.apache.fop.cli.InputHandler.transformTo(InputHandler.java:300)
        at org.apache.fop.cli.InputHandler.renderTo(InputHandler.java:130)
        at org.apache.fop.cli.Main.startFOP(Main.java:177)
        at org.apache.fop.cli.Main.main(Main.java:208)

我有以下代码

  <xsl:template match="br">
    <fo:block break-after="{@break}"></fo:block>
  </xsl:template>


<xsl:attribute-set name="page.break">
    <xsl:attribute name="break-after">page</xsl:attribute>
</xsl:attribute-set>

【问题讨论】:

  • 你很可能有一个没有 'break' 属性的 'br' 元素,所以 'break-after' 属性最终为空。
  • 嗯你什么意思?我对此不太满意。可以举个例子吗?

标签: xml apache-fop


【解决方案1】:

在您显示的xsl:template 中,break-after 属性具有此属性值模板:{@break}。

这意味着@break 的值将用于break-after 的值。如果没有@break,就没有价值(这似乎是你的问题)。

查看您的 XML 输入;是否有没有break 属性的br 元素(//br[not(@break)])?

真的有带有break 属性的br 元素(//br[@break])吗?

你可以做的是修改你的模板来处理这两个问题。输出一个默认值,例如page,如果有break 属性,则用该值覆盖您的默认值。

您没有指定 XSLT 的版本,所以我将给出 1.0 和 2.0 的(未经测试的)示例。

XSLT 2.0

<xsl:template match="br">
    <fo:block break-after="{if (string(@break)) then @break else 'page'}"/>        
</xsl:template>

XSLT 1.0

<xsl:template match="br">
    <fo:block break-after="page">
        <xsl:apply-templates select="@break[string()]"/>
    </fo:block>
</xsl:template>

<xsl:template match="br/@break">
    <xsl:attribute name="break-after">
        <xsl:value-of select="."/>
    </xsl:attribute>
</xsl:template>

另一个 XSLT 1.0 选项

<xsl:template match="br">
    <fo:block break-after="page">
        <xsl:if test="string(@break)">
            <xsl:attribute name="break-after">
                <xsl:value-of select="@break"/>
            </xsl:attribute>
        </xsl:if>
    </fo:block>
</xsl:template>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 2012-01-03
    • 1970-01-01
    • 2018-09-19
    • 2013-01-05
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多