对于每个FOP xml

时间:2015-09-30 10:17:11

标签: xml xslt xsl-fo apache-fop

我正在通过Apache FOP生成PDF,现在事情进展顺利。

现在我需要遍历一个列表并显示其中的每个元素并实现这一点我使用命令<xsl:for-each select="myObject/myList">,但是当FOP开始解析XML时我得到了这个错误:

2015-09-30 12:04:39,772 [http-nio-8080-exec-4] WARN  org.apache.fop.apps.FOUserAgent - Unknown formatting object "{http://www.w3.org/1999/XSL/Transform}for-each" encountered (a child of fo:root}. (See position 9:45)
java.lang.ClassCastException: org.apache.fop.fo.UnknownXMLObj cannot be cast to org.apache.fop.fo.pagination.Root
    at org.apache.fop.fo.pagination.AbstractPageSequence.getRoot(AbstractPageSequence.java:145)
    at org.apache.fop.fo.pagination.PageSequence.startOfNode(PageSequence.java:111)
    at org.apache.fop.fo.FOTreeBuilder$MainFOHandler.startElement(FOTreeBuilder.java:337)
    at org.apache.fop.fo.FOTreeBuilder.startElement(FOTreeBuilder.java:179)
    at org.apache.xalan.transformer.TransformerIdentityImpl.startElement(TransformerIdentityImpl.java:1072)
[...]

这是我的XML结构:

<?xml version="1.0" encoding="utf-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <fo:layout-master-set>
        <fo:simple-page-master master-name="A4-portrait"
            page-height="29.7cm" page-width="21.0cm" margin="1.5cm">
            <fo:region-body />
        </fo:simple-page-master>
    </fo:layout-master-set>
    <xsl:for-each select="myObject/myList">
        <fo:page-sequence master-reference="A4-portrait">
            <fo:flow flow-name="xsl-region-body" font-size="9">
                ## SOME STUFF ARE WRITTEN HERE ##
            </fo:flow>
        </fo:page-sequence>
    </xsl:for-each>
</fo:root>

我明白问题可能是FOP只需要fo:个元素。如果这是正确的,我怎么能循环我的列表?

1 个答案:

答案 0 :(得分:3)

您需要XSLT(或执行相同工作的东西)将您的XML转换为FOP理解的FO词汇表。

XSLT处理器将理解您的xsl:for-each。请参阅http://xmlgraphics.apache.org/fop/quickstartguide.html的FOP快速入门指南中的'带FOP的Hello World',以获取最小示例。

FOP可以在其处理过程中运行XSLT转换,但您也可以使用独立的XSLT处理器(如Saxon)生成FO文件,然后将其提供给FOP。