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

如何使用XSLT在报表最后一页打印该页总行数?

XSLT分页:在最后一页添加当前页总行数

问题说明

现有XSLT代码可将数据按每19行分为一页,需要在报表的最后一页打印该页的总行数。此前尝试用<xsl:if test="position()=last()"></xsl:if>做判断,但并未生效。原有代码如下:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<DATA_DS>
<xsl:variable name="var_size" select="19" />
<xsl:for-each select="/DATA_DS/G_1">
<xsl:variable name="var_pos" select="position()" />
<xsl:variable name="var_mod" select="$var_pos mod($var_size)" />
<xsl:if test="$var_mod = 1">
<xsl:variable name="var_groupNum" select="($var_pos - $var_mod) div number($var_size) + 1" />
<xsl:element name="CountGroup">
<xsl:attribute name="name">
<xsl:value-of select="concat('Group',$var_groupNum)" />
</xsl:attribute>
<xsl:for-each select="/DATA_DS/G_1[position() &gt; ($var_pos -1) and position() &lt; ($var_pos + $var_size)]">
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:if>
</xsl:element>
</xsl:if>
</xsl:for-each>
</DATA_DS>
</xsl:template>
</xsl:stylesheet>

问题原因

原代码的逻辑是遍历所有/DATA_DS/G_1节点,仅当节点位置为19的倍数+1时才创建CountGroup分组。此时用position()=last()判断的是整个G_1节点集合的最后一个节点,但这个节点几乎不可能是分组的起始节点(只有总节点数刚好是19的倍数时才会重合),所以判断条件无法触发,也就无法在最后一页添加总行数。

解决方案

修改代码,先获取总节点数,再判断当前分组是否为最后一组,最后计算并输出该组的行数:

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<DATA_DS>
<xsl:variable name="var_size" select="19" />
<!-- 存储G_1节点的总数量 -->
<xsl:variable name="total_items" select="count(/DATA_DS/G_1)" />
<xsl:for-each select="/DATA_DS/G_1">
<xsl:variable name="var_pos" select="position()" />
<xsl:variable name="var_mod" select="$var_pos mod($var_size)" />
<xsl:if test="$var_mod = 1">
<xsl:variable name="var_groupNum" select="($var_pos - $var_mod) div number($var_size) + 1" />
<!-- 计算当前分组的最后一个节点位置 -->
<xsl:variable name="group_end" select="$var_pos + $var_size - 1" />
<!-- 计算当前页的实际行数 -->
<xsl:variable name="current_page_total" select="if ($group_end > $total_items) then $total_items - $var_pos + 1 else $var_size" />
<xsl:element name="CountGroup">
<xsl:attribute name="name">
<xsl:value-of select="concat('Group',$var_groupNum)" />
</xsl:attribute>
<!-- 仅在最后一页添加当前页总行数节点 -->
<xsl:if test="$group_end >= $total_items">
<PageTotal><xsl:value-of select="$current_page_total" /></PageTotal>
</xsl:if>
<!-- 修正分组节点选取的结束条件,逻辑更直观 -->
<xsl:for-each select="/DATA_DS/G_1[position() > ($var_pos -1) and position() <= $group_end]">
<xsl:copy-of select="." />
</xsl:for-each>
</xsl:element>
</xsl:if>
</xsl:for-each>
</DATA_DS>
</xsl:template>
</xsl:stylesheet>

关键修改点

  1. 添加total_items变量,获取所有G_1节点的总数,用于判断最后一组
  2. 计算group_end变量,确定当前分组的最后一个节点位置
  3. 通过current_page_total计算当前页的实际行数(最后一页可能不足19行)
  4. 在最后一组的CountGroup内添加PageTotal节点,输出该页总行数(可根据报表需求调整节点名称或位置)
  5. 修正内层循环的结束条件,让逻辑更清晰准确

内容的提问来源于stack exchange,提问作者Tarek Ezzat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:57:36