You are missing the opposite case when assigning tempMax :
<xsl:variable name="tempMax"> <xsl:if test="$max < $barSum"> <xsl:value-of select="$barSum"/> </xsl:if> <xsl:if test="$max >= $barSum"> <xsl:value-of select="$max"/> </xsl:if> </xsl:variable>
This is how I tested it (changed using xsl:choose , as suggested by @Mads, even if logically equivalent).
[XSLT 1.0] Tested with Saxon 6.5
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output indent="yes"/> <xsl:template match="/"> <xsl:call-template name="findMaxClusterVal"/> </xsl:template> <xsl:template name="findMaxClusterVal"> <xsl:param name="count" select="count(column-chart-stacked-full/clusters/cluster)"/> <xsl:param name="limit" select="$count"/> <xsl:param name="max" select="0"/> <xsl:if test="$count > 0"> <xsl:variable name ="barSum" select="sum(column-chart-stacked-full/clusters/cluster[$count]/bar/value)"/> <xsl:variable name="tempMax"> <xsl:choose> <xsl:when test="$max < $barSum"> <xsl:value-of select="$barSum"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$max"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:call-template name="findMaxClusterVal"> <xsl:with-param name="count" select="$count - 1"/> <xsl:with-param name="limit" select="$limit"/> <xsl:with-param name="max" select="$tempMax"/> </xsl:call-template> </xsl:if> <xsl:if test="$count = 0"> <xsl:value-of select="$max"/> </xsl:if> </xsl:template> </xsl:stylesheet>
applied to the input asked in the question returns 50 .
Applies to this modified input:
<column-chart-stacked-full> <clusters> <cluster number="1"> <bar> <value>10</value> </bar> <bar> <value>20</value> </bar> </cluster> <cluster number="2"> <bar> <value>20</value> </bar> <bar> <value>30</value> </bar> </cluster> <cluster number="1"> <bar> <value>10</value> </bar> <bar> <value>20</value> </bar> </cluster> <cluster number="2"> <bar> <value>70</value> </bar> <bar> <value>30</value> </bar> </cluster> </clusters> </column-chart-stacked-full>
Returns 100 .
source share