December 2002
Intermediate to advanced
672 pages
16h 53m
English
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 ...
Read now
Unlock full access