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

J'essaie d'implémenter une instruction if-else dans XSLT mais mon code n'analyse tout simplement pas. Quelqu'un aurait-il des idées?

  <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>
136
demandé sur kjhughes 2012-11-29 13:14:45

4 réponses

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>
250
répondu px1mp 2012-11-29 09:25:48

L'instruction If 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>

Vous pouvez également utiliser plusieurs balises <xsl:when> pour exprimer des motifs If .. Else If ou Switch 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 serait équivalent au pseudocode ci-dessous:

   if ($CreatedDate > $IDAppendedDate)
   {
       output: <h2>mooooooooooooo</h2>
   }
   else if ($CreatedDate = $IDAppendedDate)
   {
       output: <h2>booooooooooooo</h2>
   }
   else
   {
       output: <h2>dooooooooooooo</h2>
   }
55
répondu InfantPro'Aravind' 2016-12-11 19:06:51

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

  • factorisez l'élément commun h2.
  • factorisez le texte commun ooooooooooooo.
  • soyez conscient de la nouvelle construction XPath 2.0 if/then/else Si vous utilisez XSLT 2.0.

XSLT 1.0 Solution (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>
30
répondu kjhughes 2014-10-21 16:19:12

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

<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 réel de la technique utilisée dans la feuille de style pour un site web gouvernemental: http://w1.weather.gov/xml/current_obs/latest_ob.xsl

2
répondu Raymond Hettinger 2015-03-14 03:23:39