2010-02-13 3 views
9

All'interno del foglio di calcolo XSLT, è necessario definire una variabile xsl: con un valore o un altro in base al valore di un nodo xml. Il codice appena sotto mostra quello che sto cercando di fare. Mi piacerebbe definire più variabili in questo modo.Definire dinamicamente le variabili XSLT utilizzando xsl: scegliere

Una questione importante è che per scegliere un valore variabile in base al valore del nodo di ogni elemento, la scelta deve avvenire entro xsl: foreach, e ogni volta che provo definire una variabile all'interno xsl: foreach mostra un errore.

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

Il motivo desidero realizzare questo through cambiando i valori delle variabili è perché tali variabili vengono poi utilizzati in una funzione matematica, che moltiplica la variabile da un valore di nodo (prezzo) che sarà diverso per ogni . Ecco come verranno utilizzate le variabili, una volta definite. Grazie mille.

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

UPDATE: Ok. Ho provato la soluzione fornita di seguito da Dark Falcon, ma continua a darmi un errore "Apertura e chiusura dei tag non corrispondenti". Lo stesso errore di prima. Non sembra piacere avere xsl: scegli dove trovarlo, dato che quei numeri di riga sono da dove provengono gli errori. Qui è tutto il codice foglio di stile in questione:

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

risposta

0

Questo non può essere il modo migliore, ma:

ti consiglierei di fattore la logica per la visualizzazione del prezzo fuori in un modello, quindi utilizzare

<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

Ho provato ad utilizzare la funzione di call-modello come suggerito, ma sto ottenendo gli stessi errori. Ho aggiornato la mia domanda sopra. Grazie! – Alan

+0

Siamo spiacenti, con-param deve essere un tag vuoto. Al momento non ha tag di chiusura. –

11

credo che l'unica cosa sbagliata con il codice iniziale è sostanzialmente il seguente:

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

(No {} perché esso Un select e probabilmente desidera avere un numero in quella variabile, non è una stringa.)

così che sarebbe qualcosa di simile:

<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

buona chiamata sul numero(). Pubblicherò il codice finale che ha funzionato. – Alan

2

ottenuto. Ecco il codice che ha finito per funzionare. La soluzione era una combinazione di usare "number()" e chiamare direttamente la variabile invece di definirla per prima. Ringrazia tutti.

<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

Prova questa:

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