Come implementare l'istruzione if-else in XSLT?


171

Sto cercando di implementare un'istruzione if -else in XSLT ma il mio codice non analizza. Qualcuno ha qualche idea?

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

Possibile duplicato di XSL se altrimenti condizione

Risposte:


316

Devi reimplementarlo usando il <xsl:choose>tag:

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

65

Se l'istruzione viene utilizzata per controllare rapidamente solo una condizione. Quando hai più opzioni, usa <xsl:choose>come illustrato di seguito:

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

Inoltre, puoi usare più <xsl:when>tag per esprimere If .. Else Ifo Switchmotivi come illustrato di seguito:

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

L'esempio precedente sarebbe equivalente allo pseudocodice di seguito:

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

1
Potresti per favore correggere la seguente dichiarazione, sappiamo tutti che se (case> x) senza seguire {} eseguirà solo 1 riga seguente, ho visto questo su molti principianti che scrivono esattamente ciò che hai pubblicato qui, probabilmente molti di loro copiato 1: 1
Oliver

1
A proposito, la if elsecondizione era solo un esempio o piuttosto uno pseudocodice. Bene, considero la tua preoccupazione e l'ho modificata ..
InfantPro'Aravind '

36

Se posso offrire alcuni suggerimenti (due anni dopo, ma si spera utile ai futuri lettori) :

  • Fattorizza l' h2elemento comune .
  • Fattorizza il oooooooooooootesto comune .
  • Prestare attenzione al nuovo if/then/elsecostrutto XPath 2.0 se si utilizza XSLT 2.0.

Soluzione XSLT 1.0 (funziona anche con XSLT 2.0)

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

Soluzione XSLT 2.0

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

1

L'approccio più diretto è fare un secondo if-test ma con la condizione invertita. Questa tecnica è più breve, più facile per gli occhi e più facile da ottenere rispetto a un blocco nidificato quando altrimenti scelto:

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

Ecco un esempio reale della tecnica utilizzata nel foglio di stile per un sito Web del governo: http://w1.weather.gov/xml/current_obs/latest_ob.xsl


5
Dover ricordare e assicurarsi che il secondo iftest corrisponda al complemento del primo rende ogni successiva modifica più soggetta a errori.
Philippe-André Lorin,

2
Sono d'accordo, amico. Inoltre, penso che l'esempio sopra sia più difficile da leggere, mentre l'uso di a <xsl:choose>sarebbe molto più semplice, il suo significato molto più chiaro.
Doug Barbieri,

1

Originariamente da questo post sul blog . Possiamo ottenere se altrimenti utilizzando il codice seguente

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

    </xsl:when>
    <xsl:otherwise>

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

Quindi ecco cosa ho fatto

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

La mia uscita

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.