XSLT è un linguaggio potente e flessibile con costrutti analoghi a quelli dei linguaggi di programmazione. Infatti permette di controllare il flusso dell'elaborazione per produrre un output sulla base del verificarsi di determinate condizioni e di effettuare delle iterazioni.
facendo riferimento al documento XML che rappresenta un articolo, potremmo voler produrre una formattazione del titolo diversa in base al tipo di paragrafo. Ad esempio, in corrispondenza del paragrafo di tipo bibliografia potremmo voler evidenziare in output la scritta Bibliografia.
Per ottenere questo risultato possiamo utilizzare l'elemento <xsl:if> di XSLT il cui comportamento è analogo all'istruzione if dei linguaggi di programmazione tradizionali.
Possiamo quindi sfruttare questo elemento come nel seguente codice:
<xsl:template match="paragrafo">
<h3>
<xsl:if test="@tipo=bibliografia'">
Bibliografia
</xsl:if>
<xsl:value-of select="@titolo"/>
</h3>
<xsl:apply-templates/>
</xsl:template>
L'attributo test dell'elemento <xsl:if> specifica la condizione da valutare e può essere una condizione booleana o un'espressione XPath che individua un insieme di nodi. In quest'ultimo caso la condizione viene considerata vera se l'insieme dei nodi individuati non è vuoto.
L'elemento <xsl:if> prevede una sola condizione, anche se composta tramite operatori booleani, e non prevede alternative nel caso in cui la condizione non è vera.
Per ottenere diversi output in base a diverse condizioni possiamo sfruttare l'<xsl:choose>, la cui semantica corrisponde alle istruzioni di tipo select case o switch dei linguaggi di programmazione.
Per estendere l'esempio visto prima a proposito dell'elemento <xsl:if> possiamo scrivere il seguente template:
<xsl:template match="paragrafo">
<h3>
<xsl:choose>
<xsl:when test="@tipo='abstract">
Abstract dell'articolo
</xsl:when>
<xsl:when test="@tipo='bibliografia">
Bibliografia
</xsl:when>
<xsl:when test="@tipo='note">
Note finali
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="@titolo"/>
</xsl:otherwise>
</xsl:choose>
</h3>
<xsl:apply-templates/>
</xsl:template>
All'interno dell'elemento <xsl:choose>, le condizioni da valutare vengono specificate tramite gli elementi <xsl:when>. L'elemento <xsl:otherwise> indica l'output da generare nel caso in cui nessuna delle condizioni precedenti sia vera.
Nel caso specifico, in presenza di ciascun tipo di paragrafo viene generato un titolo predefinito, mentre se l'elemento individuato dal template non ha associato alcun tipo viene generato il titolo corrispondente all'omonimo attributo.
Abbiamo visto come l'applicazione dei template ai vari nodi di un documento XML è automaticamente ricorsiva, cioè il processore XSLT va automaticamente alla ricerca di tutti i nodi del documento origine che corrispondono ad un template.
Se vogliamo in qualche modo analizzare il contenuto dei diversi nodi all'interno di un template possiamo fare ricorso all'elemento <xsl:for-each>, il cui funzionamento è analogo alle istruzioni for dei linguaggi di programmazione tradizionali.
Vediamo come sfruttare l'elemento <xsl:for-each> nel nostro caso. Immaginiamo di voler produrre in output nel documento XHTML risultante un sommario iniziale in cui vengono elencati i titoli dei paragrafi dell'articolo. Possiamo scrivere il template di elaborazione dell'elemento <articolo> nel seguente modo:
<xsl:template match="/">
<h1><xsl:value-of select="articolo/@titolo"/></h1>
<h2>Sommario</h2>
<xsl:for-each select="paragrafo">
<h3><xsl:value-of select="@titolo"/></h3>
</xsl:for-each>
<xsl:apply-templates/>
</xsl:template>
Dopo aver prodotto in output il titolo dell'articolo, tramite l'elemento <xsl:for-each> individuiamo tutti gli elementi <paragrafo> contenuti nell'elemento corrente (<articolo>) e ne estraiamo il titolo.
Ci sono situazioni in cui l'applicazione di un foglio di stile XSLT deve produrre un documento XML ed in particolare tag relativi ad elementi XML.
Supponiamo, ad esempio, di dover generare del codice XHTML a partire dall nostro articolo in XML, ed in particolare dobbiamo porre l'elemento <img> in corrispondenza dell'elemento <immagine>.
La cosa a prima vista non sembrerebbe così complicata. La prima cosa che potrebbe venire in mente potrebbe essere l'utilizzo di un template analogo al seguente:
<xsl:template match="immagine">
<img src="<xsl:value-of select='@file'/>" />
</xsl:template>
Tuttavia, dal momento che si tenta di inserire un elemento all'interno del tag di un altro elemento, l'espressione non risulta ben formata ed il processore XSLT darà un messaggio d'errore.
Per fortuna XSLT prevede la possibilità di generare elementi e relativi attributi da inserire nel documento risultante. Questa possibilità si basa sull'uso degli elementi <xsl:element> e <xsl:attribute>. Nel nostro caso li utilizziamo nel seguente modo:
<xsl:template match="immagine">
<xsl:element name="img">
<xsl:attribute name="src">
<xsl:value-of select="@file"/>
</xsl:attribute>
</xsl:element>
</xsl:template>
Il risultato dell'applicazione di questo template sarà un elemento <img> il cui attributo src avrà il valore del corrispondente attributo file del nostro elemento <immagine>.
L'applicazione di un foglio di stile XSLT può essere fatta esternamente, cioè avviando un processore XSLT e indicando il documento origine e il foglio da applicare, oppure internamente, cioè specificando il foglio da applicare all'interno del documento XML stesso.
In quest'ultimo caso il processore XSLT individuerà automaticamente il foglio di stile da applicare. Per assegnare un foglio di stile XSLT ad un documento XML occorre specificare la seguente dichiarazione prima dell'elemento radice:
<?xml version="1.0" ?>
<?xml-stylesheet type="text/xsl" href="stile.xslt" ?>
La maggior parte dei processori XSLT è in grado di interpretare la direttiva ed applicare il relativo foglio di stile XSLT al documento XML corrente.
Anche la maggior parte dei browser recenti sono in grado di applicare un foglio di stile XSLT ad un documento XML. In particolare, i browser Microsoft Internet Explorer 6.0, Netscape 6.0, Mozilla 1.4, Firefox 0.9.