Elementos Condicionados
Nuestras hojas de transformación no se tienen que limitar a recuperar información de un fichero XML y a ponerla en otro tipo de formato. Puede ser que cierta información del documento no nos interese, o tenga que ser evaluada.
Para poder realizar esa evaluación de datos nos podemos apoyar en estructuras condicionales como xsl:if, xsl:choose y las funciones que tiene el lenguaje XSL.
Siguiendo al resto de los ejemplos, vamos a utilizar el fichero XML con los datos de los libros. Pero en este caso vamos a añadir un nuevo campo en la estructura. Este nuevo campo será el precio del libro. El fichero de libros nos quedará así:
<?xml version="1.0" encoding="iso-8859-1"?>
<libros>
<libro>
<titulo>Fuente Ovejuna</titulo>
<autor>Lope de Vega</autor>
<isbn>84-9815-002-7</isbn>
<precio>24</precio>
</libro>
<libro>
<titulo>La Celestina</titulo>
<autor>Fernando de Rojas</autor>
<isbn>84-96390-96-9</isbn>
<precio>30</precio>
</libro>
...
</libros>
La condición de nuestra hoja de transformación será el generar un listado de libros, pero siempre y cuando, estos, tengan un precio superior o igual a 30 euros.
Para ello lo primero que tenemos que hacer es mostrar el listado de libros. Esto lo conseguimos con una estructura repetitiva del tipo xsl:for-each. En medio de esta estructura, utilizando etiquetas xsl:value-of mostramos la información del titulo del libro, autor y precio del mismo. Tendremos el siguiente código:
<xsl:for-each select="libros/libro"> <p> Titulo:<xsl:value-of select="titulo"/><br/> Autor:<xsl:value-of select="autor"/><br/> Precio:<xsl:value-of select="precio"/> </p> </xsl:for-each>
El código anterior nos va a sacar todos los libros que tengamos definidos en nuestra estructura XML. Todavía no hemos ejecutado el filtro. Para aplicar el filtro utilizamos la etiqueta xsl:if. Antes de utilizarla refrescaremos cual es su estructura
<xsl:if test="condicion"> ... </xsl:if>
Como podemos ver, el atributo test es el que nos permite evaluar la condición. Como condición podemos utilizar cualquiera de las funciones que nos da el lenguaje XSLT o simplemente comparar valores de elementos del documento XML contra constantes. Este último caso será el nuestro. Y es que nosotros contrastaremos el valor de un elemento del documento, el precio, contra una constante, 24 (euros € o dolares $ ;-)) Quedándonos al final esta línea de código:
<xsl:if test="precio>24"> ... </xsl:if>
En el medio de esta decisión pondremos la extracción de información del libro, es decir, los xsl:value-of. Nuevamente, quedándonos:
<xsl:for-each select="libros/libro">
<xsl:if test="precio>=30">
<p>
Titulo:<xsl:value-of select="titulo"/><br/>
Autor:<xsl:value-of select="autor"/><br/>
Precio:<xsl:value-of select="precio"/>
</p>
</xsl:if>
</xsl:for-each>