You need to go beyond fifth-grade math even though XSLT 1.0 does not.

Pure XSLT implementations are provided for absolute value, square root, logarithms, power, and factorial.

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).

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

Start Free Trial

No credit card required