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 ...Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access