XSLT技术实现:统计员工唯一追溯周期行数并求和
XSLT统计追溯周期总行数解决方案
需求说明
- 统计规则:XML中每个
Report_Entry对应一名员工,其下Payroll_Result_Lines_within_Date_Range节点可能包含多个Retro_Prd_End(追溯周期结束日期),同一员工的相同日期仅计1次,最终求和所有员工的有效计数。 - 示例验证:Mick(00001)计数0,Don(00002)计数1,Adam(00003)计数3,总计4。
错误代码分析
你尝试的两段代码均存在逻辑或路径问题:
- 第一段代码中,
../Payroll_Result_Lines_within_Date_Range路径错误——上下文处于Report_Entry/Worker/ID节点,../仅回到Worker节点,无法定位到Report_Entry下的Payroll_Result_Lines_within_Date_Range;同时直接拼接员工ID和日期后去重,不符合“按员工分组去重日期再求和”的逻辑。 - 第二段代码逻辑错误:
ID[distinct-values(...)]是筛选存在追溯日期的员工ID,统计的是有追溯记录的员工数量,而非所有去重后的日期总数。
正确实现代码
使用XSLT 2.0及以上版本的分组+求和逻辑,即可满足需求:
<xsl:variable name="CountERSRetroLines" select=" sum( for $entry in Report_Data/Report_Entry return count(distinct-values($entry/Payroll_Result_Lines_within_Date_Range/Retro_Prd_End)) ) "/>
代码逻辑说明
- 遍历所有
Report_Entry节点(每个节点对应一名员工); - 对每个员工下的
Retro_Prd_End日期去重,统计该员工的有效追溯周期数量; - 将所有员工的有效数量求和,得到最终统计值。
示例验证
- Mick的
Report_Entry无Retro_Prd_End节点,计数为0; - Don的
Retro_Prd_End去重后剩1个,计数为1; - Adam的
Retro_Prd_End去重后剩3个,计数为3; - 求和结果:
0+1+3=4,完全匹配示例预期。
内容的提问来源于stack exchange,提问作者Chilly Pepper
相关产品推荐
相关产品推荐

