XSLT

Fogli di stile XSLT

Nell’ambito dello standard XSL il compito di trasformare un documento XML in un altro documento è affidato al linguaggio XSLT.

Nella terminologia di XSLT, il documento da trasformare è chiamato documento origine (source document), mentre il documento generato dal processo di trasformazione è chiamato documento risultante (result document).

Il documento risultante di una trasformazione XSLT può essere un documento XML o un documento di altro tipo. Ad esempio, a partire da un documento XML possiamo generare un documento XHTML oppure un documento WML o anche RTF o altri formati testuali.

La trasformazione avviene in base alle informazioni contenute in un particolare tipo di documento e interpretate da un processore XSLT. Questo documento di trasformazione, chiamato foglio di stile XSLT, non è altro che un documento XML che fa uso di tag appartenenti alla grammatica di XSLT in grado di controllare il processo di trasformazione.

In generale, un foglio di stile XSLT ha la seguente struttura:

<?xml version=”1.0″?>
<xsl:stylesheet version=”1.0″ xmlns:xsl=”http://www.w3.org/1999/XSL/transorm”>
… template di trasformazione …
</xsl:stylesheet>

All’interno del root element <xsl:stylesheet> vengono definite le istruzioni di trasformazione da applicare al documento XML origine. XSLT consente di trasformare ciascun elemento del documento XML di origine in un altro elemento del formato del documento risultante.

È possibile anche aggiungere al documento risultante elementi completamente nuovi o non prendere in considerazione determinati elementi del documento origine, riordinare gli elementi, fare elaborazioni in base al risultato di determinate condizioni, ecc.

Il processo di trasformazione controllato da XSLT si basa sull’uso del linguaggio XPath per individuare gli elementi del documento origine, sui quali viene applicato un template (o modello) di trasformazione.

Da un punto di vista sintattico, un template è un elemento del linguaggio XSLT che ha la seguente forma di base:

<xsl:template match=”espressione XPath”>
… Definizione dellìoutput…
</xsl:template>

Un template XSLT individua un elemento o un insieme di elementi di un documento XML sfruttando unìespressione XPath e vi applica una serie di elaborazioni per ottenere un output. Per fare una analogia con i CSS, un template corrisponde approssimativamente ad una regola CSS.

Per fare un esempio, facendo riferimento al documento XML che descrive un articolo, il seguente template restituisce in output il titolo del secondo paragrafo:

<xsl:template match=”/articolo/paragrafo[position()=2]”>
 <xsl:value-of select=”@titolo”/>
</xsl:template>

L’elemento <xsl:value-of> contenuto all’interno dell’elemento <xsl:template> consente di catturare il valore di un elemento o di un attributo e di produrlo in output.

Un foglio di stile XSLT non è altro che un insieme di template da applicare ai vari elementi di un documento XML. Comprendere come avviene l’applicazione dei template di un foglio di stile XSLT da parte del relativo processore è un elemento essenziale per realizzare fogli di stile corretti.

Il modello di elaborazione dei processori XSLT segue la struttura gerarchica del documento XML di partenza. In pratica, il processore XSLT va alla ricerca dei template da applicare partendo dal root element e seguendo l’albero di rappresentazione logica del documento stesso.

In linea di principio, con l’applicazione del relativo template al root element termina il compito del processore XSLT. Se il foglio di stile contiene diversi template che devono essere applicati ai vari elementi del documento XML di partenza è necessario specificarlo esplicitamente.

Questo può essere fatto specificando all’interno del template corrente l’elemento <xsl:apply-templates/>. Con questo elemento del linguaggio XSLT indichiamo al processore di cercare eventuali altri template da applicare alla trasformazione corrente.

Non è importante l’ordine con cui sono stati specificati i template all’interno del foglio di stile; sarà il processore ad individuarli in base all’espressione XPath associata.

Ad esempio, un possibile template del root element che avvia la trasformazione di un articolo può essere analogo al seguente:

<xsl:template match=”/”>
 <xsl:value-of select=”articolo/@titolo”/>
 <xsl:apply-templates/>
</xsl:template>

Questo template estrae il titolo dell’articolo ed indica al processore XSLT di cercare altri template da applicare al documento XML.

Elaborazioni con XSLT

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&apos;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.

XSLTultima modifica: 2008-03-09T17:39:45+01:00da guastastyle
Reposta per primo quest’articolo