2010-09-29 7 views
6

Estoy tratando de mostrar información diferente dependiendo de los datos entrantes. Si es un número entero, quiero mostrar solo el número, si es un decimal, quiero usar el patrón 0.00 #. Ya, lo sé, un poco confuso, pero esa es la especificación de desarrollo. :>¿cuál es la forma correcta de probar xs: decimal en XSL?

Tengo el siguiente XSL para esta sección específica, pero no puedo ver a superar el XSL: cuando el mensaje de error de

"esperaba final de la expresión, que se encuentra número 'moldeable'. (SAVG) -> moldeable < - como xs: decimal"

<xsl:choose> 
    <xsl:when test="number(SAVG) > 0"> 
     <xsl:choose> 
      <xsl:when test="number(SAVG) castable as xs:decimal"> 
       <xsl:value-of select="format-number(SAVG, '###,###,##0.00#')"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="format-number(SAVG, '###,###,##0.###')"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:when> 
    <xsl:when test="number(SAVG) = 0"> 
     <xsl:text disable-output-escaping="yes">&amp;lt;</xsl:text>1 
    </xsl:when> 
    <xsl:otherwise>N/A</xsl:otherwise> 
</xsl:choose> 

I intentado buscar/hurgando en busca de respuestas y he tratado de "instancia de", he intentado usar xsl: if , etc. pero parece que no puedo s para trabajar. Cualquier ayuda sería muy apreciada.

Gracias.

de:

Sí, estamos utilizando 1.0. Lo siento, soy nuevo en el procesamiento XSL, ¿cómo puedo pegar su XSL y la entrada para generar el html?

+0

Esto es XSLT 2.0. Si está ejecutando esto con el procesador XSLT 1.0, dígalo. –

+0

Buena pregunta (+1). Vea mi respuesta para una solución XSLT 2.0 corta y completa. –

+0

He agregado una solución XSLT 1.0 a mi respuesta. –

Respuesta

6

I. XSLT 1.0:

No hay xs: número entero y xs: decimal en el modelo de datos XPath 1.0 utilizados por XSLT 1.0.

Aquí es un fragmento de código que puede utilizar:

<xsl:choose> 
     <xsl:when test="not(floor(SAVG) = SAVG)"> 
      <xsl:value-of select="format-number(SAVG, '###,###,##0.00#')"/> 
     </xsl:when> 
     <xsl:otherwise> <!-- Integer value --> 
      <xsl:value-of select="SAVG"/> 
     </xsl:otherwise> 
    </xsl:choose> 

Ten en cuenta: Para probar si un valor numérico es un número entero, se utiliza la siguiente prueba:

floor($someNum) = $someNum 

Aquí hay una manera de hacerlo:

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:sequence select= 
    "for $num in (3, 3.14) 
    return 
     if($num instance of xs:integer) 
     then ($num, ' is xs:integer', '&#xA;') 
     else if($num instance of xs:decimal) 
      then ($num, ' is xs:decimal', '&#xA;') 
      else ($num, ' is something else', '&#xA;') 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

cuando se aplica esta transformación en cualquier documento XML (no se utiliza), el, resultado correcto querido se produce:

3 is xs:integer 
3.14 is xs:decimal 

O, usando la función format-number() como por su ejemplo :

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xsl:output method="text"/> 

<xsl:template match="/"> 
    <xsl:sequence select= 
    "for $num in (3, 3.14) 
    return 
     if($num instance of xs:integer) 
     then (format-number($num, '###,###,##0.###'), '&#xA;') 
     else if($num instance of xs:decimal) 
      then (format-number($num, '###,###,##0.00#'), '&#xA;') 
      else() 
    "/> 
</xsl:template> 
</xsl:stylesheet> 

produce:

3 
3.14 
+0

@Dimitre: +1 Me gusta este XSLT 2.0 más. –

+0

@Dimitre: OP comenta que necesita XSLT 1.0, ahora –

+0

@Alejandro: agregué también una solución XSLT 1.0. –

0

Este XSLT 1.0 hoja de estilo:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="test"> 
     <xsl:choose> 
      <!-- Not number or number less than zero --> 
      <xsl:when test="0 > SVGA or number(SVGA) != SVGA"> 
       <xsl:text>N/A</xsl:text> 
      </xsl:when> 
      <!-- Number zero --> 
      <xsl:when test="SVGA = 0"> 
       <xsl:text>&lt;1</xsl:text> 
      </xsl:when> 
      <!-- Integer number --> 
      <xsl:when test="floor(SVGA) = SVGA"> 
       <xsl:value-of select="format-number(SVGA,'###,###,##0.###')"/> 
      </xsl:when> 
      <!-- Double number --> 
      <xsl:otherwise> 
       <xsl:value-of select="format-number(SVGA,'###,###,##0.00#')"/> 
      </xsl:otherwise> 
     </xsl:choose> 
     <xsl:text>&#xA;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

Con esta entrada:

<root> 
    <test> 
     <SVGA>0</SVGA> 
    </test> 
    <test> 
     <SVGA>12131</SVGA> 
    </test> 
    <test> 
     <SVGA>123.5654</SVGA> 
    </test> 
    <test> 
     <SVGA>-12.1</SVGA> 
    </test> 
    <test> 
     <SVGA>-7528</SVGA> 
    </test> 
    <test> 
     <SVGA>zero</SVGA> 
    </test> 
</root> 

de salida:

&lt;1 
12,131 
123.565 
N/A 
N/A 
N/A 

Editar 3: Better pedido de prueba (además de la expresión de Dimitre), mejor tes t caso, muestra de entrada más cercana al interrogador.

+0

Sí, estamos usando 1.0. Lamento que soy nuevo en el procesamiento de XSL, ¿cómo pego el XSL y la entrada para generar el html? – PHenry

+0

@PHenry: consulte mi edición para la solución XSLT 1.0. No entiendo lo que quieres decir con 'pegamento (...) para generar el html'. Por favor, publique la muestra de entrada y la salida deseada. –

+0

re pegamento, oh lo siento, quise decir lo que tengo que hacer con esas líneas? Pensé que el XSL entra en un archivo XSL, y la parte html entra en un archivo html, pero no estoy seguro de cómo hacer referencia al xsl del html. si esto es completamente despertado, me disculpo, estoy tratando de aprender mientras voy aquí. – PHenry

Cuestiones relacionadas