2014-01-07 29 views
0

我有一些XML,我试图将其转换为适合打印的报表。到目前为止,一切都进展顺利,除了一部分。在for-each期间插入新元素到提供的XML中

这涉及当前正在输出的行的当前页码。我使用<fo:page-number/>来获取当前页码,但是我发现在使用与当前行同级相关的信息后,我发现我无法在范围内设置一个变量,请使用for-each独自被改变。

所以,我目前玩弄的想法是,在每次迭代时,正在使用的当前节点都有一个新的元素(或属性)被引入,其中包含当时出现的fo:page-number的值。然后,在下一次迭代中,我将从preceding-sibling::中获取元素/属性,然后测试当前的fo:page-number是否与该值不同。

不幸的是,我没有太多的运气找到一种方法来做到这一点,我从谷歌搜索获得的所有结果都来自w3fools的结果。有谁知道这是否可能,如果有的话,怎么做?

+0

我不确定我在这里理解你的逻辑 - 你使用XSLT生成XSL-FO,然后使用FO处理器将生成的XSL-FO转换为渲染输出,只有在这个阶段你才知道什么值一个特定的''会产生(XSLT和XSL-FO处理器可能是同一个软件包的一部分,但在概念上它们是两个独立的阶段)。您不能在XSLT中使用'page-number'标签产生的输出值。 –

+0

嗯,这是一个耻辱。是否还有其他函数(很可能在fo内)允许将当前页码作为逻辑中的变量使用? – topherg

+0

在什么阶段你想使用'fo:page-number?'在XSLT阶段(即将XML数据转换为XSL-FO),页码是未知的。但是,为什么不更清楚地说明你打算实现的目标(可能包括XML示例或描述输出) - 那么,也许有人可以提出另一种解决方案? –

回答

2

为了答复,不,这是不可能的。

基本上,当属性omit-header-at-break设置为“false”时,可以在XSL-FO中在每个页面顶部重复标题。有关详细信息,请参阅http://www.schemacentral.com/sc/fo11/a-table-omit-header-at-break-1.htmlhttp://www.w3.org/TR/xsl/#table-omit-header-at-break。我知道这是在Apache FOP中实现的,但也应该与其他FO处理器一起使用。

但是当然,这个解决方案假设你的表头被分类为头,也就是说,在语义上是头,而不是表面看起来像头,而只是表的第一行。我知道你的情况后者是真的。

(不过,我无法想象什么样的规格可以让你从定义每个表的第一行作为可重复的标题。)

此外,虽然XML数据转换为XSL-FO, fo:page-number指令的结果尚不可用。因此,你不能在你的样式表中使用它(这部分答案由@Ian Roberts贡献)。这是因为它由像Saxon这样的XSLT处理器处理的XSLT样式表没有FO指令的概念。 fo:page-number仅由FO处理器解释。


我看到的唯一的解决办法是改变你的规格,让fo:table-header元素。通过仅使用表格行和单元格,可以在分页符后有效地“副线”重复页眉。