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 &lt; 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 &lt; 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.