XSLT (III)

PROCESAMIENTO CONDICIONAL

Como hemos visto hasta ahora, las transformaciones se realizan en un solo sentido, conforme se va instanciando cada "template". Sin embargo podemos crear diferentes "templates" y aplicar unos u otros dependiendo de alguna condición. Esto lo haremos mediante los elementos "if" y "choose".

EL ELEMENTO XSL:IF

El elemento if comprueba si una cierta condición booleana es verdadera o falsa. Si es verdadera, el contenido del elemento "if" es instanciado y en caso contrario, nada de lo que hay dentro del elemento "if" se añade al árbol resultado.

Por ejemplo, tenemos un documento con información sobre el kilometraje de ciertos vehículos, y queremos generar a partir de él otro documento donde se informe de ciertos vehículos demasiado antiguos:

<vehículos> <vehículo kilometraje="50000">7234SFAA</vehículo> <vehículo kilometraje="3000">7509AHSS</vehículo> <vehículo kilometraje="500000">2389CNDK</vehículo> <vehículo kilometraje="780000">5389BIMF</vehículo> <vehículo kilometraje="72500">6308MEVI</vehículo> </vehículos>

Y a continuación el documento XSLT

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <head> <title> Vehículos descartados </title> </head> <body> <h2> El kilometraje es demasiado alto (revisar información por posibles errores) </h2> <xsl:apply-templates select="/vehículos/vehículo" /> </body> </html> </xsl:template> <xsl:template match="vehículo"> <xsl:if test="@kilometraje > 200000"> <p><strong><xsl:value-of select="." /></strong> tiene un kilometraje excesivo. Por favor compruebe que el vehículo tiene un kilometraje de <xsl:value-of select="@kilometraje"/> kilómetros</p> </xsl:if> </xsl:template> </xsl:stylesheet>

EL ELEMENTO XSL:CHOOSE

Con el elemento "if" elegimos si un "template" se instancia o no. Pero con "choose" podemos elegir entre varias opciones excluyentes entre sí. Esto sería algo parecido al siguiente pseudocódigo:

si (condición1) entonces -> template1; en otro caso si (condición2) entonces -> template2; en el resto de los casos -> template3;

Vamos a utilizar "choose" en el ejemplo anterior:

<vehículos> <vehículo kilometraje="50000">7234SFAA</vehículo> <vehículo kilometraje="3000">7509AHSS</vehículo> <vehículo kilometraje="500000">2389CNDK</vehículo> <vehículo kilometraje="780000">5389BIMF</vehículo> <vehículo kilometraje="72500">6308MEVI</vehículo> </vehículos>

Y este es el documento XSLT.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <head> <title> Vehículos descartados </title> </head> <body> <h2> Informe de kilometraje</h2> <xsl:apply-templates select="/vehículos/vehículo" /> </body> </html> </xsl:template> <xsl:template match="vehículo"> <xsl:choose> <xsl:when test="@kilometraje > 200000"> <p>El vehículo <strong><xsl:value-of select="." /></strong> tiene un kilometraje excesivo. Por favor compruebe que el vehículo tiene un kilometraje de <xsl:value-of select="@kilometraje"/> kilómetros</p> </xsl:when> <xsl:otherwise> <p>El vehículo <strong><xsl:value-of select="."/></strong> está dentro de lo normal.</p> </xsl:otherwise> </xsl:choose> </xsl:template> </xsl:stylesheet>

Práctica 5. Supongamos que en tu página, en la que recoges información sobre ciertas preferencias de los usuarios, recibes el siguiente documento:

<usuario> <nombre> José Antonio </nombre> <apellido> Pérez </apellido> <id>japerez</id> <preferencias> <recibeinfo valor="0"/> <foros valor="1"/> </preferencias> </usuario>

Deseamos realizar un resumen para el usuario, que contenga el siguiente texto:

¡Hola, José Antonio! Te has dado de alta en nuestro sitio con el nombre de usuario japerez.Tus preferencias son:

  • No recibir información sobre novedades de nuestro sitio.
  • Deseas participar en los foros de nuestro sitio.

Escribe una hoja de estilos XSLT llamada Act5.xslt que realice esta tarea, y que se adapte a los posibles valores de las preferencias, para que emita mensajes de acuerdo con el documento XML fuente. Es decir, si en el documento XML, el elemento "recibeinfo" tuviese valor 1, el documento html generado, incluiría el siguiente mensaje: "1. Recibir información sobre novedades de nuestro sitio."

EL ELEMENTO XSL:FOR-EACH

El elemento "for-each" permite que todos los nodos en un "node-set" pudan ser procesados de acuerdo las intrucciones que hay dentro de un elemento "for-each".

Por ejemplo, para el documento siguiente:

<?xml version="1.0" encoding="UTF-8"?> <vehículos> <vehículo kilometraje="50000"> <característica tipo="matrícula">7234SFAA</característica> <característica tipo="clase">Berlina</característica> </vehículo> <vehículo kilometraje="3000"> <característica tipo="matrícula">7509AHSS</característica> <característica tipo="clase">turismo</característica> </vehículo> <vehículo kilometraje="500000"> <característica tipo="matrícula">2389CNDK</característica> <característica tipo="clase">turismo</característica> </vehículo> <vehículo kilometraje="780000"> <característica tipo="matrícula">5389BIMF</característica> <característica tipo="clase">pick-up</característica> </vehículo> <vehículo kilometraje="72500"> <característica tipo="matrícula">6308MEVI</característica> <característica tipo="clase">coupé</característica> </vehículo> </vehículos>

Podríamos aplicar la siguiente hoja de estilos:

<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <html> <head> <title> Vehículos descartados </title> </head> <body> <h2> Listado de vehículos</h2> <xsl:apply-templates select="/vehículos/vehículo" /> </body> </html> </xsl:template> <xsl:template match="vehículo"> <ul> <xsl:for-each select="característica"> <li><xsl:value-of select="."/></li> </xsl:for-each> </ul> </xsl:template> </xsl:stylesheet>

Práctica 6. Revisa el ejercicio 2 (del artículo XSLT (I)) y reescríbelo utilizando for-each.

Saludos.