## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

No credit card required

# 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 ...`

## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

No credit card required