我一直在为 fop 0.95 的一些奇怪行为而苦苦挣扎(不知道我是否做错了什么,或者是否有解决方法)。
我有一个自动生成的 XML,如下所示:
<项目团队> <projectname>报告生成</projectname> <角色类型> <开发者/> <qa/> <文档/> </角色类型> <成员> <name>约翰</name> <dev>200</dev> </会员> <成员> <name>最大</name> <dev>60</dev> </会员> <成员> <name>亨利</name> <qa>80</qa> </会员> <成员> <name>彼得</name> <qa>40</qa> </会员> </项目团队>
(注意:这是一个模拟示例,但我有一个非常相似的需求,我需要在作业结束时使用类似于 roleTypes 的几个列生成报告)
我的目标是以 pdf 格式显示上述数据,如下所示:
姓名 | 开发 | 问答 | 文档 | -------------------------- 约翰 | 100 | | | 最大 | 60 | | | 亨利 | | 80 | | 彼得 | | 40 | |
我使用 xsl:for-each 循环 RoleTypes/* 元素以定义表格列,然后动态构造 XPath 表达式(使用 exslt 的 dyn:evaluate)来获取与角色(dev、qa 和文档)。
如果我通过预处理器 (xsltproc) 运行它以生成 .fo,然后使用 fop 将此 .fo 转换为 pdf,我的 xsl 样式表将按预期工作。但是,当我直接使用 fop 时(即单步:fop -xml blah.xml -xsl blah.xsl -pdf out.pdf),我得到了奇怪的结果 - 只有第一列的数据(即 ' 的第一个子元素RoleTypes',在这个例子中 - 'dev')和其余的列是空白的。我也尝试过使用 fop 本身(-foout 选项)首先生成 .fo,然后使用 fop 生成 pdf,但得到了相同的结果,即数据仅显示在与 RoleTypes 的第一个子元素对应的列中元素。这是 fop 的错误吗(因为它似乎可以识别 dyn:evaluate,但没有完成完整的工作)?
我真的很想使用单步 fop,这样我就不需要在客户端上部署其他工具(如 xsltproc 等)。
这是我一直在使用的样式表的关键部分:
<xsl:stylesheet 版本="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:dyn="http://exslt.org/dynamic"> <xsl:template match="projectteam"> ... <fo:table table-layout="fixed" width="100%"> <fo:table-column column-width="3cm"/> <xsl:for-each select="RoleTypes/*"> <fo:table-column column-width="1cm"/> </xsl:for-each> <fo:table-body> <xsl:for-each select="member"> <xsl:variable name="Member" select="."/> <fo:table-row> <fo:table-cell> <fo:block> <xsl:value-of select="name"/></fo:block> </fo:table-cell> <xsl:for-each select="../RoleTypes/*"> <xsl:variable name="roleName" select="concat('$Member/', name(.))"/> <fo:table-cell><fo:block> <!-- 这就是 fop 的问题所在;虽然同样的语句适用于 xsltproc?? --> <xsl:value-of select="dyn:evaluate($roleName)"/> </fo:block></fo:table-cell> </xsl:for-each> </fo:table-row> </xsl:for-each> </fo:table-body> </fo:table> </xsl:模板> </xsl:样式表>
谢谢