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