在 for-each 期间将新元素插入到提供的 XML 中
Posted
技术标签:
【中文标题】在 for-each 期间将新元素插入到提供的 XML 中【英文标题】:Inserting a New Element into provided XML during for-each 【发布时间】:2014-01-07 12:27:51 【问题描述】:我正在尝试将一些 XML 转换为适合打印的报告。到目前为止,一切都很顺利,除了一个部分。
这涉及相关行当前输出到的当前页码。我正在使用<fo:page-number/>
来获取当前页码,但是在我发现我不能在@ 987654322@,更别说改了。
所以,我目前正在考虑这样一种想法,即在每次迭代中,当前使用的节点都会引入一个新元素(或属性),其中包含当时出现的 fo:page-number
的值。然后,在下一次迭代中,我将从preceding-sibling::
获取元素/属性,然后测试当前的fo:page-number
是否与该值不同。
可悲的是,我没有太多运气找到一种方法来做到这一点,而且我从谷歌搜索中得到的只是来自 w3fools 的大量结果。有谁知道这是否可行,如果可以,该怎么做?
【问题讨论】:
我不确定我是否理解您的逻辑 - 您使用 XSLT 生成 XSL-FO,然后使用 FO 处理器将生成的 XSL-FO 转换为渲染输出,并且仅在此阶段你知道特定的<fo:page-number>
会产生什么价值(XSLT 和 XSL-FO 处理器可能是同一个包的一部分,但在概念上它们是两个独立的阶段)。您不能在 XSLT 中使用由page-number
标记生成的输出值。
嗯,真可惜。是否有任何其他函数(最有可能在 fo 中)允许将当前页码作为变量生成以用于逻辑?
你想在什么阶段使用fo:page-number?
在XSLT阶段(即把XML数据转换成XSL-FO),页码是未知的。但是您为什么不更清楚地说明您打算实现的目标(可能包括示例 XML 或描述输出) - 那么,也许有人可以提出另一个解决方案?
根据我的发现,直到 XSLT 完成才执行分页过程,因此在这种情况下无法完成(因为它涉及在看似任意位置插入标题行)在页面的尺寸上)。这是关于在每个新页面的顶部插入额外的标题行,但是除非我有可以准确测量当前内容当前占用的空间量以及输出页面区域的高度的东西,否则我想不出任何其他方式:s
取决于您究竟打算做什么。页码值与是否输出附加页眉内容之间有什么关系?
【参考方案1】:
为了回答,不,这是不可能的。
基本上,当属性omit-header-at-break
设置为“false”时,在XSL-FO 中可以在每个页面的顶部重复标题。有关这方面的更多信息,请参阅 http://www.schemacentral.com/sc/fo11/a-table-omit-header-at-break-1.html 和 http://www.w3.org/TR/xsl/#table-omit-header-at-break。我知道这是在 Apache FOP 中实现的,但也应该适用于其他 FO 处理器。
但是,当然,此解决方案假定您的表头被归类为表头,也就是说,在语义上是表头,而不是表面上看起来像表头,而只是表的第一行。我知道你的情况是后者。
(但是,我无法想象什么样的规范可以阻止您将每个表的第一行定义为可以重复的标题。)
此外,虽然 XML 数据被转换为 XSL-FO,但 fo:page-number
指令的结果尚不可用。因此,您不能在样式表中使用它(这部分答案由 @Ian Roberts 提供)。这是因为 XSLT 样式表由像 Saxon 这样的 XSLT 处理器处理,没有 FO 指令的概念。 fo:page-number
仅由 FO 处理器解释。
我看到的唯一解决方案是更改您的规范以允许 fo:table-header
元素。通过仅使用表格行和单元格,您可以在分页后有效地“排除”标题重复。
【讨论】:
以上是关于在 for-each 期间将新元素插入到提供的 XML 中的主要内容,如果未能解决你的问题,请参考以下文章