You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 19:06:00