Comment implémenter l'instruction if-else dans XSLT?

171

J'essaye d'implémenter une instruction if -else dans XSLT mais mon code n'analyse tout simplement pas. Quelqu'un a-t-il une idée?

  <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>
Froussard
la source

Réponses:

316

Vous devez le réimplémenter en utilisant <xsl:choose>tag:

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

Si l'instruction est utilisée pour vérifier rapidement une seule condition. Lorsque vous avez plusieurs options, utilisez <xsl:choose>comme illustré ci-dessous:

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

En outre, vous pouvez utiliser plusieurs <xsl:when>balises pour exprimer If .. Else Ifou des Switchmotifs, comme illustré ci-dessous:

   <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'exemple précédent équivaudrait au pseudocode ci-dessous:

   if ($CreatedDate > $IDAppendedDate)
   {
       output: <h2>mooooooooooooo</h2>
   }
   else if ($CreatedDate = $IDAppendedDate)
   {
       output: <h2>booooooooooooo</h2>
   }
   else
   {
       output: <h2>dooooooooooooo</h2>
   }
InfantPro'Aravind '
la source
1
Pourriez-vous s'il vous plaît corriger l'affirmation ci-dessous, nous savons tous que si (case> x) sans suivre {} n'exécutera qu'une ligne suivante, j'ai vu cela sur de nombreux débutants qu'ils écrivent exactement ce que vous avez posté ici, probablement beaucoup d'entre eux copié 1: 1
Oliver
1
Au fait, la if elsecondition n'était qu'un exemple ou plutôt un pseudocode. Eh bien, je considère votre inquiétude et je l'ai édité ..
InfantPro'Aravind '
36

Si je peux offrir quelques suggestions (deux ans plus tard mais j'espère utiles aux futurs lecteurs) :

  • Factorisez l' h2élément commun .
  • Factorisez le oooooooooooootexte commun .
  • Soyez conscient de la nouvelle if/then/elseconstruction XPath 2.0 si vous utilisez XSLT 2.0.

Solution XSLT 1.0 (fonctionne également avec XSLT 2.0)

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

Solution XSLT 2.0

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

L'approche la plus simple consiste à faire un deuxième test if mais avec la condition inversée. Cette technique est plus courte, plus facile pour les yeux et plus facile à obtenir qu'un bloc imbriqué à choisir quand autrement:

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

Voici un exemple concret de la technique utilisée dans la feuille de style d'un site Web gouvernemental: http://w1.weather.gov/xml/current_obs/latest_ob.xsl

Raymond Hettinger
la source
5
Le fait de devoir se souvenir et de s'assurer que le deuxième iftest correspond au complément du premier rend toute modification ultérieure plus sujette à l'erreur.
Philippe-André Lorin
2
Je suis d'accord, mon pote. De plus, je pense que l'exemple ci-dessus est plus difficile à lire, alors que l'utilisation d'un <xsl:choose>serait beaucoup plus simple, sa signification beaucoup plus claire.
Doug Barbieri
1

Originaire de ce billet de blog . Nous pouvons réaliser if else en utilisant le code ci-dessous

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

    </xsl:when>
    <xsl:otherwise>

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

Alors voici ce que j'ai fait

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

Ma sortie

entrez la description de l'image ici

AabinGunz
la source