Math Works Differently in Some Cases
XSLT 1.0 featured a simple number
datatype. Math operations,
particularly anything dealing with division by zero, work differently
in XSLT 2.0.
To make things more complicated, XSLT 2.0 handles different
kinds of numbers differently. Dividing an xs:integer
or xs:decimal
by zero is a fatal error, while
dividing an xs:double
or xs:float
returns INF
(infinity).
The simplest way to avoid this error is to add version="1.0"
to the element. That causes
the XSLT 2.0 processor to evaluate the expression in XSLT 1.0 mode, so
your stylesheets will behave as they always have.
<xsl:variable version="1.0" name="ratio"
select="$orders div $returns"/>
A more sophisticated approach is to use the new XPath if
operator. For example, you could change
the code like this:
<xsl:variable name="ratio" select="if ($returns != 0) then $orders div $returns else 0"/>
If the value of $returns
is
not equal to zero, we perform the calculation; otherwise, we return
zero.
Division works with six datatypes: xs:integer
,
xs:decimal
, xs:float
, xs:double
, xs:yearMonthDuration
, and xs:dayTimeDuration
. Here’s a stylesheet that
illustrates how division by zero works:
<?xml version="1.0"?>
<!-- divide-by-zero.xsl --> <xsl:stylesheet version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:text>
Division by zero in XSLT 2.0:

</xsl:text> <xsl:text><xsl:value-of select="1 ...
Get XSLT, 2nd Edition 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.