Corrispondenza con l'elemento radice
Per essere precisi, la radice non è un elemento ma è possibile trovare una corrispondenza e interagire su di essa con un modello. Un modello che ha corrispondenza con la radice di un file XML ha la seguente sintassi:
Troveremo spesso questo elemento nei fogli di stile perchè permette di generare output prima che cominci l´elaborazione del documento XML.
Applicare più modelli
Se un modello non indica al processore di proseguire verso il basso, nell´albero del documento sorgente, affinchè vangano elaborati i figli dell´elemento, non verranno mai incontrati elementi padri dell´elemento corrente, pertanto questi non verranno elaborati. Se si vuole che vengano elaborati gli elementi figli dell´elemento corrente, è necessario applicare la regola per questi elementi in modo tale che "inneschino" i modelli appropriati. Per fare ciò dobbiamo usare l´elemento <xsl:apply-templates>.
Creiamo adesso un file che chiameremo "animali.xml" il cui listato è il seguente:
<animale>Cane</animale>
<animale>Gatto</animale>
</animali>
ed il file XSL il cui nome nome è "animali.xsl". Ecco il listato:
I miei animali:<br />
<xsl:apply-templates />
</xsl:template>
<xsl:template match="animale">
Vi presento i miei animali.<br />
</xsl:template>
</xsl:stylesheet>
L´output che riceveremo nel browser lo possiamo visualizzare nel file di esempio.
Nel codice XSLT, l´elemento <xsl:apply-templates> è vuoto, senza nessun attributo. Indica solo al processore di applicare nel contesto corrente la regola del modello incorporata. Come avete potuto vedere dal file richiamato nel browser, l´output contiene due volte il testo del modello <animale>, cioè: "Vi presento i miei animali". Abbiamo anche letto il testo del modello corrispondente dell´elemento <animali>, vale a dire "I miei animali:". Inserendo l´elemento <xsl:apply-templates>, ci si assicura che gli elementi <animale> sono elaborati e che vengono innescati i modelli appropriati.
I modelli vengono innescati solo quando vengono messi in corrispondenza con un elemento, o attributo, nell´input. Se, invece, un modello non corrisponde a nessun elemento, o attributo, non verrà mai innescato. Vediamo il prossimo esempio, usando lo stesso file precedente animali.xml:
<animale>Cane</animale>
<animale>Gatto</animale>
</animali>
Applicchiamo ad esso lo stesso foglio di stile precedente, animali.xsl, ma con una piccola modifica:
I miei animali:<br />
<xsl:apply-templates />
</xsl:template>
<xsl:template match="animale">
Vi presento i miei animali.<br />
</xsl:template>
<xsl:template match="felino">Il mio felino preferito è il leone.</xsl:template>
</xsl:stylesheet>
Dovremmo avere a video, oltre al testo che abbiamo ottenuto in output precedentemente, anche il seguente:
Il mio felino preferito è il leone. Vediamo se questo è accaduto visualizzando il file di esempio. Nulla; non c´è. Perchè? Il seguente rigo di codice:
corrisponde ad un EVENTUALE elemento <felino>. Siccome nel file sorgente XML non esiste nessun elemento <felino> il modello, quando incontra il codice XSLT appena scritto, non viene mai innescato. Questo è molto importante in XSLT perchè permette di creare un foglio di stile che contiene molti modelli che possono corrispondere ad elementi diversi non necessariamente presenti nello stesso sorgente XML. Prendiamo l´esempio di un sito web: si potrebbe utilizzare questa tecnica per realizzare un file HTML con lo stesso layout e formattazione, ma con contenuti differenti.
Acquisire dati da un documento XML
Fino ad ora abbiamo visto esempi di output, attraverso i fogli di stile, di solo testo, mentre la potenzialità di XSLT è quella di manipolare i dati di un sorgente XML. La manipolazione più importante è quella di acquisire i valori dei dati e stamparli a video. Per fare questo ci si avvale dell´elemento <xsl:value-of>. Questo elemento ha un attributo select che contiene una espressione la quale indica al processore quale valore deve essere scritto nell´output. Vediamo un esempio con questo elemento prendendo come sorgente XML il seguente codice:
<animale>Cane</animale>
<animale>Gatto</animale>
</animali>
Mentre il foglio di stile XSLT è il seguente:
I miei animali:<br />
<xsl:apply-templates />
</xsl:template>
<xsl:template match="animale">
<xsl:value-of select="text()" /><br />
</xsl:template>
</xsl:stylesheet>
Otteniamo in output quanto ci si aspettava da un bel pò di esempi fa, forse. Il file di esempio spiega il tutto.
Anzichè scrivere testo letterale nel browser, il seguente rigo di codice:
che corrisponde all´elemento animale, scrive il valore di testo dell´elemento corrispondente, attraverso il codice:
L´espressione nell´attributo select usa la funzione text() per selezionare il valore di testo dell´elemento corrente. I valori di testo degli elementi <animale> sono: Cane e Gatto. L´elemento <xsl:value-of> stampa a video il genere degli animali, come da sorgente XML. Il modello corrispondente all´elemento <animale> viene fatto corrispondere 2 volte, una per ogni animale. Se l´attributo select corrisponde al valore dell´elemento corrente, esso comprende i figli perchè fanno parte del valore dell´elemento. Vediamo adesso una piccola variante all´esempio appena proposto. Fermo restando che il sorgente XML rimane lo stesso, associamogli questo foglio di stile:
I miei animali:<br />
<xsl:apply-templates />
</xsl:template>
<xsl:template match="animale">
<xsl:value-of select="." /><br />
</xsl:template>
</xsl:stylesheet>
In questo caso l´elemento <xsl:value-of /> non usa la funzione text() per ottenere il valore testuale dell´elemento che viene elaborato, ma prende il valore attraverso un semplice punto (.). Il punto (.) indica il valore dell´elemento corrente. Il risultato è identico a quello precedente e lo possiamo vedere nel file di esempio.
| < Prec. | Succ. > |
|---|

