我的源 xml 文件具有以下形式的元素:
<Employees>
<Employee>
<Name>ABC</Name>
<City>Delhi</Delhi>
</Employee>
<Employee>
<Name>ABC</Name>
<City>Mumbai</Delhi>
</Employee>
<Employee>
<Name>KBC</Name>
<City>Kolkata</Delhi>
</Employee>
</Employees>
我使用了以下 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>
在这里,如果员工的姓名相同,那么 XSLT 会将城市与管道连接起来。我的预期输出。
<Employees>
<Employee>
<Name>ABC</Name>
<City>Delhi|Mumbai</Delhi>
</Employee>
<Employee>
<Name>KBC</Name>
<City>Kolkata</Delhi>
</Employee>
</Employees>
您已将问题标记为 XSLT 1.0,但在尝试中您使用了 XSLT 2/3
for-each-group
,因此假设您使用的是 XSLT 3 处理器,例如当前版本的 Saxon Java、Saxon JS 或 SaxonC 或 SaxonCS 或 .NET,您会需要这样的代码
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode on-no-match="shallow-copy"/>
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/Employees">
<xsl:copy>
<xsl:for-each-group select="Employee" group-by="Name">
<xsl:copy>
<xsl:apply-templates/>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
<xsl:template match="Employee/City">
<xsl:copy>
<xsl:value-of select="current-group()/City" separator="|"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
在线小提琴使用 Saxon 12 HE。