Re: [xsl] XSLT Feature request

Subject: Re: [xsl] XSLT Feature request
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Mon, 17 Dec 2001 15:48:09 +0000
Hi Frank,

> As it seems, there is only one setting in the above element and this
> affects everything. So we cannot change the stylesheet only, but
> switching output format means changing the decimal-format, every
> format in the stylesheet and every incoming data-source. Couldn't
> there be a spearate setting for output-decimal-separator,
> stylesheet-decimal-separator and input-decimal-separator (maybe with
> default value taken from decimal-separator for compatibility
> reasons) in the next (whatever) XSLT standard??

I *think* that XSLT already gives you what you need, but I might have
missed something in your description.

XPath can only convert a string to a number if it uses a '.' as a
decimal separator and doesn't have any other non-decimal,
non-whitespace characters (so input numbers can't have grouping
separators).  So the results of number() are *always*:

  <number>  12.5   </number>  =>  12.5
  <number>  foo    </number>  =>  NaN
  <number>  12,5   </number>  =>  NaN
  <number> 1,234.5 </number>  =>  NaN

You said that the data holds numbers in the "usual programming way" so
I guess that this will allow you to get the numbers as they should be?

The point of the xsl:decimal-format element is solely to interpret the
format pattern string that you use in format-number(). By default it
uses '.' for decimal points and ',' as the grouping separator so:

  format-number(1234.5, '#,##0.00') => '1,234.5'

But you can override the default decimal format so that you can use a
different decimal point and grouping separator:

  grouping-separator="." />

If you want to use that decimal format, you have to change the format
pattern in the format-number() function:

  format-number(1234.5, '#.##0,00') => '1.234,5'

If you want to chop and change between different numerical formats in
different parts of the stylesheet, you should create named
xsl:decimal-formats for each of the different formats you want to use:

<xsl:decimal-format name="German"
  grouping-separator="." />

<xsl:decimal-format name="AltGerman"
  grouping-separator="'" />

<xsl:decimal-format name="US"
  grouping-separator="," />

Then you can use different formats in different places:

  format-number(1234.5, '#,##0.00', 'US')        => '1,234.5'
  format-number(1234.5, '#.##0,00', 'German')    => '1.234,5'
  format-number(1234.5, "#'##0,00", 'AltGerman') => "1'234,5"

Does that enable you to do what you need to do? Or is there something
further that you need?



Jeni Tennison

 XSL-List info and archive:

Current Thread