XSL - 对 2 列应用求和,使用不同的键保留所有值

问题描述

使用 saxon 和 xsl 2.0。

源是一个SQL查询,但输入应该是这样的:

<//ROW> 
  <ROW[1]> 
    <col1>1</col1>
    <col2>a</col2>
    <col3>1</col3>
    <col4>a</col4>
  </ROW[1]> 
  <ROW[2]> 
    <col1>2</col1>
    <col2>a</col2>
    <col3>2</col3>
    <col4>a</col4>
  </ROW[2]> 
  <ROW[3]> 
    <col1>3</col1>
    <col2>b</col2>
    <col3>3</col3>
    <col4>b</col4>
  </ROW[3]> 
  <ROW[4]> 
    <col1>6</col1>
    <col2>b</col2>
    <col3>2</col3>
    <col4>a</col4>
  </ROW[4]> 
  <ROW[5]> 
    <col1>1</col1>
    <col2>d</col2>
    <col3>2</col3>
    <col4>a</col4>
  </ROW[5]> 
  <ROW[6]> 
    <col1>6</col1>
    <col2>b</col2>
    <col3>8</col3>
    <col4>c</col4>
  </ROW[6]> 
</ //ROW>

xsl:

<xsl:key name="col4_key" match="//ROW" use="col4">
<xsl:template name = "totals">
  <xsl:for-each-group select = "//ROW" group-by="col2">
    <xsl:variable name="group_total">
      <xsl:value-of select="'./col2'"/>
      <xsl:value-of select="';'"/>
      <xsl:value-of select="sum(current-group()/col1)"/>
      <xsl:value-of select="';'"/>
      <xsl:value-of select="'current-grouping-key()'"/>
      <xsl:value-of select="';'"/>
      <xsl:value-of select="sum(key('col4_key',current-grouping-key())/col3)"/>
      <xsl:value-of select="';'"/>
    </xsl:variable>
    <xsl:value-of select="'&#013;&#010;'"/>
  </xsl:for-each-group>
</xsl:template>

给出结果:

a;  3;  a;  7;
b;  15; b;  3;
d;  1;  d;  0;

我也想获得 c 值,例如:

a;  3;  a;  7;
b;  15; b;  3;
d;  1;  d;  0;
c;  0;  c;  8;

如果问题很琐碎,我很抱歉,但是在此处应用分组以获得所需总和的方法是什么?提前致谢!

解决方法

大概是这样的:

<xsl:variable name="rows" select="//ROW"/>
<xsl:for-each select="distinct-values(($rows/(col2,col4)))" expand-text="yes">
   <xsl:variable name="key" select="."/>
   <xsl:text>{$key}; {sum($rows[col2=$key]/col1])}; {$key}; {sum($rows[col4=$key]/col3])};&#xa;</xsl:text> 
</xsl:for-each>
,

看起来好像您想要对之前未引用的项目进行额外分组,例如

<xsl:key name="col2_key" match="ROW" use="col2"/>

<xsl:for-each-group select="//ROW[not(key('col2_key',col4))]" group-by="col4">
  <xsl:value-of select="current-grouping-key(),sum(current-group()/col3)" separator="; "/>
  <xsl:text>&#10;</xsl:text>
</xsl:for-each-group>

这给出了两个值,例如c 和 8,我不太明白其他列的来源。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...