2010-12-06 64 views

Répondre

14

XSLT 1.0 n'a pas pour soutenir la notation scientifique.

Ce: number('-1.8959581529998104E-4') Résultat: NaN

Ce: number('-0.000189595815299981') Résultat: -0.000189595815299981

XSLT 2.0 a un support pour la notation scientifique

Ce: number('-1.8959581529998104E-4') Résultat: -0.000189595815299981

EDIT: Une XSLT très simple 1.0 solution de contournement:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="number[substring-after(.,'E')]"> 
     <xsl:variable name="vExponent" select="substring-after(.,'E')"/> 
     <xsl:variable name="vMantissa" select="substring-before(.,'E')"/> 
     <xsl:variable name="vFactor" 
      select="substring('100000000000000000000000000000000000000000000', 
           1, substring($vExponent,2) + 1)"/> 
     <xsl:choose> 
      <xsl:when test="starts-with($vExponent,'-')"> 
       <xsl:value-of select="$vMantissa div $vFactor"/> 
      </xsl:when> 
      <xsl:otherwise> 
       <xsl:value-of select="$vMantissa * $vFactor"/> 
      </xsl:otherwise> 
     </xsl:choose> 
    </xsl:template> 
</xsl:stylesheet> 

Avec cette entrée:

<number>-1.8959581529998104E-4</number> 

Sortie:

-0.00018959581529998104 
+0

@Alejandro, merci encore !!! J'essaye de faire fonctionner ma transformation en utilisant VS2008 dans l'IDE. Ai-je besoin de faire quelque chose pour l'obliger à utiliser la version 2.0 pour xsl? I.e ? – Andez

+0

Il suffit de regarder sur les forums MSDN et la version 2.0 n'est pas supportée dans VS2008. :-( – Andez

+0

@Andez: Il semble que vous pouvez utiliser une implémentation XSLT 2.0, mais vous ne pouvez pas les intégrer avec VS. Lien: http://stackoverflow.com/questions/4099051/saxon-with-visual-studio- 2010-est-il-un-moyen-d'utiliser-le-débogueur –

0

juste essayé avec xsltproc en utilisant libxslt1.1 dans la version 1.1 .24 sous Linux:

XSLT 1.1 est capable de lire en mode exponentiel/format scientifique maintenant même sans aucun modèle dédié, il semble simplement fonctionner :-))

3

Ceci est basé sur la réponse de l'utilisateur357812. Mais je l'ai fait agir comme une fonction et gérer la notation non-scientifique

<xsl:template name="convertSciToNumString" > 
    <xsl:param name="inputVal" select="0"/> 
    <xsl:variable name="vExponent" select="substring-after($inputVal,'E')"/> 
    <xsl:variable name="vMantissa" select="substring-before($inputVal,'E')"/> 
    <xsl:variable name="vFactor" 
     select="substring('100000000000000000000000000000000000000000000', 
          1, substring($vExponent,2) + 1)"/> 
    <xsl:choose> 
     <xsl:when test="number($inputVal)=$inputVal"> 
      <xsl:value-of select="$inputVal"/> 
     </xsl:when> 
     <xsl:when test="starts-with($vExponent,'-')"> 
      <xsl:value-of select="format-number($vMantissa div $vFactor, '#0.#############')"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:value-of select="format-number($vMantissa * $vFactor, '#0.#############')"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:template> 

Utilisation:

<xsl:template match="X"> 
    <X> 
     <xsl:call-template name="convertSciToNumString"> 
      <xsl:with-param name="inputVal" select="text()"/> 
     </xsl:call-template> 
    </X>  
</xsl:template> 

Cela devrait gérer un mélange de notation scientifique et les valeurs décimales.

1

Une autre solution possible sans un modèle:

<xsl:stylesheet version="1.0" ... xmlns:java="http://xml.apache.org/xslt/java"> 
... 
<xsl:value-of select="format-number(java:java.lang.Double.parseDouble('1E-6'), '0.000')"/>