eXtensible Stylesheet Language
Transformations
(XSLT)
Giuseppe Della Penna
Università degli Studi di L’Aquila
[email protected]
http://dellapenna.univaq.it
CSS e XSL
Attualmente, molti creatori di parser XML
supportano l’applicazione diretta di fogli di stile
CSS (Cascading Style Sheets) a documenti XML,
per definirne un formato di visualizzazione.
 XSL o eXtensible Stylesheet Language, è un
linguaggio XML creato inizialmente per fornire a
XML un supporto per la formattazione simile a
CSS, ma potenziato per riflettere il linguaggio su
cui viene applicato, che non è più HTML.

XSL Transformations / 2
XSL e XSLT
XSLT (XSL Transformations) è il successore di
XSL, ed estende il concetto di foglio di stile fino a
permettere la manipolazione della struttura
stessa del documento.
 XSLT permette di trasformare un documento
XML filtrandone i dati e riorganizzandoli in
un’altra struttura XML, o persino in un
semplice testo.
 XSLT possiede molte delle caratteristiche di un
linguaggio di programmazione imperativo!

XSL Transformations / 3
XSLT come formattaore

Per quel che riguarda l’abilità di generare una
presentazione dei dati XML, XSLT dispone
attualmente di due metodi:
–
–
XSL Transformations / 4
E’ possibile trasformare il documento XML in un
documento XHTML, per poi farlo visualizzare in
qualsiasi browser.
E’ possibile usare gli XSL Formatting Objects, che
definiscono il formato di visualizzazione senza
presupporre la trasformazione in HTML o in altri
linguaggi di presentazione.
XSLT come trasformatore
Questa funzionalità, del tutto nuova, è la più
interessante.
 Con XSLT è possibile modificare “al volo” la
struttura che accoglie i dati, e in parte anche i
dati stessi. Questo permette, ad esempio:

–
–
–
XSL Transformations / 5
di offrire viste differenti sugli stessi dati a utenti
differenti.
di esportare i dati in un formato noto, come HTML
o PDF.
di adattare i dati a diversi dispositivi di
visualizzazione (vedasi HTML e WML).
XPath
XPath è una parte fondamentale di XSLT e di
altre specifiche come XLink.
 XPath è un linguaggio che permette di
indirizzare parti di un documento XML.
 XPath dispone anche di primitive per eseguire
semplici operazioni su stringhe, numeri e valori
booleani.
 Le espressioni XPath possono avere come valore
numeri, stringhe, booleani e insiemi di nodi.

XSL Transformations / 6
Il documento secondo XPath
Dal punto di vista di XPath, il documento XML è
un albero.
 Ogni elemento, commento, attributo, PI o stringa
di testo (non-markup) è un nodo dell’albero.
 Le relazioni tra i nodi sono semplici:

–
–
–
XSL Transformations / 7
Un elemento annidato è un nodo figlio dell’elemento
che lo contiene.
Un attributo è figlio del suo elemento.
Commenti e PI e testo sono figli dell’elemento che li
contiene (o del documento*).
Le espressioni XPath: Gli Assi
Muovendosi sull’albero del documento, XPath
permette di scegliere non solo tra i figli del nodo
corrente, ma anche tra una serie di altri insiemi di
nodi che sono in relazione con esso.
 Questi insiemi di nodi si dicono assi. Ogni passo
di una espressione XPath può avvenire su un asse
arbitrario a partire dal nodo corrente (o contesto).
 L’asse degli elementi figli diretti è l’asse
predefinito, ed esistono scorciatoie per
raggiungere l’asse degli attributi.

XSL Transformations / 8
Le espressioni XPath: Gli Assi

ancestor
–

ancestor-or-self
–

Contiene gli attributi del nodo corrente.
child
–

Come ancestor, ma contiene anche il nodo corrente.
attribute
–

Contiene il padre del nodo, il padre del padre, ecc…
Contiene gli elementi direttamente annidati nel nodo
corrente.
descendant
–
XSL Transformations / 9
Contiene tutti gli elementi annidati nel nodo corrente
(con livello di annidamento arbitrario).
Le espressioni XPath: Gli Assi

descendant-or-self
–

following
–

Contiene tutti i nodi che si trovano dopo quello
corrente all’interno del documento, esclusi i
discendenti, gli attributi del nodo e i namespaces.
following-sibling
–

Come descendant, ma contiene anche il nodo corrente.
Contiene tutti i nodi che hanno lo stesso livello di
nidificazione nell’elemento padre di quello corrente e
sono posti dopo di esso (“fratelli”).
namespace
–
XSL Transformations / 10
Contiene i nodi namespace dichiarati per l’elemento
corrente.
Le espressioni XPath: Gli Assi

parent
–

preceding
–

Contiene tutti i nodi che si trovano prima quello
corrente all’interno del documento, esclusi i suoi
antenati (ancestors), gli attributi del nodo e i
namespaces.
preceding-sibling
–

Contiene il padre dell’elemento corrente.
Contiene tutti i nodi che hanno lo stesso livello di
nidificazione nell’elemento padre di quello corrente e
sono posti prima di esso.
self
–
XSL Transformations / 11
Contiene il nodo corrente.
Le gerarchie secondo XPath
<a>
<b/>
<c>
<e/>
<d xmlns:y=“…” x=“…”>
<f>
<g/>
</f>
</d>
<i/>
</c>
<h/>
</a>
XSL Transformations / 12
ancestor: [c,a]
ancestor-or-self: [d,c,a]
attribute: [x]
child: [f]
descendant: [f,g]
descendant-or-self: [d,f,g]
following: [i,h]
following-sibling: [i]
namespace: [y]
parent: [c]
preceding: [b,e]
preceding-sibling: [e]
self: [d]
Le espressioni XPath: I Node Tests
Per individuare un particolare nodo su un asse, si
usano il suo tipo e/o il suo nome tramite i
cosiddetti node tests.
 In entrambi i casi, il risultato può anche essere un
insieme di nodi, nel caso sull’asse siano
disponibili più nodi con lo stesso tipo e/o nome.
 Nel caso si lavori su un insieme di nodi, tutte le
operazioni vengono applicate iterativamente a
ciascun nodo, e il risultato è l’insieme dei nodi
risultanti dalle applicazioni.

XSL Transformations / 13
Le espressioni XPath: I Tipi

I tipi di nodo sono:
–
–
–
–
–

elemento
attributo
namespace
commento
processing-instruction
Ogni asse ha un tipo predefinito:
–
–
–
XSL Transformations / 14
se l’asse contiene elementi, il tipo predefinito è
“elemento”
se l’asse non contiene elementi ma contiene attributi, il
tipo predefinito è “attributo”
se l’asse non contiene elementi ma contiene
namespaces, il tipo predefinito è “namespace”
Le espressioni XPath: I Tipi

Per indicare tutti i nodi con un particolare tipo, si
usano opportuni test:
–
–
–
–
comment()
node()
processing-instruction()
text()
I test restituiscono l’insieme dei nodi con quel
particolare tipo presenti sull’asse.
 Il risultato è un insieme di nodi, ciascuno dei
quali può essere ulteriormente attraversato
usando XPath.

XSL Transformations / 15
Le espressioni XPath: I Nomi

Alcuni nodi possiedono anche un loro nome:
–

Per indicare il nodo con un particolare nome, si
usa semplicemente il nome stesso come test.
–

I nodi elemento e attributo hanno il nome
dell’elemento e dell’attributo stessi.
Lo speciale test ‘*’ fa match con tutti i nodi
accessibili sull’asse, con qualunque nome.
I test restituiscono l’insieme dei nodi con quel
particolare nome presenti sull’asse.
XSL Transformations / 16
Le espressioni XPath: Gli Step

Una espressione XPath consiste in una serie di
step (“passi”) costituiti da node tests, ognuno su
un proprio asse, separati da uno slash ‘/’, in
maniera simile agli URI.
collezione/node()/cd/artista
Ogni passo agisce sull’insieme di nodi (contesto)
ottenuto dal passo precedente.
 Il primo passo ha un contesto fornito dall’
“ambiente”, o la radice del documento se il path
inizia esso stesso con uno slash.

/collezione/cd/artista
XSL Transformations / 17
Le espressioni XPath: Gli Step
Negli esempi proposti prima l’asse di movimento
era sempre quello di default (child).
 Per muoversi su un altro asse, basta prefissare il
nome del nodo con il nome dell’asse:

collezione/descendant::cd/attribute::ID

Esistono delle scorciatoie per i tre assi più usati:
–
–
si abbrevia con uno slash ‘/’
(/descendants:: si scrive // )
attribute:: si abbrevia con una chiocciola ‘@’.
descendants::
collezione//cd/@ID
–
XSL Transformations / 18
self::
si abbrevia con un punto ‘.’
Le espressioni XPath: I Filtri

I Filtri in XPath corrispondono grossolanamente
alla parte where delle query SQL.
–
–

I Filtri agiscono sugli insiemi di nodi, selezionandone
una parte secondo particolari criteri.
Il risultato di un filtro è l’insieme dei nodi filtrati.
In ciascuno step si possono inserire un numero
arbitrario di filtri, che vengono richiamati
nell’ordine in cui si presentano.
–
XSL Transformations / 19
I filtri vanno posti nello step sempre dopo il suo node
test.
Le espressioni XPath: I Filtri
All’interno del filtro si possono usare espressioni
che abbiano valore booleano (vero / falso).
 L’espressione del filtro viene valutata usando
ciascun nodo del set come contesto, e se vale
true il nodo viene aggiunto all’insieme dei
risultati.
 Esistono due eccezioni:

–
–
XSL Transformations / 20
Se l’espressione restituisce un numero, viene
selezionato il nodo in quella posizione nell’insieme
(gli insiemi di nodi sono ordinati).
Se l’espressione restituisce un insieme di nodi, allora
vale true se l’insieme non è vuoto.
Le espressioni XPath: Operandi nei Filtri

All’interno dei filtri si possono usare come
operandi:
–
–
–
XSL Transformations / 21
Espressioni XPath (compresi altri filtri nidificati!),
che vengono valutate usando come contesto ciascun
nodo dell’insieme di input.
Il “valore” di una espressione XPath, se usata con
operatori di confronto, è il testo in essa contenuto
(valore dell’attributo o testo all’interno dell’elemento).
Se l’espressione è un insieme, XPath restituisce true se
c’è almeno un suo elemento che soddisfi il test.
Costanti numeriche o stringhe tra virgolette.
Le espressioni XPath: I Filtri - Esempi
/collection/album[title = “Supernatural”]/@ID
gli ID di ogni album nella collection che abbia un (figlio)
title contenente il testo “Supernatural”.
/collection/album[@ID = “123”]
•
tutti gli album nella collection con ID uguale a “123”.
/collection/song[@album = //album[title =
“Supernatural”]/@ID]/title
•
•
XSL Transformations / 22
i titoli di tutte le song nella collection che hanno un attributo
album uguale all’ID di uno degli elementi album (presenti in
qualunque punto tra i discendenti del contesto corrente) che
hanno come title “Supernatural”.
/collection/song[@album = //album[title = “S”]/@ID]/title
<collection>
<song>
<title/>
collection/song
<song>
<title/>
</song>
</song>
<song>
<song>
<title/>
</song>
<album>
<title/>
</album>
<album>
<title/>
</album>
</collection>
XSL Transformations / 23
collection/song[…]
<song>
<title/>
</song>
collection/
song[…]/
title
<title/>
<title/>
</song>
//album
<album>
<title/>
</album>
<album>
<title/>
</album>
//album[title=“S”]
<album>
<title/>
</album>
Le espressioni XPath: I Filtri - Esempi
//album/title[ . = “Supernatural”]
• il title di tutti gli album intitolati “Supernatural” (!).
/collection/song[comment]
tutte le song nella collection che hanno un comment.
/collection/song[comment[1] = “Hit”]
•
tutte le song nella collection il cui primo comment contiene
il testo “Hit” (non sottostringa!).
//album[3]
• il terzo elemento album presente in tutto il file XML.
//song[1][@album = “santana1”]
• la prima song nel documento, se ha un attributo album con
valore “santana1”.
•
XSL Transformations / 24
Le espressioni XPath: I Filtri - Esempi
//cd[owner = “myself”]/song[@album =
“santana1”]/title
• i title di tutte le song aventi un attributo album con valore
“santana1” che si trovano in un cd avente un elemento figlio
owner con valore “myself”.
//*[self::song or self::album]
• tutti i nodi song o album nel documento corrente, a qualsiasi
livello di nidificazione.
XSL Transformations / 25
Le espressioni XPath: Operatori nei Filtri

All’interno dei filtri si possono usare operatori:
–
–
–
–
–
XSL Transformations / 26
Confronto: ‘=’ (uguale), ‘!=’ (diverso), ‘>’
(maggiore), ‘>=’ (maggiore o uguale), ‘<’ (minore),
‘<=’ (minore o uguale).
Logici (tra espressioni filtro valide): and, or, not(…)
Insiemistici: (da usare tra insiemi di nodi, ma
all’esterno dei filtri!): ‘|’ (unione).
Raggruppamento (per dare precedenza a certe
espressioni, si possono usare anche all’esterno dei
filtri!): ‘(…)’
Matematici: ‘+’, ‘-’, ‘*’, ‘/’, mod
Le espressioni XPath: I Filtri - Esempi
//album[@tracks >= 5]
•
tutti gli album con attributo tracks avente valore maggiore di
cinque.
//song[title and artist]
•
tutte le song aventi (almeno) un figlio title e un figlio artist.
//song[@album != “santana1” and not(comment)]
• tutte le song con un attributo album con valore diverso da
“santana1” e senza figli comment.
//cd/song[1]
•
la prima song di tutti i cd.
(//cd/song)[1]
•
XSL Transformations / 27
la prima di tutte le song in tutti i cd.
Le espressioni XPath: Funzioni nei Filtri

All’interno dei filtri si possono usare vari tipi di
funzioni:
–
–
–
–
–
XSL Transformations / 28
funzioni su insiemi di nodi
funzioni su stringhe
funzioni numeriche
funzioni booleane
funzioni XSLT - Specifiche (non presenti nella
specifica XPath)
Le espressioni XPath: Funzioni su Nodi

Principali funzioni sugli insiemi di nodi:
–
–
–
–
–
XSL Transformations / 29
count(ns): dimensione dell’insieme di nodi ns.
last(): indice dell’ultimo elemento nell’insieme di nodi
corrente.
position(): posizione del nodo corrente all’interno del
suo genitore.
document(...): permette di accedere a documenti XML
esterni.
id(“…”): restituisce il nodo con l’attributi di tipo ID
avente il valore dato.
Le espressioni XPath: Funzioni sulle Stringhe

Principali funzioni sulle stringhe:
–
–
–
–
–
–
–
–
XSL Transformations / 30
string(o): converte l’oggetto o in una stringa.
concat(s1,s2,...): concatena più stringhe.
substring(s,x,y): sottostringa di s che inizia al carattere
x ed è lunga y (opzionale)
substring-after(s,t): la sottostringa di s che inizia dopo
i caratteri t
substring-before(s,t): la sottostringa di s che arriva
fino ai caratteri t
contains(s,t): vero se s contiene t.
starts-with(s,t): vero se s inizia con t.
string-length(s): la lunghezza della stringa s.
Le espressioni XPath: Funzioni Booleane

Principali funzioni sui valori booleani:
–
–
–
–
XSL Transformations / 31
boolean(o): converte l’oggetto o in un valore
booleano.
true(): vale sempre true.
false(): vale sempre false.
not(e): vale l’opposto di e.
Le espressioni XPath: Funzioni Numeriche

Principali funzioni sui valori numerici:
–
–
–
–
–
XSL Transformations / 32
number(o): converte l’oggetto o in un valore
numerico.
ceiling(x): restituisce l’intero più piccolo che non sia
minore di x.
floor(x): restituisce l’intero più grande che non sia
maggiore di x.
round(x): arrotonda x a un intero.
sum(ns): converte in numeri (usando number()) tutti i
nodi nell’insieme ns, e ne restituisce la somma.
Le espressioni XPath: Funzioni XSLT
La funzione più importante in questo insieme è
current().
 All’interno dei filtri, è spesso necessario fare
riferimento al contesto esterno in cui il filtro è
inserito (fornito da XSLT, come si vedrà dopo).
 Poiché i path relativi (che non iniziano con ‘/’)
nei filtri hanno sempre come contesto l’insieme
di nodi selezionato fino a quel momento, è
necessario usare current() per accedere al contesto
XSLT.

XSL Transformations / 33
Le espressioni XPath: I Filtri - Esempi
//song[position() = last()]
• l’ultima song nel documento.
//cd[sum(song/length) > 60]/title
• i titoli di tutti i cd in cui la durata totale delle song è
maggiore di 60.
//cd[count(song) < 12]
• i cd con meno di 12 song.
//album[substring-after(substring-after(@date),’/’),’/’)
= ‘2000’]
• gli album in cui l’attributo date è del tipo “…/…/2000”
//album[@ID = current()/@album]
• gli album il cui attributo ID è uguale all’attributo album del
contesto esterno corrente.
XSL Transformations / 34
Un Documento XSLT
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XML Spy v3.0 by Giuseppe Della Penna -->
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<xsl:template match="/">
<html>
<body>
<table width="100%">
<xsl:for-each select="//CD">
<xsl:apply-templates/>
<xsl:sort select="artist" order="ascending"/>
</xsl:apply-templates>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
XSL Transformations / 35
Continua...
Un Documento XSLT
<xsl:template match=”song">
<tr><xsl:attribute name="bgcolor">
<xsl:if test="position() mod 2 = 1">aqua</xsl:if>
</xsl:attribute>
<td><xsl:value-of select="artist"/></td>
<td><b><xsl:value-of select="title"/></b></td>
<td><xsl:choose>
<xsl:when test="@album">
<xsl:value-of select="//album[@ID = current()/@album]/title"/>
</xsl:when>
<xsl:when test="album-title">
<xsl:value-of select="album-title"/>
</xsl:when>
<xsl:otherwise>&#160;</xsl:otherwise>
</xsl:choose></td>
</tr>
</xsl:template>
</xsl:stylesheet>
Continua...
XSL Transformations / 36
Struttura generale

Un documento XSLT, come ogni documento
XML, inizia con una dichiarazione XML.
<?xml version="1.0" encoding="UTF-8"?>

L’elemento root è stylesheet.
–
–
Se il documento deve emettere HTML o un altro
linguaggio, bisogna dichiarare entrambi i
namespaces.
Di solito il linguaggio target viene usato come default
namespace, quindi tutti gli elementi XSLT vanno
prefissati con il loro namespace (xsl:).
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
XSL Transformations / 37
I Template
Un template è una subroutine di
trasformazione.
 L’XPath fornito dall’attributo match viene usato
per filtrare il contesto: tutti i nodi filtrati
vengono elaborati nel template.

<template match="song">...</template>

Ogni stylesheet deve avere un template con
match=“/”, la sua procedura main, che viene
chiamata all’avvio con tutto il documento come
insieme di nodi.
<template match="/">

E’ anche possibile passare parametri a un
template quando viene chiamato!
XSL Transformations / 38
I Template

Un template può venir chiamato da un altro in
due modi: per nome o per selezione.
<call-template name="..."/>
–
richiama il template con l’attributo name dato. In
questo caso l’attributo match del template è ignorato.
<apply-templates select="e" mode="m"/>
–
richiama il template che fa match con i nodi
selezionati da e nel contesto corrente (opzionale) e con
attributo mode uguale a quello dato (opzionale).
–
Con questa forma è possibile gestire documenti dalla
struttura complessa e ricorsiva, lasciando al parser il compito
di cercare il template adatto agli elementi che incontra.
XSL Transformations / 39
Output di Valori

Per trascrivere nel documento di output i valori
dei nodi XML si usa la funzione
<value-of select="e"/>

e è un XPath. Il valore del suo risultato, come
definito nella specifica XPath, viene trascritto nel
documento.
XSL Transformations / 40
Output di Markup

In generale, tutto ciò che non è un elemento
XSLT nel foglio di stile viene copiato in output
quando il parser lo incontra. In questo modo è
possibile inserire markup HTML o di un altro
linguaggio direttamente nello stylesheet.
–
Se il valore di un attributo o il nome di un elemento
devono essere generati dinamicamente (in base al
contenuto del documento), si possono usare gli
elementi
<attribute name="nome">…valore…</attribute>
<element name="{espressione}">...</element>
–
XSL Transformations / 41
notare che all’interno delle virgolette è possibile avere valori
interpretati dal parser XSLT se posti tra graffe.
Iterazione

Per iterare sugli elementi di un insieme di nodi
è disponibile la funzione
<for-each select="xpath">...</for-each>
Il frammento di stylesheet all’interno
dell’elemento viene applicato a tutti i nodi
selezionati dall’XPath specificato.
 E’ possibile ordinare l’insieme dei nodi prima di
applicarvi il frammento di stylesheet inserendo,
immediatamente dopo il tag di apertura (anche
nelle chiamate ai template), elementi del tipo:

<sort select= "xpath-ordinamento" order="ascending"/>
XSL Transformations / 42
Applicazione condizionale

Esistono due costrutti XSLT che consentono di
eseguire frammenti di stylesheet solo se
particolari condizioni sono vere.
<if test="xpath-filter">...</if>

All’interno dell’attributo select valgono le regole
dei filtri di XPath. Se il filtro ha valore vero, il
frammento di stylesheet contenuto nell’elemento
if viene eseguito. In caso contrario, tutto il
contenuto dell’elemento viene ignorato.
XSL Transformations / 43
Applicazione condizionale / 2
<choose>
<when test="xpath-filter">…</when>
...
<otherwise>…</otherwise>
</choose>

L’elemento select equivale all’istruzione switch
del C. Vengono applicati nell’ordine al contesto
corrente tutti i filtri XPath degli elementi when.
Viene valutato solo il frammento di codice
contenuto nel primo when che ha test positivo.
Se nessun when è positivo, viene valutato il
frammento contenuto in otherwise, se presente.
XSL Transformations / 44
Riferimenti

Specifica di XSLT dal W3C
http://www.w3c.org/TR/xslt/

Specifica di XPath dal W3C
http://www.w3c.org/TR/xpath/
XSL Transformations / 45
Scarica

XSLT