-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 に答える