结合相似的行XML

时间:2013-04-19 21:35:21

标签: xslt sum rows

我有一个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。

1 个答案:

答案 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