Le istruzioni condizionali dell’XSLT consentono di realizzare con semplicità report che si comportano in maniera differente a seconda di calcoli o dei dati presenti all’interno di un documento XML.
L’esempio di questo Articolo mette in pratica un utile script che genera un report in celle di colori alternati, effettuando la trasformazione lato server attraverso ASP.
Creiamo una semplice struttura di dati XML nel file database.xml:
<?xml version="1.0"?>
<database>
<utente>
<id>1</id>
<nome>Luca</nome>
<cognome>Ruggiero</cognome>
</utente>
<utente>
<id>2</id>
<nome>Max</nome>
<cognome>Bossi</cognome>
</utente>
<utente>
<id>3</id>
<nome>Claudio</nome>
<cognome>Garau</cognome>
</utente>
<utente>
<id>4</id>
<nome>Alessandro</nome>
<cognome>Alessandrini</cognome>
</utente>
</database>
Stilizziamo ora dinamicamente l’output del file XML col seguente codice XSLT nel file style.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="/">
<h1>UTENTI</h1>
<table border="1">
<thead bgcolor="#000000" style="color: #FFFFFF;">
<th>Nome</th>
<th>Cognome</th>
</thead>
<xsl:for-each select="database/utente">
<xsl:choose>
<xsl:when test="id mod 2 = 1">
<tr bgcolor="#FFFFFF">
<td><xsl:value-of select="nome" /></td>
<td><xsl:value-of select="cognome" /></td>
</tr>
</xsl:when>
<xsl:otherwise>
<tr bgcolor="#FFFFCC">
<td><xsl:value-of select="nome" /></td>
<td><xsl:value-of select="cognome" /></td>
</tr>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
Commentiamo un po il codice per renderci conto delle sue azioni dinamiche.
Prima operazione è quella di impostare l’output in formato HTML per evitare che la trasformazione, da ASP, avvenga importando Tag XML:
<xsl:output method="html" />
questa operazione possiamo considerarla come valore aggiunto al report ma non è fondamentale ai fini della riuscita dello script.
Apriamo il template XSLT ed iniziamo a scrivere il codice HTML.
Ad un certo punto, all’interno del ciclo che estrae tutti i dati dal file XML, utilizziamo le istruzioni condizionali xsl:when ed xsl:otherwise, all’interno di un gruppo di scelta condizionale xsl:choose, per impostare due condizioni, ovvero quelle secondo le quali le celle su una stessa riga saranno, in maniera alternata, di un colore piuttosto che di un altro
<xsl:choose>
<xsl:when test="id mod 2 = 1">
<tr bgcolor="#FFFFFF">
<td><xsl:value-of select="nome" /></td>
<td><xsl:value-of select="cognome" /></td>
</tr>
</xsl:when>
<xsl:otherwise>
<tr bgcolor="#FFFFCC">
<td><xsl:value-of select="nome" /></td>
<td><xsl:value-of select="cognome" /></td>
</tr>
</xsl:otherwise>
</xsl:choose>
Effettuiamo il test condizionale con l’operatore modulo in base 2, impostando la condizione di uguaglianza su 1, in modo da ottenere una condizione vera ogni due.
Di seguito il codice commentato del file ASP che effettua la trasformazione:
<%@LANGUAGE = VBScript%>
<%
' Dichiaro le variabili che mi servono
Dim database, style
' Setto due oggetti XMLDOM, uno per il file XML
' ed un secondo per il file di stile dinamico XSLT
Set database = Server.CreateObject("Microsoft.XMLDOM")
Set style = Server.CreateObject("Microsoft.XMLDOM")
' Setto i due oggetti come sincroni
database.async = False
style.async = False
' Carico i file XML ed XSLT
database.load Server.MapPath("database.xml")
style.load Server.MapPath("style.xsl")
' Nel corpo della pagina effettuo la trasformazione...
%>
<html>
<head>
<title>Celle di colori alternati con ASP, XML ed XSLT</title>
</head>
<body>
<%=database.transformNode(style)%>
</body>
</html>
<%
' Un po di pulizia...
Set database = Nothing
Set style = Nothing
%>
