如何基于公共键字段拼接不同XML节点中的字段?
按员工姓名合并城市字段
源XML结构
<Employees> <Employee> <Name>ABC</Name> <City>Delhi</City> </Employee> <Employee> <Name>ABC</Name> <City>Mumbai</City> </Employee> <Employee> <Name>KBC</Name> <City>Kolkata</City> </Employee> </Employees>
注:原XML中存在标签闭合错误(</Delhi>应为</City>),已修正以保证XML有效性
现有XSLT代码
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/root"> <Employees> <xsl:for-each-group select="row" group-starting-with="row[Name/text()]"> <Employee> <FIELD7> <xsl:value-of select="City" separator="|"/> </FIELD7> </Employee> </xsl:for-each-group> </Employees> </xsl:template> </xsl:stylesheet>
预期输出
<Employees> <Employee> <Name>ABC</Name> <City>Delhi|Mumbai</City> </Employee> <Employee> <Name>KBC</Name> <City>Kolkata</City> </Employee> </Employees>
修正后的XSLT方案
现有代码存在多处问题:匹配的根节点与源XML不符、分组逻辑错误、输出结构不符合预期,且separator是XSLT 2.0及以上版本特性,需指定对应版本。以下是正确实现:
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/> <xsl:template match="/Employees"> <Employees> <!-- 按Name字段分组 --> <xsl:for-each-group select="Employee" group-by="Name"> <Employee> <Name> <xsl:value-of select="current-grouping-key()"/> </Name> <City> <!-- 拼接当前组内所有City的值 --> <xsl:value-of select="current-group()/City" separator="|"/> </City> </Employee> </xsl:for-each-group> </Employees> </xsl:template> </xsl:stylesheet>
关键说明
- 声明XSLT版本为2.0,确保
separator特性正常生效 - 匹配源XML的根节点
<Employees>,保证遍历路径正确 - 使用
xsl:for-each-group按Name字段分组,current-grouping-key()获取当前组的姓名标识 - 通过
current-group()获取当前组内所有<Employee>节点,提取<City>值并用|拼接
内容的提问来源于stack exchange,提问作者arpitg
相关产品推荐
相关产品推荐

