2010-02-13 8 views
9

Innerhalb meiner XSLT-Tabelle muss ich eine xsl: -Variable mit dem einen oder anderen Wert definieren, abhängig vom Wert eines xml-Knotens. Der Code unten zeigt, was ich versuche zu tun. Ich möchte auf diese Weise mehrere Variablen definieren.XSLT-Variablen dynamisch mit xsl definieren: Wählen Sie

Ein Hauptproblem ist, dass, um einen Variablenwert basierend auf dem Knotenwert jedes Elements zu wählen, die Auswahl innerhalb von xsl: foreach erfolgen muss, und wenn ich versuche, eine Variable innerhalb von xsl zu definieren 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}"> 

Der Grund Ich mag würde dies erreichen durch die Variablenwert zu ändern, da diese Variablen werden dann in einer mathematischen Funktion, die die Variable durch einen Knotenwert (Preis) multipliziert, die mit jedem anders sein . Hier werden die einmal definierten Variablen verwendet. Vielen Dank.

<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. Ich habe die unten von Dark Falcon angebotene Lösung ausprobiert, aber es gibt mir immer wieder die Fehlermeldung "Öffnen und Beenden von Tags stimmt nicht überein". Derselbe Fehler wie zuvor. Es scheint nicht so zu sein, als ob xsl: wähle, wo ich es habe, da diese Zeilen die Fehlerquellen sind. Hier alle relevanten Sheet-Code:

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

Antwort

0

Dies ist nicht der beste Weg sein, aber:

würde ich empfehlen Sie Ihre Logik Faktor für den Preis heraus in eine Vorlage anzeigt, dann verwenden

<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> 
im Grunde die folgenden
+0

Ich habe versucht, den Anruf-Template-Funktion, wie vorgeschlagen, aber ich die gleichen Fehler zu bekommen. Ich habe meine Frage oben aktualisiert. Vielen Dank! – Alan

+0

Entschuldigung, With-Param muss ein leeres Tag sein. Im Moment hat es kein schließendes Tag. –

11

ich denke, das einzige, was falsch mit Ihrem ursprünglichen Code ist:

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

(No {} weil es ein select und Sie wollen wahrscheinlich eine Nummer in diesen Variablen haben, kein String.)

das wäre so etwas wie dies:

<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

guten Ruf auf die Nummer(). Ich werde den endgültigen Code posten, der funktioniert hat. – Alan

2

Verstanden. Hier ist der Code, der am Ende funktioniert hat. Die Lösung bestand aus einer Kombination von "number()" und dem Aufruf der Variablen, anstatt sie zuerst zu definieren. Danke allen.

<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

Try this:

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