I assume that the value specified in the "val"
attribute is a number that has a comma instead of a decimal point.
Several solutions are possible :
I. XSLT 1.0
This conversion is:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:ext="http://exslt.org/common" > <xsl:output method="text"/> <xsl:template match="foo"> <xsl:variable name="vrtfBars"> <xsl:for-each select="bar"> <bar val="{translate(@val, ',', '.')}"/> </xsl:for-each> </xsl:variable> <xsl:value-of select= "sum(ext:node-set($vrtfBars)/*/@val)"/> </xsl:template> </xsl:stylesheet>
when applied to the original XML document :
<foo> <bar val="1,23"/> <bar val="4,56"/> <bar val="7,89"/> </foo>
creates the desired result :
13.68
II. XSLT 2.0
This conversion is :
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="f xs" > <xsl:output method="text"/> <xsl:template match="foo"> <xsl:sequence select= "sum(bar/@val/number(translate(., ',', '.')))" /> </xsl:template> </xsl:stylesheet>
when applied to the same XML document, it gives the same correct result :
13.68
III. FXSL 2.x
This conversion is :
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:f="http://fxsl.sf.net/" xmlns:my="my:fun" exclude-result-prefixes="my f xs" > <xsl:import href="../f/func-transform-and-sum.xsl"/> <xsl:output method="text"/> <xsl:template match="foo"> <xsl:sequence select= "sum( f:transform-and-sum(my:makeNum(), bar/@val ) )" /> </xsl:template> <xsl:function name="my:makeNum" as="xs:double"> <xsl:param name="psNum" as="xs:string"/> <xsl:sequence select="number(translate($psNum, ',', '.'))"/> </xsl:function> <xsl:function name="my:makeNum" as="element()"> <my:makeNum/> </xsl:function> <xsl:template match="my:makeNum" as="xs:double" mode="f:FXSL"> <xsl:param name="arg1" as="xs:string"/> <xsl:sequence select="my:makeNum($arg1)"/> </xsl:template> </xsl:stylesheet>
when applied to the same XML document, it gives the same correct result :
13.68
The latter solution is more flexible and can be successfully used when a more complicated conversion of values ββis required before summing.
Dimitre novatchev
source share