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

XSL转换生成管道分隔文件时在输出页脚添加总行数统计

XSLT转换追加记录总数页脚实现方案

你当前使用XSLT 2.0版本,无需两次处理源文件,直接通过XPath预统计所有输出行总数即可实现页脚需求,同时原代码存在两处小问题一并修复:

  • 静态文本直接写<text>标签不符合XSLT语法,需替换为<xsl:text>包裹
  • HDRBIO行末尾多余输出了一个管道分隔符,会导致行尾出现空列

修正后完整XSLT代码

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:wd="urn:com.workday/bsvc"
    exclude-result-prefixes="xs"
    version="2.0">
    <xsl:output method="text" omit-xml-declaration="yes" indent="no"/>    
 
    <xsl:template match="/">
        <xsl:variable name="delimeter" select="'|'"/>
        <xsl:variable name="lineFeed" select="'&#xa;'"/>

        <!-- 统计总行数:1行表头 + 每个员工分组2行(HDRCOM/HDRBIO) + 每个税项1行TAXES -->
        <xsl:variable name="groupCount" select="count(distinct-values(wd:Report_Data/wd:Report_Entry/wd:Worker_group/wd:Employee_ID))"/>
        <xsl:variable name="taxLineCount" select="count(wd:Report_Data/wd:Report_Entry[wd:Pay_Component_Category = 'Employee Paid Taxes'])"/>
        <!-- 如果不需要统计表头行,删掉下面表达式里的「1 +」即可 -->
        <xsl:variable name="totalLineCount" select="1 + ($groupCount * 2) + $taxLineCount"/>
        
        <!-- 输出表头 -->
        <xsl:text>Headers</xsl:text>
        <xsl:value-of select="$lineFeed"/>
        
        <xsl:for-each-group select="wd:Report_Data/wd:Report_Entry" group-by="wd:Worker_group/wd:Employee_ID"> 
            
            <!-- HDRCOM - 输出公司详情 -->
            <xsl:text>HDRCOM</xsl:text>
            <xsl:value-of select="$delimeter"/>
            <xsl:value-of select="wd:Worker_group/wd:Company_Name"/>
            <xsl:value-of select="$delimeter"/>
            <xsl:value-of select="wd:Worker_group/wd:Company_Address"/>
            <xsl:value-of select="$lineFeed"/>            
              
            <!-- HDRBIO (员工信息) -->
            <xsl:text>HDRBIO</xsl:text>
            <xsl:value-of select="$delimeter"/>
            <xsl:value-of select="wd:Worker_group/wd:Full_Legal_Name"/>
            <xsl:value-of select="$delimeter"/>
            <xsl:value-of select="wd:Worker_group/wd:Employee_ID"/>
            <xsl:value-of select="$lineFeed"/>                
            
            <!-- TAXES (每种税务类型重复输出该段) -->
            <xsl:for-each select="current-group()">
                <xsl:choose>
                    <xsl:when test="wd:Pay_Component_Category = 'Employee Paid Taxes'">
                        <xsl:text>TAXES</xsl:text>
                        <xsl:value-of select="$delimeter"/>
                        <xsl:value-of select="wd:Pay_Component"/>
                        <xsl:value-of select="$delimeter"/>
                        <xsl:value-of select="wd:Amount"/>
                        <xsl:value-of select="$delimeter"/>
                        <xsl:value-of select="wd:YTD_Amount"/>
                        <xsl:value-of select="$lineFeed"/>
                    </xsl:when>
                </xsl:choose>
            </xsl:for-each>            
           
        </xsl:for-each-group>

        <!-- 输出页脚行,数字前补10个空格对齐格式,可自行调整补位长度 -->
        <xsl:text>TLR|</xsl:text>
        <xsl:value-of select="format-number($totalLineCount, '          00')"/>
    </xsl:template>
</xsl:stylesheet>

说明

  • 总行数统计逻辑可根据业务需求调整:如果不需要把表头Headers行计入总数,删除totalLineCount变量表达式里的1 +即可,按你给出的示例(无表头行、共9条业务记录)调整后会输出TLR| 09,和预期效果完全一致;如果需要把TLR页脚本身也计入总数,在表达式最后追加+ 1
  • 页脚数字的补位格式通过format-number的格式串控制,示例中为补10个空格后输出两位数字,可按需修改补位空格数或数字位数
  • 把xsl:output的indent属性改为no,避免文本输出时自动缩进产生多余空格

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:57:14