2010-02-13 26 views
9

Dentro de mi hoja de cálculo XSLT, necesito definir una variable xsl: con un valor u otro dependiendo del valor de un nodo xml. El código justo debajo muestra lo que intento hacer. Me gustaría definir múltiples variables de esta manera.Definir variables XSLT dinámicamente usando xsl: elegir

Un problema importante es que para elegir un valor variable basado en el valor del nodo de cada elemento, la elección debe hacerse dentro de xsl: foreach, y cada vez que intento definir una variable dentro de xsl: foreach, se muestra error.

<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 razón por la que me gustaría lograr esto a través de cambiar los valores de las variables se debe a que estas variables se utilizan en una función matemática, lo que multiplica la variable por un valor de nodo (precio) que será diferente con cada . Aquí es cómo se usarán las variables, una vez definidas. Muchas gracias

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

ACTUALIZACIÓN: Ok. He intentado la solución provista a continuación por Dark Falcon, pero me sigue dando un error "No coinciden las etiquetas de apertura y final". El mismo error que antes. No parece gustarle tener xsl: elige dónde lo tengo, ya que esos números de línea son de donde provienen los errores. Aquí está todo el código de estilo relevante:

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

Respuesta

0

Esto puede no ser la mejor manera, pero:

Yo recomendaría que se toma su lógica para mostrar el precio a cabo en una plantilla, a continuación, utilizar

<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

He intentado utilizar la función de llamada en plantillas como se sugiere, pero estoy consiguiendo los mismos errores. He actualizado mi pregunta anterior. ¡Gracias! – Alan

+0

Lo sentimos, con-param tiene que ser una etiqueta vacía. En este momento no tiene etiqueta de cierre. –

11

creo que la única cosa mal con su código inicial es básicamente la siguiente:

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

(n {} porque sea un select y es probable que desee tener un número en esa variable, no una cadena.)

Así que sería algo como esto:

<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

buena llamada en el número(). Publicaré el código final que funcionó. – Alan

2

que tenemos. Aquí está el código que terminó funcionando. La solución fue una combinación de usar "number()" y llamar directamente a la variable en lugar de definirla primero. Gracias a todos.

<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

Prueba esto:

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