2010-09-29 6 views
6

J'essaie d'afficher différentes informations en fonction des données entrantes. Si c'est un entier, je veux afficher juste le nombre, si c'est un nombre décimal, je veux utiliser le modèle 0.00 #. Ya, je sais, un peu mélangé, mais c'est la spécification de développement. :>quelle est la bonne façon de tester xs: decimal en XSL?

J'ai la XSL suivante pour cette section spécifique, mais je ne peux pas voir à franchir le xsl: lorsque le message d'erreur de

« Fin prévue d'expression, a trouvé « coulable » numéro. (SAVG) -> coulable < - comme xs: décimal »

<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> 

J'ai essayé de regarder/farfouillé pour trouver des réponses et j'ai essayé "exemple de", je l'ai essayé d'utiliser xsl: if , etc mais je ne peux pas sembler obtenir thi s pour travailler. Toute aide serait grandement appréciée.

Merci.

De commentaires:

Oui, nous utilisons 1.0. Je suis désolé je suis nouveau au traitement XSL, comment puis-je coller votre XSL et l'entrée pour générer le code HTML?

+0

Ceci est XSLT 2.0. Si vous utilisez le processeur XSLT 1.0, veuillez le dire. –

+0

Bonne question (+1). Voir ma réponse pour une solution XSLT 2.0 courte et complète. –

+0

J'ai ajouté une solution XSLT 1.0 à ma réponse. –

Répondre

6

I. XSLT 1.0:

Il n'y a pas xs: entier et xs: décimal dans le modèle de données XPath 1.0 utilisées par XSLT 1.0.

Voici un extrait de code que vous pouvez utiliser:

<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> 

Prenez note: Pour tester si une valeur numérique est un entier, nous utilisons le test suivant:

floor($someNum) = $someNum 

Voici une façon de procéder:

<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> 

lorsque cette transformation est appliquée sur tout document XML (non utilisé), le résultat recherché, correct est produit:

3 is xs:integer 
3.14 is xs:decimal 

Ou, en utilisant la fonction format-number() selon votre exemple :

<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> 

produit:

3 
3.14 
+0

@Dimitre: +1 J'aime ce XSLT 2.0 de plus. –

+0

@Dimitre: OP dit qu'il a besoin de XSLT 1.0, maintenant –

+0

@Alejandro: J'ai ajouté une solution XSLT 1.0. –

0

Ce XSLT 1.0 stylesheet:

<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> 

Avec cette entrée:

<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> 

Sortie:

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

Edit 3: meilleur ordre de test (plus l'expression de Dimitre), mieux tes t cas, plus proche de l'échantillon d'interrogation.

+0

Oui, nous utilisons 1.0. Je suis désolé je suis nouveau au traitement XSL, comment puis-je coller votre XSL et entrée pour générer le code HTML? – PHenry

+0

@PHenry: Voir ma modification pour la solution XSLT 1.0. Je ne comprends pas ce que vous entendez par 'colle (...) pour générer le html'. S'il vous plaît, postez l'échantillon d'entrée et la sortie désirée. –

+0

re colle, oh désolé, je voulais dire ce que je dois faire avec ces lignes? J'ai pensé que le XSL va dans un fichier XSL, et la partie html va dans un fichier html, mais je ne suis pas sûr de savoir comment référencer le xsl à partir du html. si cela est complètement perdu, je m'excuse, j'essaie d'apprendre comme je vais ici. – PHenry

Questions connexes