在for-each期间将新元素插入到提供的XML中

时间:2014-01-07 12:27:51

标签: xml xslt insert xsl-fo xmlnode

我有一些XML,我试图将其转换为适合打印的报告。到目前为止,除了一部分外,一切进展顺利。

这涉及当前正在输出相关行的当前页码。我正在使用<fo:page-number/>来获取当前的页码,但在我发现我无法使用范围的变量之后,我已经长时间地使用与当前行兄弟姐妹相关的信息。 for-each,更不用说改变了。

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

可悲的是,我没有太多运气找到一种方法来做到这一点,而我从google搜索得到的只是来自w3fools的大量结果。有谁知道这是否可行,如果可行,怎么做?

1 个答案:

答案 0 :(得分: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 提供)。这是因为XSLT样式表由XSLT处理器(如Saxon)处理,没有FO指令的概念。 fo:page-number仅由FO处理器解释。


我看到的唯一解决方案是更改您的规范以允许fo:table-header元素。通过仅使用表格行和单元格,您可以在分页后有效地“替代”标题重复。