Wie implementiere ich die if-else-Anweisung in XSLT?


171

Ich versuche, eine if -else-Anweisung in XSLT zu implementieren, aber mein Code wird einfach nicht analysiert. Hat jemand irgendwelche Ideen?

  <xsl:variable name="CreatedDate" select="@createDate"/>
  <xsl:variable name="IDAppendedDate" select="2012-01-01" />
  <b>date: <xsl:value-of select="$CreatedDate"/></b> 

  <xsl:if test="$CreatedDate > $IDAppendedDate">
    <h2> mooooooooooooo </h2>
  </xsl:if>
  <xsl:else>
    <h2> dooooooooooooo </h2>
  </xsl:else>

Mögliches Duplikat von XSL, falls sonst Bedingung

Antworten:


316

Sie müssen es mit dem <xsl:choose>Tag neu implementieren :

       <xsl:choose>
         <xsl:when test="$CreatedDate > $IDAppendedDate">
           <h2> mooooooooooooo </h2>
         </xsl:when>
         <xsl:otherwise>
          <h2> dooooooooooooo </h2>
         </xsl:otherwise>
       </xsl:choose>

65

Wenn die Anweisung verwendet wird, um nur eine Bedingung schnell zu überprüfen. Wenn Sie mehrere Optionen haben, verwenden Sie diese <xsl:choose>wie unten dargestellt:

   <xsl:choose>
     <xsl:when test="$CreatedDate > $IDAppendedDate">
       <h2>mooooooooooooo</h2>
     </xsl:when>
     <xsl:otherwise>
      <h2>dooooooooooooo</h2>
     </xsl:otherwise>
   </xsl:choose>

Sie können auch mehrere <xsl:when>Tags zum Ausdrücken If .. Else Ifoder SwitchMustern verwenden, wie unten dargestellt:

   <xsl:choose>
     <xsl:when test="$CreatedDate > $IDAppendedDate">
       <h2>mooooooooooooo</h2>
     </xsl:when>
     <xsl:when test="$CreatedDate = $IDAppendedDate">
       <h2>booooooooooooo</h2>
     </xsl:when>
     <xsl:otherwise>
      <h2>dooooooooooooo</h2>
     </xsl:otherwise>
   </xsl:choose>

Das vorherige Beispiel entspricht dem folgenden Pseudocode:

   if ($CreatedDate > $IDAppendedDate)
   {
       output: <h2>mooooooooooooo</h2>
   }
   else if ($CreatedDate = $IDAppendedDate)
   {
       output: <h2>booooooooooooo</h2>
   }
   else
   {
       output: <h2>dooooooooooooo</h2>
   }

1
Könnten Sie bitte die folgende Aussage korrigieren, wir alle wissen, dass wenn (case> x) ohne {} nur 1 folgende Zeile ausführt, ich dies bei vielen Anfängern gesehen habe, dass sie genau das schreiben, was Sie hier gepostet haben, wahrscheinlich viele von ihnen kopiert 1: 1
Oliver

1
Die if elseBedingung war übrigens nur ein Beispiel oder eher ein Pseudocode. Nun, ich betrachte Ihr Anliegen und habe es bearbeitet.
InfantPro'Aravind '

36

Wenn ich einige Vorschläge machen darf (zwei Jahre später, aber hoffentlich hilfreich für zukünftige Leser) :

  • Berücksichtigen Sie das gemeinsame h2Element.
  • Berücksichtigen Sie den gemeinsamen oooooooooooooText.
  • Beachten Sie das neue XPath 2.0- if/then/elseKonstrukt, wenn Sie XSLT 2.0 verwenden.

XSLT 1.0-Lösung (funktioniert auch mit XSLT 2.0)

<h2>
  <xsl:choose>
    <xsl:when test="$CreatedDate > $IDAppendedDate">m</xsl:when>
    <xsl:otherwise>d</xsl:otherwise>
  </xsl:choose>
  ooooooooooooo
</h2>

XSLT 2.0-Lösung

<h2>
   <xsl:value-of select="if ($CreatedDate > $IDAppendedDate) then 'm' else 'd'"/>
   ooooooooooooo
</h2>

1

Der einfachste Ansatz besteht darin, einen zweiten Wenn-Test durchzuführen, wobei jedoch die Bedingung umgekehrt ist. Diese Technik ist kürzer, augenschonender und leichter richtig zu machen als ein ansonsten verschachtelter Block:

<xsl:variable name="CreatedDate" select="@createDate"/>
     <xsl:variable name="IDAppendedDate" select="2012-01-01" />
     <b>date: <xsl:value-of select="$CreatedDate"/></b> 
     <xsl:if test="$CreatedDate &gt; $IDAppendedDate">
        <h2> mooooooooooooo </h2>
     </xsl:if>
     <xsl:if test="$CreatedDate &lt;= $IDAppendedDate">
        <h2> dooooooooooooo </h2>
     </xsl:if>

Hier ist ein reales Beispiel für die Technik, die im Stylesheet für eine Regierungswebsite verwendet wird: http://w1.weather.gov/xml/current_obs/latest_ob.xsl


5
Wenn Sie sich merken und sicherstellen müssen, dass der zweite ifTest mit dem Komplement des ersten übereinstimmt, ist jede nachfolgende Änderung fehleranfälliger.
Philippe-André Lorin

2
Ich stimme zu, Pal. Ich denke auch, dass das obige Beispiel schwerer zu lesen ist, während die Verwendung von a <xsl:choose>viel einfacher wäre und seine Bedeutung viel klarer ist.
Doug Barbieri

1

Ursprünglich aus diesem Blogbeitrag . Wir können dies erreichen, indem wir den folgenden Code verwenden

<xsl:choose>
    <xsl:when test="something to test">

    </xsl:when>
    <xsl:otherwise>

    </xsl:otherwise>
</xsl:choose>

Also hier ist was ich getan habe

<h3>System</h3>
    <xsl:choose>
        <xsl:when test="autoIncludeSystem/autoincludesystem_info/@mdate"> <!-- if attribute exists-->
            <p>
                <dd><table border="1">
                    <tbody>
                        <tr>
                            <th>File Name</th>
                            <th>File Size</th>
                            <th>Date</th>
                            <th>Time</th>
                            <th>AM/PM</th>
                        </tr>
                        <xsl:for-each select="autoIncludeSystem/autoincludesystem_info">
                            <tr>
                                <td valign="top" ><xsl:value-of select="@filename"/></td>
                                <td valign="top" ><xsl:value-of select="@filesize"/></td>
                                <td valign="top" ><xsl:value-of select="@mdate"/></td>
                                <td valign="top" ><xsl:value-of select="@mtime"/></td>
                                <td valign="top" ><xsl:value-of select="@ampm"/></td>
                            </tr>
                        </xsl:for-each>
                    </tbody>
                </table>
                </dd>
            </p>
        </xsl:when>
        <xsl:otherwise> <!-- if attribute does not exists -->
            <dd><pre>
                <xsl:value-of select="autoIncludeSystem"/><br/>
            </pre></dd> <br/>
        </xsl:otherwise>
    </xsl:choose>

Meine Ausgabe

Geben Sie hier die Bildbeschreibung ein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.