¿Cómo implementar la instrucción if-else en XSLT?

171

Estoy tratando de implementar una declaración if -else en XSLT pero mi código simplemente no analiza. ¿Alguien tiene alguna 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>
Miedoso
fuente
Posible duplicado de XSL si otra condición

Respuestas:

316

Tienes que volver a implementarlo usando la <xsl:choose>etiqueta:

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

Si la declaración se usa para verificar una sola condición rápidamente. Cuando tenga varias opciones, use <xsl:choose>como se ilustra a continuación:

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

Además, puede usar varias <xsl:when>etiquetas para expresar If .. Else Ifo Switchpatrones como se ilustra a continuación:

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

El ejemplo anterior sería equivalente al pseudocódigo siguiente:

   if ($CreatedDate > $IDAppendedDate)
   {
       output: <h2>mooooooooooooo</h2>
   }
   else if ($CreatedDate = $IDAppendedDate)
   {
       output: <h2>booooooooooooo</h2>
   }
   else
   {
       output: <h2>dooooooooooooo</h2>
   }
InfantPro'Aravind '
fuente
1
¿Podría corregir la siguiente declaración, todos sabemos que si (caso> x) sin seguir {} solo ejecutará 1 línea siguiente, he visto esto en muchos principiantes que escriben exactamente lo que ha publicado aquí, probablemente muchos de ellos copiado 1: 1
Oliver
1
Por cierto, la if elsecondición era solo un ejemplo o más bien un pseudocódigo. Bueno, considero tu preocupación y la he editado ..
InfantPro'Aravind '
36

Si puedo ofrecer algunas sugerencias (dos años después, pero espero que sea útil para futuros lectores) :

  • Factorizar lo común h2 elemento .
  • Factorizar lo común ooooooooooooo texto .
  • Tenga en cuenta la nueva if/then/elseconstrucción XPath 2.0 si usa XSLT 2.0.

Solución XSLT 1.0 (también funciona con XSLT 2.0)

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

Solución XSLT 2.0

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

El enfoque más directo es hacer una segunda prueba si, pero con la condición invertida. Esta técnica es más corta, más fácil para los ojos y más fácil de entender que un bloque anidado de elegir cuándo:

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

Aquí hay un ejemplo del mundo real de la técnica que se usa en la hoja de estilo para un sitio web del gobierno: http://w1.weather.gov/xml/current_obs/latest_ob.xsl

Raymond Hettinger
fuente
55
Tener que recordar y asegurarse de que la segunda ifprueba coincida con el complemento de la primera hace que cualquier modificación posterior sea más propensa a errores.
Philippe-André Lorin el
2
Estoy de acuerdo, amigo. Además, creo que el ejemplo anterior es más difícil de leer, mientras que usar a <xsl:choose>sería mucho más directo, su significado es mucho más claro.
Doug Barbieri
1

Originalmente de esta publicación de blog . Podemos lograrlo si no, usando el siguiente código

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

    </xsl:when>
    <xsl:otherwise>

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

Entonces esto es lo que hice

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

Mi salida

ingrese la descripción de la imagen aquí

AabinGunz
fuente