XSL 加入 2 个组语句以进行输出

Posted

技术标签:

【中文标题】XSL 加入 2 个组语句以进行输出【英文标题】:XSL joining 2 group statements for output 【发布时间】:2021-07-09 17:19:53 【问题描述】:

使用 saxon,我正在尝试打印由 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 的值时,就会出现问题

【问题讨论】:

考虑发布一个小而有代表性的 XML 输入示例。第 2 列和第 4 列中的 ab 值是否与该值相关? 抱歉,但根据这些信息,我真的不知道您的输入 XML 和输出 XML 是什么样的,或者它们如何相互关联。大概表的前 7 行是输入值,最后 3 行是计算的输出值。我看不出cols 3/4的总数的计算需要与cols 1/2的计算有什么不同。我想这就是试图从单个示例中推断出规范的危险。 对不起,我是撒克逊人的新手,并且在其他人开发的基础上工作。是的,前 7 个应该输入,后 3 个是我想要得到的。我至少没有直接从 xml 加载任何东西,但是表中的每一行都可以被列引用,所以它应该是这样的: ... [1]> ... 【参考方案1】:

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

【讨论】:

效果很好,还有一件事。我需要它来运行 col4 中不在 col2 中的值。有没有办法将它们附加到现有组或之后运行而不创建重复项? @meta,提出一个包含必要细节的新问题。

以上是关于XSL 加入 2 个组语句以进行输出的主要内容,如果未能解决你的问题,请参考以下文章

使用参数作为 XSL 选择语句的参数

XSL/FO 在选择语句中跳过一个值

如何加入 2 SELECT 语句,但仅在表 B 上满足表 A 的条件时显示输出

如何计算没有。 xsl:choose 语句在 xsl:for-each 中执行的次数?

XSL 转换以输出许多嵌入式 XSL 样式表

在tokenize()中使用XSL XPATH if语句