XSLT fop-0.95:dyn 问题:评估
Posted
技术标签:
【中文标题】XSLT fop-0.95:dyn 问题:评估【英文标题】:XSLT fop-0.95: problem with dyn:evaluate 【发布时间】:2010-12-04 00:17:24 【问题描述】:我一直在为 fop 0.95 的一些奇怪行为而苦苦挣扎(不知道我是否在做 出了什么问题,或者是否有解决方法)。
我有一个自动生成的 XML 如下:
(注意:这是一个模拟示例,但我需要的地方非常相似 在作业结束时使用类似于 roleTypes 的几列生成报告)
我的目标是将以上数据以pdf格式显示如下:
姓名 |开发 |问答 |文档 | -------------------------- 约翰 | 100 | | | 最大 | 60 | | | 亨利 | | 80 | | 彼得 | | 40 | |我使用 xsl:for-each 循环 RoleTypes/* 元素来定义表列,并且 然后动态构造 XPath 表达式(使用 exslt 的 dyn:evaluate)来获得 对应于角色(dev、qa 和 doc)的单元格的数据。
如果我通过预处理器 (xsltproc) 运行我的 xsl 样式表,它会按预期工作 生成 .fo,然后使用 fop 将此 .fo 转换为 pdf。 但是,当我直接使用 fop 时(即单步: fop -xml blah.xml -xsl blah.xsl -pdf out.pdf),我得到了奇怪的结果——只有第一列的数据(即第一列 'RoleTypes' 的子元素,在本例中 - 'dev')和其余列为空白。 我也尝试过首先使用 fop 本身(-foout 选项)生成 .fo,然后使用 fop 生成 pdf,但得到相同的结果,即数据仅显示在 对应于 RoleTypes 元素的第一个子元素的列。 这是 fop 的错误吗(因为它似乎可以识别 dyn:evaluate,但是 没有做完整的工作)?
我真的很想使用单步 fop,这样我就不需要了 在客户端上部署其他工具(如 xsltproc 等)。
这是我一直在使用的样式表的关键部分:
谢谢
【问题讨论】:
【参考方案1】:这并不能解决在 FOP 中使用 dyn:evaluate 的一般问题,但是对于这个特定的架构和问题,不需要动态评估。您可以使用 name() 函数来匹配节点名称。如果您将示例的内部循环替换为:
<xsl:for-each select="../RoleTypes/*">
<xsl:variable name="roleName" select="name(.)"/>
<fo:table-cell><fo:block>
<xsl:value-of select="$Member/*[name()=$roleName]"/>
</fo:block></fo:table-cell>
</xsl:for-each>
你会得到你想要的输出。
【讨论】:
感谢您提出这个替代方案!就主要问题而言,它是由 XALAN xslt 引擎引起的。一旦我用 Saxon 替换它,转换(和 FOP)就工作得很好。我为此问题为 XALAN 创建了一个错误报告,并更改了我的代码,以便我不再需要使用 dyn:evaluate。【参考方案2】:正如http://markmail.org/message/np4t6fe4nsmr4vag 所指出的,这不是直接的 FOP 问题,而是与 Java 安装中活动的默认 XSLT 处理器有关的问题。 XSLT 处理器可能需要显式替换,如下所述: http://xml.apache.org/xalan-j/faq.html#faq-N100EF
当然,您也可以继续使用 xsltproc 生成 XSL-FO,然后将 FO 文件提供给 FOP。
【讨论】:
以上是关于XSLT fop-0.95:dyn 问题:评估的主要内容,如果未能解决你的问题,请参考以下文章
xslt 中的 xpath 产生与直接评估 xpath 不同的结果
XSLT 2.0:根据 for-each -group 的当前索引评估和修改元素值