Altova Mailing List Archives>Archive Index >microsoft.public.xsl Archive Home >Recent entries >Thread Prev - round all nodes that contain a decimal to 2 d.p >Thread Next - Re: round all nodes that contain a decimal to 2 d.p Re: round all nodes that contain a decimal to 2 d.pTo: NULL Date: 12/3/2007 8:13:00 PM
"dickster" <grd@r...> wrote in message
news:551c4d8a-a210-4693-af8a-45474cd39217@e......
>I would like some xslt that would iterate through each node of xml and
> create an exact copy of the xml - except in the case where the node
> contained a decimal where I would like it rounded to 2 places
>
> NB: I don't know the names of nodes with decimals before hand !!!
>
> so
> -------------
> <root>
> <a>
> <x>123.446</x>
> <y>xxx</y>
> </a>
> <b>12.315</b>
> </root>
> -------------
>
> Becomes
>
> -------------
> <root>
> <a>
> <x>123.45</x>
> <y>xxx</y>
> </a>
> <b>12.32</b>
> </root>
> -------------
This transformation (I suppose that all the numbers are positive. If not,
the code will be slightly more complex, but the idea is the same):
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="text()[number(.) = .]">
<xsl:value-of select=
"concat(floor(.),
'.',
round(concat(
substring(substring-after(.,'.'), 1,2),
'.',
substring(substring-after(.,'.'), 3)
)
)
)
"/>
</xsl:template>
</xsl:stylesheet>
when applied on the provided xml document"
<root>
<a>
<x>123.446</x>
<y>xxx</y>
</a>
<b>12.315</b>
</root>
produces the wanted result:
<root>
<a>
<x>123.45</x>
<y>xxx</y>
</a>
<b>12.32</b>
</root>
Cheers,
Dimitre Novatchev
| ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
