2010-02-13 11 views
9

Dans ma feuille de calcul XSLT, je dois définir une variable xsl: avec une valeur ou une autre en fonction de la valeur d'un nœud xml. Le code ci-dessous montre ce que j'essaie de faire. Je voudrais définir plusieurs variables de cette façon. Un problème majeur est que pour choisir une valeur de variable basée sur la valeur de nœud de chaque élément, le choix doit être fait dans xsl: foreach, et chaque fois que j'essaie de définir une variable dans xsl: foreach montre un Erreur.Définition dynamique des variables XSLT à l'aide de xsl: choisissez

<xsl:for-each select="WORKS/item"> 

<xsl:variable name="rate1"> 
    <xsl:choose> 
     <xsl:when test="rental='new'"> 
      <xsl:value-of select="'.15'" /> 
     </xsl:when> 
     <xsl:when test="rental='used'"> 
      <xsl:value-of select="'.30'" /> 
     </xsl:when> 
    </xsl:choose> 
</xsl:variable> 

<xsl:variable name="rent1" select="{$rate1}"> 

La raison pour laquelle je voudrais y arriver en modifiant les valeurs des variables est parce que ces variables sont ensuite utilisées dans une fonction mathématique, qui multiplie la variable d'une valeur de noeud (prix) qui sera différent chaque . Voici comment les variables, une fois définies, seront utilisées. Merci beaucoup.

<div class="rental-period">1-4 Days:</div> 
    <div class="rental-price"><em>$ <xsl:value-of select='format-number((100*(price * $rent1) div 100), "###.00")'/></em></div> 

    <div class="rental-period">5-7 Days:</div> 
    <div class="rental-price"><em>$ <xsl:value-of select='format-number((100*(price * $rent2) div 100), "###.00")'/></em></div> 

    <div class="rental-period">8-14 Days:</div> 
    <div class="rental-price"><em>$ <xsl:value-of select='format-number((100*(price * $rent3) div 100), "###.00")'/></em></div> 

MISE À JOUR: Ok. J'ai essayé la solution fournie ci-dessous par Dark Falcon, mais elle continue à me donner une erreur "Discordance des balises d'ouverture et de fin". La même erreur qu'avant. Il ne semble pas aimer avoir le xsl: choisir où je l'ai, puisque ces numéros de ligne sont d'où viennent les erreurs. Voici tout le code stylesheet concerné:

<xsl:template name="showPrice"> 
    <xsl:param name="rentalRate"/> 
     <div class="rental-price"><em>$ <xsl:value-of select='format-number((100*(price * $rentalRate) div 100), "###.00")'/></em></div> 
</xsl:template> 


<xsl:template match="/"> 

<xsl:for-each select="WORKS/item"> 

    <div class="rental-info"> 

    <xsl:choose> 
    <xsl:when test="rental='new'"> 
     <xsl:call-template name="showPrice"> 
      <xsl:with-param name="rentalRate" select="'.15'"> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:when test="rental='used'"> 
     <xsl:call-template name="showPrice"> 
      <xsl:with-param name="rentalRate" select="'.30'"> 
     </xsl:call-template> 
    </xsl:when> 
    </xsl:choose> 

     </div> 

</xsl:for-each> 

</xsl:template> 

Répondre

0

Ce ne peut pas être la meilleure façon, mais:

Je vous recommande de factoriser votre logique pour afficher le prix sur dans un modèle, puis utilisez

<xsl:choose> 
    <xsl:when test="rental='new'"> 
     <xsl:call-template name="showPrice"> 
      <xsl:with-param name="rent" select="'.15'" /> 
     </xsl:call-template> 
    </xsl:when> 
    <xsl:when test="rental='used'"> 
     <xsl:call-template name="showPrice"> 
      <xsl:with-param name="rent" select="'.30'" /> 
     </xsl:call-template> 
    </xsl:when> 
</xsl:choose> 
+0

J'ai essayé d'utiliser la fonction de modèle d'appel comme l'a suggéré, mais je suis obtenir les mêmes erreurs. J'ai mis à jour ma question ci-dessus. Merci! – Alan

+0

Désolé, with-param doit être une balise vide. En ce moment, il n'a pas de balise de fermeture. –

11

Je pense que la seule chose qui cloche avec votre code initial est essentiellement ce qui suit:

<xsl:variable name="rent1" select="number($rate1)"> 

(pas {} parce qu'il en fait un select et que vous voulez sans doute avoir un certain nombre dans cette variable, pas une chaîne.)

Donc ce serait quelque chose comme ceci:

<xsl:variable name="rate1"> 
    <xsl:choose> 
    <xsl:when test="rental='new'">0.15</xsl:when> 
    <xsl:otherwise>0.30</xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 
<xsl:variable name="rent1" select="number($rate1)"> 
+0

bon appel sur le numéro(). Je posterai le code final qui a fonctionné. – Alan

2

Got it. Voici le code qui a fini par fonctionner. La solution consistait à utiliser "number()" et à appeler la variable directement au lieu de la définir en premier. Merci a tous.

<xsl:variable name="rate"> 
    <xsl:choose> 
     <xsl:when test="rental='new'"> 
      <xsl:value-of select="'.15'" /> 
     </xsl:when> 
      <xsl:otherwise> 
     <xsl:value-of select="'.30'"/> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:variable> 

<div class="rental-price"><em>$ <xsl:value-of select='format-number((100*(price * number($rate)) div 100), "###.00")'/></em></div> 
0

Essayez ceci:

<xsl:variable name="rate"> 
    <xsl:if test="rental='new'">.15</xsl:if> 
    <xsl:if test="rental='used'">.30</xsl:if> 
</xsl:variable> 

<xsl:call-template name="showPrice"> 
    <xsl:with-param name="rent"> 
      <xsl:value-of select="$rate"/> 
    </xsl:with-param> 
</xsl:call-template> 
Questions connexes