XSLT 1.0 实现XSL-FO表格每页单独计算小计功能求助
问题原因
你当前代码中fo:marker内的求和逻辑是计算从第一条数据到当前行的全局累计值,所以第二页及之后的小计会自动累加前页数据,不符合单页小计的需求。
解决方法
因为你明确要求每页最多展示15行数据,我们可以先定位当前行所属的页的行区间,再对该区间内的Value字段求和即可。
修改后的完整代码示例
首先定义每页行数变量,再调整fo:marker内的求和逻辑,同时修正原代码中<xsl:value-of>误用xpath属性的问题:
<xsl:variable name="rowsPerPage" select="15" /> <fo:table> <fo:table-column column-width="50mm"/> <fo:table-column column-width="50mm"/> <fo:table-footer> <fo:table-row> <fo:table-cell> <fo:block>Subtotal: </fo:block> </fo:table-cell> <fo:table-cell> <fo:block> <fo:retrieve-table-marker retrieve-class-name="Subtotal" retrieve-position-within-table="last-starting"/> </fo:block> </fo:table-cell> </fo:table-row> </fo:table-footer> <fo:table-body> <xsl:for-each select="/Root/Data"> <fo:table-row> <fo:table-cell> <fo:block>Value:</fo:block> </fo:table-cell> <fo:table-cell> <fo:block> <xsl:value-of select="Value"/> <fo:marker marker-class-name="Subtotal"> <xsl:variable name="currentPos" select="position()"/> <!-- 计算当前页的起始行位置 --> <xsl:variable name="pageStartPos" select="floor(($currentPos - 1) div $rowsPerPage) * $rowsPerPage + 1"/> <!-- 计算当前页的结束行位置,不超过总数据量 --> <xsl:variable name="pageEndPos" select="min(($pageStartPos + $rowsPerPage - 1, count(/Root/Data)))"/> <!-- 仅对当前页区间的Value求和 --> <xsl:value-of select="sum(/Root/Data[position() >= $pageStartPos and position() <= $pageEndPos]/Value)"/> </fo:marker> </fo:block> </fo:table-cell> </fo:table-row> </xsl:for-each> </fo:table-body> </fo:table>
补充说明
如果后续需要调整每页展示行数,仅需要修改rowsPerPage变量的取值即可,不需要调整其他逻辑。该方案完全兼容XSLT 1.0标准,主流FO渲染引擎(FOP、Antenna House等)都可以正常支持。
内容的提问来源于stack exchange,提问作者iwasaki
相关产品推荐
相关产品推荐

