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="'
'"/> <!-- 统计总行数: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
相关产品推荐
相关产品推荐

