如何使用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() > ($var_pos -1) and position() < ($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>
关键修改点
- 添加
total_items变量,获取所有G_1节点的总数,用于判断最后一组 - 计算
group_end变量,确定当前分组的最后一个节点位置 - 通过
current_page_total计算当前页的实际行数(最后一页可能不足19行) - 在最后一组的
CountGroup内添加PageTotal节点,输出该页总行数(可根据报表需求调整节点名称或位置) - 修正内层循环的结束条件,让逻辑更清晰准确
内容的提问来源于stack exchange,提问作者Tarek Ezzat
相关产品推荐
相关产品推荐

