xslt中的二维分组和求和

xslt中的二维分组和求和,xslt,xslt-1.0,xslt-grouping,Xslt,Xslt 1.0,Xslt Grouping,我的输入xml类似于 <Reports> <Report> <ReportHeader> <Name>ABC</Name> <ReportNo>123</ReportNo> </ReportHeader> <ReportLine> <ReportNo>123</ReportNo> <

我的输入xml类似于

<Reports>
  <Report>  
    <ReportHeader>
      <Name>ABC</Name>
      <ReportNo>123</ReportNo>
    </ReportHeader>
    <ReportLine>
      <ReportNo>123</ReportNo>
      <LineGroup>XYZ</LineGroup>
      <LineAmount>10</LineAmount>
    <ReportLine>
    <ReportLine>
      <ReportNo>123</ReportNo>
      <LineGroup>PQR</LineGroup>
      <LineAmount>20</LineAmount>
    <ReportLine>
    <ReportLine>
    <ReportNo>123</ReportNo>
      <LineGroup>XYZ</LineGroup>
      <LineAmount>30</LineAmount>
    <ReportLine>
  </Report>
  <Report>
    <ReportHeader>
      <Name>DEF</Name>
      <ReportNo>456</ReportNo>
    </ReportHeader>
    <ReportLine>
      <ReportNo>456</ReportNo>
      <LineGroup>IJK</LineGroup>
      <LineAmount>40</LineAmount>
    <ReportLine>
    <ReportLine>
      <ReportNo>456</ReportNo>
      <LineGroup>XYZ</LineGroup>
      <LineAmount>50</LineAmount>
    <ReportLine>
    <ReportLine>
      <ReportNo>456</ReportNo>
      <LineGroup>IJK</LineGroup>
      <LineAmount>60</LineAmount>
    <ReportLine>
  </Report>
</Reports>
<NewReport>
  <Header>
    <Name>ABC</Name>
    <HeaderNo>456</HeaderNo>
  </Header>
  <Line>
    <LineGroup>XYZ</LineGroup>
    <Amount>40</Amount>
  </Line>
  <Line>
    <LineGroup>PQR</LineGroup>
    <Amount>20</Amount>
  </Line>
</NewReport>
<NewReport>
  <Header>
    <Name>DEF</Name>
    <HeaderNo>456</HeaderNo>
  </Header>
  <Line>
    <LineGroup>IJK</LineGroup>
    <Amount>100</Amount>
  </Line>
  <Line>
    <LineGroup>XYZ</LineGroup>
    <Amount>50</Amount>
  </Line>
</NewReport>
我的输出xml类似于

<Reports>
  <Report>  
    <ReportHeader>
      <Name>ABC</Name>
      <ReportNo>123</ReportNo>
    </ReportHeader>
    <ReportLine>
      <ReportNo>123</ReportNo>
      <LineGroup>XYZ</LineGroup>
      <LineAmount>10</LineAmount>
    <ReportLine>
    <ReportLine>
      <ReportNo>123</ReportNo>
      <LineGroup>PQR</LineGroup>
      <LineAmount>20</LineAmount>
    <ReportLine>
    <ReportLine>
    <ReportNo>123</ReportNo>
      <LineGroup>XYZ</LineGroup>
      <LineAmount>30</LineAmount>
    <ReportLine>
  </Report>
  <Report>
    <ReportHeader>
      <Name>DEF</Name>
      <ReportNo>456</ReportNo>
    </ReportHeader>
    <ReportLine>
      <ReportNo>456</ReportNo>
      <LineGroup>IJK</LineGroup>
      <LineAmount>40</LineAmount>
    <ReportLine>
    <ReportLine>
      <ReportNo>456</ReportNo>
      <LineGroup>XYZ</LineGroup>
      <LineAmount>50</LineAmount>
    <ReportLine>
    <ReportLine>
      <ReportNo>456</ReportNo>
      <LineGroup>IJK</LineGroup>
      <LineAmount>60</LineAmount>
    <ReportLine>
  </Report>
</Reports>
<NewReport>
  <Header>
    <Name>ABC</Name>
    <HeaderNo>456</HeaderNo>
  </Header>
  <Line>
    <LineGroup>XYZ</LineGroup>
    <Amount>40</Amount>
  </Line>
  <Line>
    <LineGroup>PQR</LineGroup>
    <Amount>20</Amount>
  </Line>
</NewReport>
<NewReport>
  <Header>
    <Name>DEF</Name>
    <HeaderNo>456</HeaderNo>
  </Header>
  <Line>
    <LineGroup>IJK</LineGroup>
    <Amount>100</Amount>
  </Line>
  <Line>
    <LineGroup>XYZ</LineGroup>
    <Amount>50</Amount>
  </Line>
</NewReport>
我使用的XSL是

<xsl:key name="KLinesByGroup" match="/Reports/Report/ReportLine" use="LineGroup"/>
<xsl:key name="KLinesByReportNo" match="/Reports/Report/ReportLine" use="ReportNo"/>
<xsl:template match="/">
  <xsl:for-each select="/ns2:Reports/ns2:Report">
     <xsl:variable name="HeaderReportNo"><xsl:value-of select="ReportHeader/ReportNo"/></xsl:variable>
     <Header>
       <Name><xsl:value-of select="ReportHeader/Name"/></Name>
       <HeaderNo><xsl:value-of select="ReportHeader/ReportNo"/></HeaderNo>
       <xsl:apply-templates select="key('KLinesByReportNo', $HeaderReportNo)[1]" mode="reportno-mode"/>
     </Header>
  </xsl:for-each>
</xsl:template>

<xsl:template match="ReportLine" mode="reportno-mode">
  <xsl:apply-templates select="key('KLinesByReportNo', ReportNo)[generate-id() = generate-id(key('KLinesByGroup', LineGroup)[1])]" mode="group-mode"/>
</xsl:template>

<xsl:template match="ReportLine" mode="group-mode">
  <Line>
    <xsl:value-of select="sum(key('KLinesByGroup', LineGroup)/LineAmount)"/>
  </Line>
</xsl:template>
但结果并不是我所期望的。我得到的输出是在组级别或行级别添加所有金额,但不是在行级别和组级别。谁能帮忙吗

感谢这一转变:

当应用于所提供的XML时,已从几个格式错误的标记文档中更正:

生成所需的正确结果:

说明:


正确使用组合键和。

完美!!!!为了满足实际需求,我不得不花了点时间……但谢谢你的代码。
<NewReport>
   <Header>
      <Name>ABC</Name>
      <HeaderNo>123</HeaderNo>
   </Header>
   <Line>
      <LineGroup>XYZ</LineGroup>
      <Amount>40</Amount>
   </Line>
   <Line>
      <LineGroup>PQR</LineGroup>
      <Amount>20</Amount>
   </Line>
</NewReport>
<NewReport>
   <Header>
      <Name>DEF</Name>
      <HeaderNo>456</HeaderNo>
   </Header>
   <Line>
      <LineGroup>IJK</LineGroup>
      <Amount>100</Amount>
   </Line>
   <Line>
      <LineGroup>XYZ</LineGroup>
      <Amount>50</Amount>
   </Line>
</NewReport>