xslt-3中的计数总和

时间:2018-05-14 13:45:02

标签: xslt-grouping xslt-3.0

鉴于以下示例,

https://xsltfiddle.liberty-development.net/3NzcBsV

每个描述必须只出现一次。 如何在输出报告的第一行中添加在所讨论的xml文件中多次出现的描述元素的数量?

期望的输出:

3 (because "Light Belgian waffles covered with an assortment of fresh berries and whipped cream" was found 2 times, and "Two of our famous Belgian Waffles with plenty of real maple [syrup]" was found 3 times, thus 1+2=3 )
02  Light Belgian waffles covered with an assortment of fresh berries and whipped cream 900
04  Light Belgian waffles covered with an assortment of fresh berries and whipped cream 100
01  Two of our famous Belgian Waffles with plenty of real maple [syrup] 650
01  Two of our famous Belgian Waffles with plenty of real maple [syrup] 350
05  Two of our famous Belgian Waffles with plenty of real maple [syrup] 250

1 个答案:

答案 0 :(得分:0)

将分组的元素存储到容器元素中,并计算不同组的项目(或根据您的需要从该计数中减去一个):

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="3.0">

  <xsl:output method="text" />

  <xsl:template match="breakfast_menu">
      <xsl:variable name="groups">
          <xsl:for-each-group select="food" group-by="description">
              <xsl:sort select="current-grouping-key()"/>
              <xsl:if test="current-group()[2]">
                  <group key="{current-grouping-key()}">
                      <xsl:copy-of select="current-group()"/>
                  </group>
              </xsl:if>
          </xsl:for-each-group>          
      </xsl:variable>
      <xsl:value-of select="sum($groups/group!(count(food) - 1))"/>
      <xsl:text>&#10;</xsl:text>
      <xsl:apply-templates select="$groups/group/food"/>
  </xsl:template>

  <xsl:template match="food">
      <xsl:value-of select="name, description, string(calories)" separator="&#9;"/>
      <xsl:text>&#10;</xsl:text>
  </xsl:template>

</xsl:stylesheet>

https://xsltfiddle.liberty-development.net/3NzcBsV/4