2

簡単に言えば、次のような XML があります (大幅にトリミングされています)。

<Event>
  <Parameter>
    <Name>#ID</Name>
    <Value>3</Value>
  </Parameter>
  <Parameter>
    <Name>AMT</Name>
    <Value>911</Value>
  </Parameter>
</Event>
<Event>
  <Parameter>
    <Name>#ID</Name>
    <Value>3</Value>
  </Parameter>
  <Parameter>
    <Name>AMT</Name>
    <Value>10</Value>
  </Parameter>
</Event>
<Event>
  <Parameter>
    <Name>#ID</Name>
    <Value>4</Value>
  </Parameter>
  <Parameter>
    <Name>AMT</Name>
    <Value>11</Value>
  </Parameter>
</Event>

これから、「#ID」という名前を持つパラメーターに対して同じ「値」を持つすべてのイベント要素を処理したいと考えています。したがって、出力例は次のようになります。

<Result>
  <ID>3</ID>
  <AMT>10</AMT>
  <AMT>11</AMT>
<Result>
<Result>
  <ID>4</ID>
  <AMT>11</AMT>
<Result>

それよりも少し複雑ですが、うまくいけば、これに対する答えがあれば十分です。私の主な問題は、#ID の名前を持つパラメーターで同じ値を持つすべてのイベント要素を収集して処理する方法がわからないことです。

ありがとう。

4

1 に答える 1

1

XSLT2.0 を使用しているため、xsl:for-each-groupを使用して、パラメーター要素の ID でイベント要素をグループ化できます。

<xsl:for-each-group select="Event" group-by="Parameter[Name='#ID']/Value">

「AMT」要素を合計するか、個別に出力するかはわかりませんが、個別に出力するには、これを行います(別の一致するテンプレートを使用して出力します)

<xsl:apply-templates select="current-group()/Parameter[Name='AMT']"/>

そして、それらを合計するには、次のようにします

<xsl:value-of select="sum(current-group()/Parameter[Name='AMT']/Value)"/>

ここに完全な XSLT があります

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="/*">
      <xsl:for-each-group select="Event" group-by="Parameter[Name='#ID']/Value">
         <Result>
            <ID>
               <!-- <xsl:value-of select="Parameter[Name='#ID']/Value"/> -->
               <xsl:value-of select="current-grouping-key()" />
            </ID>
            <xsl:apply-templates select="current-group()/Parameter[Name='AMT']"/>
            <TOTAL_AMT>
               <xsl:value-of select="sum(current-group()/Parameter[Name='AMT']/Value)"/>
            </TOTAL_AMT>
         </Result>
      </xsl:for-each-group>
   </xsl:template>

   <xsl:template match="Parameter[Name='AMT']">
      <AMT>
         <xsl:value-of select="Value"/>
      </AMT>
   </xsl:template>
</xsl:stylesheet>

以下のXMLに当てはめると

<Events>
   <Event>
      <Parameter>
         <Name>#ID</Name>
         <Value>3</Value>
      </Parameter>
      <Parameter>
         <Name>AMT</Name>
         <Value>911</Value>
      </Parameter>
   </Event>
   <Event>
      <Parameter>
         <Name>#ID</Name>
         <Value>3</Value>
      </Parameter>
      <Parameter>
         <Name>AMT</Name>
         <Value>10</Value>
      </Parameter>
   </Event>
   <Event>
      <Parameter>
         <Name>#ID</Name>
         <Value>4</Value>
      </Parameter>
      <Parameter>
         <Name>AMT</Name>
         <Value>11</Value>
      </Parameter>
   </Event>
</Events>

以下が出力されます

<Result>
   <ID>3</ID>
   <AMT>911</AMT>
   <AMT>10</AMT>
   <TOTAL_AMT>921</TOTAL_AMT>
</Result>
<Result>
   <ID>4</ID>
   <AMT>11</AMT>
   <TOTAL_AMT>11</TOTAL_AMT>
</Result>
于 2012-11-20T10:32:26.643 に答える