decimal-format
El elemento decimal-format
permite definir los caracteres y símbolos utilizados para convertir números en cadenas de texto mediante el uso de la función format-number()
.
Se trata de un elemento de nivel superior. Por lo tanto, tiene que aparecer como hijo directo del elemento stylesheet
o del elemento transform
.
La estructura de este elemento es la siguiente:
<xsl:decimal-format
name="string"
decimal-separator="char"
grouping-separator="char"
infinity="string"
minus-sign="char"
NaN="string"
percent="char"
per-mille="char"
zero-digit="char"
digit="char"
pattern-separator="char"
/>
Donde:
name
especifica el nombre del formato.decimal-separator
permite especificar el caracter con el que se separan los decimales. Por defecto, es el punto (.
).grouping-separator
permite especificar el caracter mediante el cual se separan lo miles. Por defecto, es la coma (,
).infinity
permite especificar la cadena utilizada para representar el infinito. Por defecto, su valor esInfinity
.minus-sign
permite especificar el caracter utilizado para indicar números negativos. Por defecto, es el guión medio (-
).NaN
indica la cadena utilizada cuando el valor no es un número.percent
define el caracter utilizado para indicar porcentajes. Por defecto, es%
.per-mille
define el caracter utilizado para indicar tanto por miles.zero-digit
define el caracter cero. Por defecto, es0
.digit
indica el caracter utilizado cuando se quiere reflejar el lugar en el que falta un dígito. Por defecto, es#
.pattern-separator
especifica el caracter utilizado para separar supatrones positivos y negativos dentro de un formato de patrones. Por defecto, es el punto y coma (;
).
Todos los atributos son optativos.
La función format-number()
recibe tres parámetros:
format-number(number,format,[decimalformat])
Donde:
number
es el valor a formatear.format
es el formato que se debe aplicar al número.decimalformat
es el nombre del elementodecimal-format
del cual se debe obtener la configuración. Es un parámetro opcional.
Un ejemplo de su uso se puede ver a continuación:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:decimal-format name="euro" decimal-separator="," grouping-separator="."/>
<xsl:template match="/">
<xsl:value-of select="format-number(26825.8, '#.###,00', 'euro')"/>
</xsl:template>
</xsl:stylesheet>
En el ejemplo anterior, se muestra como formatear la divisa europea.
Un ejemplo completo de su uso sería el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:decimal-format decimal-separator="," grouping-separator="."/>
<xsl:template match="/">
<html>
<body>
<h2>Colección de música</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Título</th>
<th>Artista</th>
<th>Precio</th>
</tr>
<xsl:for-each select="catalogo/cd">
<tr>
<td><xsl:value-of select="titulo"/></td>
<td><xsl:value-of select="artista"/></td>
<td><xsl:value-of select="format-number(precio, '#.##0,00 EUR')"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Consideremos que tenemos el siguiente documento XML:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="hoja.xsl"?>
<catalogo>
<cd>
<titulo>Thriller</titulo>
<artista>Michael Jackson</artista>
<precio>1300</precio>
</cd>
<cd>
<titulo>The Wall</titulo>
<artista>Pink Floyd</artista>
<precio>109.5</precio>
</cd>
<cd>
<titulo>Abbey Road</titulo>
<artista>The Beatles</artista>
<precio>514.95</precio>
</cd>
</catalogo>
En ese caso, la transformación XSLT daría como resultado un documento HTML:
<!DOCTYPE html>
<html>
<body>
<h2>Colección de música</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Título</th>
<th>Artista</th>
<th>Precio</th>
</tr>
<tr>
<td>Thriller</td>
<td>Michael Jackson</td>
<td>1.300,00 EUR</td>
</tr>
<tr>
<td>The Wall</td>
<td>Pink Floyd</td>
<td>109,50 EUR</td>
</tr>
<tr>
<td>Abbey Road</td>
<td>The Beatles</td>
<td>514,95 EUR</td>
</tr>
</table>
</body>
</html>
El documento HTML se visualizaría de la siguiente manera: