首页 > 解决方案 > XSL 加入 2 个组语句以进行输出

问题描述

使用撒克逊语,我正在尝试从由 sql 获取的表中以特定格式打印到 csv 中的总数。结构应该是这样的,我想要得到的总数也可以在这里看到:

桌子

要记住 col2 可以有任何字母,但 col4 只能有 a、b 或 c

粗略了解输入的外观:

<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>a</col2>
    <col3>3</col3>
    <col4>a</col4>
  </ROW[3]> 
  <ROW[4]> 
    <col1>6</col1>
    <col2>b</col2>
    <col3>2</col3>
    <col4>a</col4>
  </ROW[4]> 
  ... 
</ ROW>

只为 col1 做总计应该很容易:

<xsl:template name = "totals">
  <xsl:for-each-group select = "//ROW" group-by="col2">
    <xsl:variable name="group_total">
      <xsl:value-of select="sum(current-group()/col1)"/>
      <xsl:value-of select="';'"/>
    </xsl:variable>
    <xsl:value-of select="'&#013;&#010;'"/>
  </xsl:for-each-group>
</xsl:template>

但是在同一行中加入 col3 总计的最佳方法是什么,例如 a 的总计位于 a 旁边?我认为调用模板并传递 col2 值以按照相同的原则运行总计,但是当 col2 没有来自 col4 的值时,就会出现问题

标签: xsltsaxon

解决方案


我不擅长想象输入结构,但如果你声明一个键<xsl:key name="by-col4" match="ROW" use="col4"/>然后sum(key('by-col4', current-grouping-key())/col3)在你的内部使用for-each-group它可能会给出你所显示的结果。


推荐阅读