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