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>&#xA;Division by zero in XSLT 2.0:&#xA;&#xA;</xsl:text> <xsl:text>&lt;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.