Implementing Common Math Functions
Problem
You need to go beyond fifth-grade math even though XSLT 1.0 does not.
Solution
Pure XSLT implementations are provided for absolute value, square root, logarithms, power, and factorial.
Absolute value: math:abs(x)
The obvious but long-winded way to determine the absolute value of a number is shown here:
<xsl:template name="math:abs"> <xsl:param name="x"/> <xsl:choose> <xsl:when test="$x < 0"> <xsl:value-of select="$x * -1"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="$x"/> </xsl:otherwise> </xsl:choose> </xsl:template>
The short but obscure way relies on the fact that the
true
always converts to the number 1 and
false
to the number 0.
<xsl:template name="math:abs"> <xsl:param name="x"/> <xsl:value-of select="(1 - 2 *($x < 0)) * $x"/> </xsl:template>
I prefer the latter because it is concise. Alternatively, you can use an extension function (see Chapter 12).
Square root: math:sqrt(x)
Nate Austin contributed a native
XSLT sqrt
to EXSLT that uses
Newton’s method:
<xsl:template name="math:sqrt"> <!-- The number you want to find the square root of --> <xsl:param name="number" select="0"/> <!-- The current 'try'. This is used internally. --> <xsl:param name="try" select="1"/> <!-- The current iteration, checked against maxiter to limit loop count --> <xsl:param name="iter" select="1"/> <!-- Set this up to ensure against infinite loops --> <xsl:param name="maxiter" select="20"/> <!-- This template was written by Nate Austin using Sir ...
Get XSLT Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.