对于 FOP 中的每个 xml
For each in FOP xml
我正在通过 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:
个元素。如果这是正确的,我怎样才能遍历我的列表?
您需要 XSLT(或做同样工作的东西)将您的 XML 转换成 FOP 理解的 FO 词汇表。
您的 xsl:for-each
将被 XSLT 处理器理解。请参阅位于 http://xmlgraphics.apache.org/fop/quickstartguide.html 的 FOP 快速入门指南中的 'Hello World with FOP' 获取最小示例。
FOP 可以 运行 XSLT 转换作为其处理的一部分,但您也可以使用独立的 XSLT 处理器(例如 Saxon)来生成 FO 文件,然后您可以将该文件提供给 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:
个元素。如果这是正确的,我怎样才能遍历我的列表?
您需要 XSLT(或做同样工作的东西)将您的 XML 转换成 FOP 理解的 FO 词汇表。
您的 xsl:for-each
将被 XSLT 处理器理解。请参阅位于 http://xmlgraphics.apache.org/fop/quickstartguide.html 的 FOP 快速入门指南中的 'Hello World with FOP' 获取最小示例。
FOP 可以 运行 XSLT 转换作为其处理的一部分,但您也可以使用独立的 XSLT 处理器(例如 Saxon)来生成 FO 文件,然后您可以将该文件提供给 FOP。