【问题标题】:How can I sum up some values per page in a table in XSL-FO?如何在 XSL-FO 的表格中总结每页的一些值?
【发布时间】:2011-12-17 09:24:24
【问题描述】:

我正在使用 XSL-FO 生成帐户对帐单打印输出。 PDF 实际上只是一个简单的表格,每页都有一个简单的标题。困难在于我必须显示每页的交易量,例如

第 1 页

+------------------------------+-----------+-----------+---------------------+
| Text                         | Credit    | Debit     | Balance             |
+------------------------------+-----------+-----------+---------------------+
| Previous month               |           |           |           (*1) 1000 |
| abc                          |      1000 |           |                2000 |
| abc                          |           |       500 |                1500 |
| abc                          |           |       200 |                1300 |
| ...                          |           |           |                     |
| Carry over                   | (*2) 1000 |  (*3) 700 |           (*4) 1300 |
+------------------------------+-----------+-----------+---------------------+

第 2 页

+------------------------------+-----------+-----------+---------------------+
| Text                         | Credit    | Debit     | Balance             |
+------------------------------+-----------+-----------+---------------------+
| Previous page                | (*2) 1000 |  (*3) 700 |           (*4) 1300 |
| abc                          |      1000 |           |                2300 |
| abc                          |           |       500 |                1800 |
| abc                          |           |       200 |                1600 |
| ...                          |           |           |                     |
| Carry over                   | (*2) 2000 | (*3) 1400 |           (*4) 1600 |
+------------------------------+-----------+-----------+---------------------+

这里有一些解释:

  1. 这是上个月的余额。它是预先计算好的,并且是众所周知的 XSL 变量。没问题,这是一个常规页眉(仅在第一页上)
  2. 此值是按每页计算的。它汇总了同一页面上的所有信用额度。我自己无法计算,因为我不知道 XSL-FO 何时会进行分页。所以我想 XSL-FO 必须为我做计算。页面底部的总和与后续页面顶部的值相同。
  3. 此值与 2 相同,仅用于借方金额。
  4. 此值只是页面底部的最后一笔交易的余额。该值在下一页顶部重复。

如何使用 XSL-FO 进行这些计算?

另请参阅此相关问题:How to display one or the other information depending on the page number in XSL-FO?

【问题讨论】:

  • 您看过 XSLT 了吗?您可以编写一个包含/生成 FO 元素的 XSLT 样式表,它允许您进行任何合理的计算。
  • @Dabbler:我正在使用 XSLT,我只是不确定如何让 XSL-FO 在每页的基础上使用计算值。我猜迈克尔的回答很有价值

标签: xslt xsl-fo apache-fop


【解决方案1】:

试试“表格标记”:http://www.w3.org/TR/xsl/#fo_retrieve-table-marker

在 XSLT 中为每一行注入一个带有总和的标记。然后让引擎选择一个标记来替换表格页眉或页脚中的 fo:retrieve-table-marker。这个想法是,在渲染时将根据标记在页面上的位置以及 fo:retrieve-table-marker 上的 @retrieve-position 和 @retrieve-boundary 选择适当的标记。

【讨论】:

  • 这看起来与我正在寻找的完全一样。我会尽快试试这个。谢谢!
  • 不幸的是,Apache fop 中似乎缺少 <fo:retrieve-table-marker/> 实现 :-(。我将不得不使用 <fo:retrieve-marker/> 来代替
【解决方案2】:

不幸的是,根据我的发现,fop 没有实现<fo:retrieve-table-marker/>。相反,这里的解决方案对我有用:

How to display one or the other information depending on the page number in XSL-FO?

它涉及在<fo:flow/> 之外创建一个单独的表,该表使用<fo:retrieve-marker/> 元素显示表头。

【讨论】:

  • 如果表格是流程中的第一件事,这可能适用于表格标题,但不适用于表格页脚:我们事先不知道表格页脚出现在页面上的什么位置。
  • @MichaelSulyaev:原则上,你是对的。但我的布局预计将包含 37 行固定高度。所以我很幸运 :-) 我也可以对页脚执行相同的操作,并将表格页脚移动到 <fo:static-content flow-name="xsl-region-after"/> 部分
  • @MichaelSulyaev... 嗯,实际上我现在才意识到整个问题变得有些过时了,就像这种固定布局一样,我可以在让 FOP 运行布局之前在 XSL 中进行一些计算...
猜你喜欢
  • 2015-12-16
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 2021-02-28
  • 2013-04-06
  • 1970-01-01
相关资源
最近更新 更多