RE: [xsl] xsl:function, arithmetic

Subject: RE: [xsl] xsl:function, arithmetic
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 14 Feb 2005 18:09:22 -0000
> I'm having a few problems with an xsl:function.
> 
> Its supposed to take a numerical parameter and return it multiplied by
> 1.2 and rounded:
> 
> <xsl:function name="my:increase">
>     <xsl:param name="i" />
>     <xsl:value-of select="round(1.2 * $i)" />
> </xsl:function>

Firstly, if you're expecting a numerical parameter it's best to say so:

  <xsl:param name="i" as="xs:double"/>

and if you want to return a numerical result it's best to say so:

  <xsl:function name="my:increase" as="xs:double">

This might be enough to fix the problem (because it will force certain type
conversions), and if it doesn't, it will give you error messages that point
you closer to the answer.

Secondly, xsl:value-of creates a text node. You don't want a text node here,
you want a number. So use xsl:sequence:

<xsl:function name="my:increase" as="xs:double">
     <xsl:param name="i" as="xs:double"/>
     <xsl:sequence select="round(1.2 * $i)" />
</xsl:function> 

In most contexts, if you expect a number and provide an untyped text node,
the number will be extracted from the text node. But it's better to return
the number in the first place.

Michael Kay
http://www.saxonica.com/

> 
> I've tried added an xsl:message to the function to check the XPath
> expression and it seems to be correct, but all the expressions in my
> stylesheet which use this function seem to return 
> non-numerical results.
> I've also tried just returning the parameter unaltered, in 
> which case I
> get no problems. And I've tried things like 'select="$i + $i 
> div 5"' but
> still get the problem.
> 
> I'm using XSLT2, Saxon 8.2B.
> 
> Any ideas?
> 
> Richard

Current Thread