我有一个XML记录,它具有重复的唯一ID,但是想将所有类似的ID组合成1个记录,连接参考字段并总结金额字段。
XML看起来像这样:
<root>
<row>
<F01>123456</F01>
<F02>ABC Company</F02>
<F03>0</F03>
<F04>47582736</F04>
<F05>151.12</F05>
</row>
<row>
<F01>123456</F01>
<F02>ABC Company</F02>
<F03>0</F03>
<F04>47643792</F04>
<F05>191.09</F05>
</row>
<row>
<F01>123456</F01>
<F02>ABC Company</F02>
<F03>0</F03>
<F04>47643793</F04>
<F05>95.32</F05>
</row>
<row>
<F01>223344</F01>
<F02>DK Corp</F02>
<F03>0</F03>
<F04>36819319</F04>
<F05>138.87</F05>
</row>
<row>
<F01>223344</F01>
<F02>DK Corp</F02>
<F03>0</F03>
<F04>36827362</F04>
<F05>9.98</F05>
</row>
<row>
<F01>223344</F01>
<F02>DK Corp</F02>
<F03>0</F03>
<F04>36834497</F04>
<F05>79.87</F05>
</row>
<row>
<F01>113964</F01>
<F02>Direct Company</F02>
<F03>0</F03>
<F04>1771929</F04>
<F05>400.07</F05>
</row>
<row>
<F01>113964</F01>
<F02>Direct Company</F02>
<F03>0</F03>
<F04>1766940</F04>
<F05>111.52</F05>
</row>
<row>
<F01>113964</F01>
<F02>Direct Company</F02>
<F03>0</F03>
<F04>1810269</F04>
<F05>112.48</F05>
</row>
<row>
<F01>113964</F01>
<F02>Direct Company</F02>
<F03>0</F03>
<F04>1618234</F04>
<F05>60.76</F05>
</row>
<row>
<F01>113964</F01>
<F02>Direct Company</F02>
<F03>0</F03>
<F04>1771923</F04>
<F05>2829.19</F05>
</row>
我想让它看起来像这样:
<root>
<row>
<F01>123456</F01>
<F02>ABC Company</F02>
<F03>437.53</F03>
<F04>47582736, 47643792, 47643793</F04>
<F05>151.12</F05>
</row>
<row>
<F01>223344</F01>
<F02>DK Corp</F02>
<F03>228.72</F03>
<F04>36819319, 36827362, 36834497</F04>
<F05>138.87</F05>
</row>
<row>
<F01>113964</F01>
<F02>Direct Company</F02>
<F03>3514.02</F03>
<F04>1771929, 1766940, 1810269, 1618234, 1771923</F04>
<F05>400.07</F05>
</row>
我想我可能知道如何连接F04但不知道如何总结F05并将该值放在F03中。 F01是应该确定要保持在一起的唯一ID。
答案 0 :(得分:2)
当这个XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:key name="kRowByF02" match="row" use="F02"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="/*">
<root>
<xsl:apply-templates
select="row[generate-id() = generate-id(key('kRowByF02', F02)[1])]"/>
</root>
</xsl:template>
<xsl:template match="F03">
<F03>
<xsl:value-of
select="sum(key('kRowByF02', preceding-sibling::F02)/F05)" />
</F03>
</xsl:template>
<xsl:template match="F04">
<F04>
<xsl:apply-templates
select="key('kRowByF02', preceding-sibling::F02)/F04/text()"/>
</F04>
</xsl:template>
<xsl:template match="F04/text()">
<xsl:if test="not(position() = 1)">, </xsl:if>
<xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>
...适用于提供的XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<row>
<F01>123456</F01>
<F02>ABC Company</F02>
<F03>0</F03>
<F04>47582736</F04>
<F05>151.12</F05>
</row>
<row>
<F01>123456</F01>
<F02>ABC Company</F02>
<F03>0</F03>
<F04>47643792</F04>
<F05>191.09</F05>
</row>
<row>
<F01>123456</F01>
<F02>ABC Company</F02>
<F03>0</F03>
<F04>47643793</F04>
<F05>95.32</F05>
</row>
<row>
<F01>223344</F01>
<F02>DK Corp</F02>
<F03>0</F03>
<F04>36819319</F04>
<F05>138.87</F05>
</row>
<row>
<F01>223344</F01>
<F02>DK Corp</F02>
<F03>0</F03>
<F04>36827362</F04>
<F05>9.98</F05>
</row>
<row>
<F01>223344</F01>
<F02>DK Corp</F02>
<F03>0</F03>
<F04>36834497</F04>
<F05>79.87</F05>
</row>
<row>
<F01>113964</F01>
<F02>Direct Company</F02>
<F03>0</F03>
<F04>1771929</F04>
<F05>400.07</F05>
</row>
<row>
<F01>113964</F01>
<F02>Direct Company</F02>
<F03>0</F03>
<F04>1766940</F04>
<F05>111.52</F05>
</row>
<row>
<F01>113964</F01>
<F02>Direct Company</F02>
<F03>0</F03>
<F04>1810269</F04>
<F05>112.48</F05>
</row>
<row>
<F01>113964</F01>
<F02>Direct Company</F02>
<F03>0</F03>
<F04>1618234</F04>
<F05>60.76</F05>
</row>
<row>
<F01>113964</F01>
<F02>Direct Company</F02>
<F03>0</F03>
<F04>1771923</F04>
<F05>2829.19</F05>
</row>
</root>
...生成了想要的结果:
<root>
<row>
<F01>123456</F01>
<F02>ABC Company</F02>
<F03>437.53</F03>
<F04>47582736, 47643792, 47643793</F04>
<F05>151.12</F05>
</row>
<row>
<F01>223344</F01>
<F02>DK Corp</F02>
<F03>228.72</F03>
<F04>36819319, 36827362, 36834497</F04>
<F05>138.87</F05>
</row>
<row>
<F01>113964</F01>
<F02>Direct Company</F02>
<F03>3514.02</F03>
<F04>1771929, 1766940, 1810269, 1618234, 1771923</F04>
<F05>400.07</F05>
</row>
</root>
这是一个典型的分组问题,就XSLT 1.0而言,使用Muenchian Grouping。