基于XSLT的for-each-group按RAPID_ID分组实现XML转换
XSLT按ID分组合并
实现思路
- 采用XSLT 2.0及以上版本的
for-each-group指令,以输入XML中的ID(即RAPID_ID)作为分组键,对所有 - 每组外层的公共字段统一提取组内
CustomerType='Primary'的记录对应值,保证公共信息一致性 - 遍历同组内的所有
完整可运行XSLT代码
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" indent="yes" omit-xml-declaration="no"/> <xsl:template match="/"> <Root> <!-- 按ID字段对所有Output节点分组 --> <xsl:for-each-group select="Root/Output" group-by="ID"> <Output> <!-- 定义变量获取组内主客户记录,用于提取公共字段 --> <xsl:variable name="primaryRecord" select="current-group()[CustomerType='Primary'][1]"/> <ID><xsl:value-of select="current-grouping-key()"/></ID> <CustomerName><xsl:value-of select="$primaryRecord/CustomerName"/></CustomerName> <BranchName><xsl:value-of select="$primaryRecord/BranchName"/></BranchName> <SchemeName><xsl:value-of select="$primaryRecord/SchemeName"/></SchemeName> <MobileNumber><xsl:value-of select="$primaryRecord/MobileNumber"/></MobileNumber> <!-- 遍历组内所有记录生成去重明细节点 --> <xsl:for-each select="current-group()"> <DedupeDetails> <CustomerType><xsl:value-of select="CustomerType"/></CustomerType> <CustomerName><xsl:value-of select="CustomerName"/></CustomerName> <DedupeFound><xsl:value-of select="DedupeFound"/></DedupeFound> </DedupeDetails> </xsl:for-each> </Output> </xsl:for-each-group> </Root> </xsl:template> </xsl:stylesheet>
关键逻辑说明
group-by="ID":指定分组的唯一键为输入中的ID字段,符合RAPID_ID分组的需求current-grouping-key():直接获取当前分组的ID值,避免重复读取节点字段带来的冗余$primaryRecord变量:固定取组内第一条主客户记录的公共字段,避免同组内公共字段取值冲突- 内层
current-group()遍历:完整输出组内所有记录的明细字段,不会遗漏任意一条原始记录
注意事项
- 代码基于XSLT 2.0版本开发,需要使用支持XSLT 2.0的解析器运行(如Saxon 9及以上版本)
- 如果输入中可能出现同组无Primary客户的情况,可以按需调整
$primaryRecord的取值逻辑,比如默认取组内第一条记录的对应字段
内容的提问来源于stack exchange,提问作者Chennai Cheetah
相关产品推荐
相关产品推荐

