14 Stimmen

Dynamische Definition von XSLT-Variablen mit xsl:choose

In meinem XSLT-Arbeitsblatt muss ich eine xsl:Variable mit dem einen oder anderen Wert definieren, der vom Wert eines XML-Knotens abhängt. Der unten stehende Code zeigt, was ich zu tun versuche. Ich würde gerne mehrere Variablen auf diese Weise definieren.

Ein großes Problem besteht darin, dass die Auswahl eines Variablenwerts auf der Grundlage des Knotenwerts jedes Elements innerhalb von xsl:foreach erfolgen muss, und immer wenn ich versuche, eine Variable innerhalb von xsl:foreach zu definieren, wird ein Fehler angezeigt.

<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, warum ich dies durch das Ändern der Variablenwerte erreichen möchte, ist, dass diese Variablen dann in einer mathematischen Funktion verwendet werden, die die Variable mit einem Knotenwert (Preis) multipliziert, der bei jedem anders sein wird. Hier ist, wie die Variablen, sobald sie definiert sind, verwendet werden. Vielen Dank für Ihre Hilfe.

    <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 stehende Lösung von Dark Falcon ausprobiert, aber ich erhalte immer wieder die Fehlermeldung "Opening and Ending Tags mismatch". Derselbe Fehler wie zuvor. Es scheint nicht zu mögen, dass die xsl:choose, wo ich es haben, da diese Zeilennummern sind, wo die Fehler kommen aus. Hier ist der gesamte relevante Stylesheet-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>

16voto

Lucero Punkte 57715

Ich denke, das einzige, was an Ihrem ursprünglichen Code falsch ist, ist im Grunde das Folgende:

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

(Nein {} denn es ist ein select und Sie wollen wahrscheinlich eine Zahl in dieser Variable haben, keine Zeichenkette).

Das wäre also in etwa so:

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

7voto

Alan Punkte 309

Ich hab's. Hier ist der Code, der am Ende funktioniert hat. Die Lösung war eine Kombination aus der Verwendung von "number( )" und dem direkten Aufruf der Variablen, anstatt sie zuerst zu definieren. Vielen Dank an alle.

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

0voto

Dark Falcon Punkte 42375

Das ist vielleicht nicht der beste Weg, aber:

Ich würde empfehlen, dass Sie Ihre Logik für die Anzeige des Preises in eine Vorlage einbauen und dann

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

0voto

cesar Punkte 1

Versuchen Sie dies:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X