a.css

esbudellant estàndards


Condicionals en XSLT

02/07/07

Els condicional en XSLT poden ser de dos tipus: IF o CHOOSE.

La particularitat de l'IF a diferència d'altres llenguatges és que no té opció d'usar un ELSE o similar.

L'ús és de l'estil de:


<xsl:if test="expressió XPath">
   ( codi condicionat per l'expressió XPath )
</xsl:if>

Imaginem que es vol verificar si un element PARA té un atribut "class" amb valor important:


<xsl:if test="@class = 'important'">
   <p class="important">
      <xsl:value-of select="para"/>
   </p>
</xsl:if>

Si el resultat de l'expressió @class = 'important' és TRUE, es pintarà un paràgraf amb la classe important i si és FALSE no es pintarà res.

Per poder tenir un resultat si el resultat és FALSE el millor és usar l'element CHOOSE.

L'ús és de l'estil de:


<xsl:choose>
   <xsl:when test="expressió XPath 1">
         ( codi condicionat per l'expressió XPath 1 )
   </xsl:when>
   <xsl:when test="expressió XPath 2">
         ( codi condicionat per l'expressió XPath 2 )
   </xsl:when>
   (...)
   <xsl:otherwise>
         ( codi condicionat per l'expressió XPath )
   </xsl:when>
</xsl:choose>

On cada element WHEN seria una condició i l'element OTHERWISE seria la sortida si no hi hagués cap TRUE en cap condició anterior.

Nota: La mínima estructura necessaria és un element WHEN dins d'un element CHOOSE; es poden afegir tants WHEN com calguin i només un element OTHERWISE si cal.

Seguint amb l'exemple anterior, es pot contemplar diferents valors de l'atribut "class":


<xsl:choose>
   <xsl:when test="@class = 'important' and @role = 'nota'">
      <p class="important nota">
         <xsl:value-of select="para"/>
      </p>
   </xsl:when>
   <xsl:when test="@class = 'important'">
      <p class="important">
         <xsl:value-of select="para"/>
      </p>
   </xsl:when>
   <xsl:when test="@role = 'nota'">
      <p class="nota">
         <xsl:value-of select="para"/>
      </p>
   </xsl:when>
   <xsl:otherwise>
      <p>
         <xsl:value-of select="para"/>
      </p>
   </xsl:otherwise>
</xsl:choose>

El problema d'aquesta estructura és que repeteix molt codi de sortida cosa que dificulta la mantenibilitat. Es podria millorar fent:


<xsl:element name="p">
   <xsl:choose>
      <xsl:when test="@class = 'important' and @role = 'nota'">
         <xsl:attribute name="class">important nota</xsl:attribute>
      </xsl:when>
      <xsl:when test="@class = 'important'">
         <xsl:attribute name="class">important</xsl:attribute>
      </xsl:when>
      <xsl:when test="@role = 'nota'">
         <xsl:attribute name="class">nota</xsl:attribute>
      </xsl:when>
   </xsl:choose>
   <xsl:value-of select="para"/>
</xsl:element>

En aquest cas l'element P sempre es pinta i per tant no cal cap opció OTHERWISE.

Amb l'arribada d'XPath 2.0 s'incorpora una nova opció a tenir en compte, els condicionals XPath.

Els condicionals XPath tenen la forma:


if ( condició ) 
   then $resultat
   else $resultat-omisió

Això aplicat a l'exemple anterior ens permetria fer quelcom tipus:


<xsl:element name="p">
   <xsl:if test="@class or @role">
      <xsl:attribute name="class">
         <xsl:value-of select="
          if ( @class = 'important' and @role = 'nota' ) 
             then 'important nota'
          else
             if ( @class = 'important' )
                then @class
             else
                if ( @role = 'nota' )
                   then @role
         "/>
      </xsl:attribute>
   </xsl:if>
   <xsl:value-of select="para"/>
</xsl:element>

Tot i no ser un gran exemple, permet veure la reducció de codi de sortida i la potència del nou XPath.

Comentaris

Afegir un comentari


© Arnau Siches. a.css està sota Llicència Creative Commons.