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>

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>

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

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>

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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.