问题
Given the following example,
https://xsltfiddle.liberty-development.net/3NzcBsV
each description must occur only once. How one could add in the first row of the output report the number of description elements that have occurred more than once in the xml file under question?
Desired output:
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:
Store the grouped elements into a container element and count the items of the different groups (or substract one from that count as you seem to want):
<?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> </xsl:text>
<xsl:apply-templates select="$groups/group/food"/>
</xsl:template>
<xsl:template match="food">
<xsl:value-of select="name, description, string(calories)" separator="	"/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>
https://xsltfiddle.liberty-development.net/3NzcBsV/4
来源:https://stackoverflow.com/questions/50331888/sum-of-count-in-xslt-3