Como implementar a declaração if-else no XSLT?

Estou a tentar implementar uma declaração if-else no XSLT, mas o meu código não se compara. Alguém tem alguma ideia?

  <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>
Author: kjhughes, 2012-11-29

4 answers

Tem de reimplementá-lo usando <xsl:choose> etiqueta:

       <xsl:choose>
         <xsl:when test="$CreatedDate > $IDAppendedDate">
           <h2> mooooooooooooo </h2>
         </xsl:when>
         <xsl:otherwise>
          <h2> dooooooooooooo </h2>
         </xsl:otherwise>
       </xsl:choose>
 250
Author: px1mp, 2012-11-29 09:25:48

Se a declaração for usada para verificar apenas uma condição rapidamente. Quando tiver várias opções, utilize <xsl:choose> como ilustrado abaixo:

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

Também pode usar várias marcas <xsl:when> para expressar os padrões If .. Else If ou Switch como ilustrado em baixo:

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

O exemplo anterior seria equivalente ao pseudocódigo abaixo:

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

Se eu puder oferecer algumas sugestões (dois anos mais tarde, mas esperançosamente útil aos leitores futuros):

  • eliminar o elemento comum h2.
  • Factor para fora o texto comum ooooooooooooo.
  • esteja ciente da nova construção do XPath 2. 0 if/then/else se usar o XSLT 2. 0.

XSLT 1, 0 solução (também funciona com o 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 Solução

<h2>
   <xsl:value-of select="if ($CreatedDate > $IDAppendedDate) then 'm' else 'd'"/>
   ooooooooooooo
</h2>
 30
Author: kjhughes, 2014-10-21 16:19:12

A abordagem mais directa é fazer um segundo teste if, mas com a condição invertida. Esta técnica é mais Curta, mais fácil nos olhos e mais fácil de acertar do que um bloco aninhado:

<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>
Aqui está um exemplo real da técnica que está sendo usada na folha de estilo para um site do governo: http://w1.weather.gov/xml/current_obs/latest_ob.xsl
 2
Author: Raymond Hettinger, 2015-03-14 03:23:39