-1

我有一个具有重复唯一 ID 的 XML 记录,但想将所有相似的 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,应该确定要保存的内容。

4

1 回答 1

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

于 2013-04-19T23:16:08.130 回答