Computing Statistical Functions
You need to compute averages, variances, and standard deviations.
Three types of averages are used by statisticians: the mean (layperson’s average), the median, and the mode.
The mean is trivial—simply sum using Recipe 2.6 and divide by the count.
The median is the number that falls in the middle of the set of numbers when they are sorted. If the count is even, then the mean of the two middle numbers is generally taken:
<xsl:template name="math:median"> <xsl:param name="nodes" select="/.."/> <xsl:variable name="count" select="count($nodes)"/> <xsl:variable name="middle" select="ceiling($count div 2)"/> <xsl:variable name="even" select="not($count mod 2)"/> <xsl:variable name="m1"> <xsl:for-each select="$nodes"> <xsl:sort data-type="number"/> <xsl:if test="position( ) = $middle"> <xsl:value-of select=". + ($even * ./following-sibling::*)"/> </xsl:if> </xsl:for-each> </xsl:variable> <!-- The median --> <xsl:value-of select="$m1 div ($even + 1)"/> </xsl:template>
Handling the even case relies on the Boolean-to-number conversion
trick used in several other examples in this book. If the number of
nodes is odd,
$m1 ends up being equal to the
middle node, and you divide by 1 to get the answer. On the other
hand, if the number of nodes is odd,
$m1 ends up
being the sum of the two middle nodes, and you divide by two to get
The mode is the most frequently occurring element(s) in a set of elements that need not be numbers. If ...