XSL - 对具有不同键的 2 列应用总和,保留所有值
XSL - applying sum for 2 columns with different keys keeping all values
使用 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="'
'"/>
</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: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> </xsl:text>
</xsl:for-each-group>
这给出了两个值,例如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])};
</xsl:text>
</xsl:for-each>
使用 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="'
'"/>
</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: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> </xsl:text>
</xsl:for-each-group>
这给出了两个值,例如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])};
</xsl:text>
</xsl:for-each>