XSLT跨节点元素分组问题:分组<wd:Stage>时XSLT无法运行
解决XSLT分组保留最新条目的问题
核心问题分析
你当前的分组逻辑方向是对的,但大概率是命名空间未正确声明或者Stage节点路径匹配异常导致XSLT无法运行。另外需要确保排序逻辑能正确识别日期时间类型,避免字符串排序的错误。
解决方案步骤
1. 确保命名空间一致
XML中使用了wd前缀,XSLT必须声明完全相同的命名空间URI,否则无法匹配任何节点。比如XML开头如果是:
<wd:Root xmlns:wd="http://workday.com/HR">
那XSLT的stylesheet标签必须加上:
xmlns:wd="http://workday.com/HR"
2. 修正分组与排序逻辑
假设你的主数据节点是wd:Job_Application,完整的分组+保留最新条目的代码如下:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:wd="http://workday.com/HR"> <xsl:output method="xml" indent="yes"/> <xsl:template match="/"> <wd:Filtered_Applications> <!-- 按candidate、CF_LRV_Requisition_ID、Stage组合分组 --> <xsl:for-each-group select="wd:Root/wd:Job_Application" group-by="concat(wd:candidate, '|', wd:CF_LRV_Requisition_ID, '|', wd:Job_Application_Process_Statuses_group/wd:Stage/wd:ID)"> <!-- 按更新时间倒序排序,最新条目排在首位 --> <xsl:sort select="wd:Last_Functionally_Updated" order="descending" data-type="dateTime"/> <!-- 保留每组的第一个条目(最新的) --> <xsl:copy-of select="current-group()[1]"/> </xsl:for-each-group> </wd:Filtered_Applications> </xsl:template> </xsl:stylesheet>
3. 关键注意事项
- 如果
wd:Job_Application_Process_Statuses_group在每个主节点下有多个实例,需要明确指定取哪一个的Stage(比如wd:Job_Application_Process_Statuses_group[1]/wd:Stage/wd:ID),否则分组键会包含多个值导致异常。 - 确认
wd:Last_Functionally_Updated的格式是标准ISO日期时间(如2024-05-20T14:30:00),这样data-type="dateTime"才能正确排序。 - 必须使用XSLT 2.0及以上版本,因为
xsl:for-each-group是2.0版本新增的功能。
内容的提问来源于stack exchange,提问作者Velsus
相关产品推荐
相关产品推荐

