Linguaggi e tecnologie per il Web
Corso di Laurea in Ingegneria Informatica e Automatica
Sapienza Università di Roma
a.a. 2017/2018
XML
Parte 5:
Fogli di stile per XML: XSL e XSLT
Luigi Dragone, Riccardo Rosati
XSL 1.0: W3C Recommendation del 21/11/2000
XSL 1.1: W3C Recommendation del 5/12/2006
XSLT 1.0: W3C Recommendation del 16/11/1999
XML Stylesheet Language (XSL) è composto di due parti:
XML Stylesheet Language (XSL) utilizza altri due standard:
La visualizzazione viene realizzata in due passi:
Attualmente si usa principalmente HTML come formato di visualizzazione.
Collegamento del foglio di stile al documento:
<?xml-stylesheet type="text/xsl"
href="URL"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/XSL/Transform/1.0"
xmlns:fo="http://www.w3.org/XSL/Format/1.0">
Oltre alla visualizzazione dei documenti:
In pratica XSLT si può considerare un linguaggio di programmazione per documenti (attraverso la struttura ad albero del documento costruita dal parser XML, rappresentata tramite insiemi di nodi [node-set])
Linguaggio dichiarativo (funzionale, basato su regole) alternativo a DOM (SAX) per gestire le operazioni sull'albero di sintassi di un documento
W3C Recommendation del 14/1/1999
http://www.w3.org/TR-REC-xml-names/
Permettono di:
<titolo> accademico |
<titolo> di una pubblicazione |
Si usa un namespace diverso per ogni DTD da integrare
<persona:titolo> accademico |
<libro:titolo> di una pubblicazione |
Fatte nell'etichetta iniziale di un elemento usando l'attributo speciale xmlns:prefisso:
<nome-el xmlns:prefisso="URI" ... >
W3C Recommendation del 16/11/1999
http://www.w3.org/XPath/
Si basa sul DOM e sulla struttura ad albero di un documento:
Descrive come selezionare (insiemi di) nodi all'interno di un documento:
La manipolazione delle informazioni individuate attraverso XPath può avvenire tramite XSLT o XPointer
XPath | node-set | |
libro | ogni el. libro (relativo) | |
* | ogni el. (relativo) | |
@prezzo | l'attributo prezzo | |
/bib | l'elemento radice bib | |
/bib/libro | ogni libro in bib | |
/bib//libro | ogni libro in bib a qualsiasi livello | |
//libro | ogni libro (ad ogni livello) | |
/bib/libro/@prezzo | l'attributo prezzo di un libro in bib | |
../libro | elementi libro figli del padre (rel) | |
capitolo[2]/sezione[1] | figlio 1 sezione del figlio 2 capitolo (rel) | |
libro[cond] | ogni libro che verifica cond | |
//libro[@prezzo] | ogni libro che ha un prezzo | |
//libro[anno] | ogni libro che ha un sottoel. anno | |
libro|articolo | ogni libro o articolo |
XSLT ha un proprio namespace con URI:
http://www.w3.org/1999/XSL/Transform
Elemento radice: xsl:stylesheet
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
Permette di trasformare:
Entrambi i documenti vengono visti come alberi (XSLT è un linguaggio di trasformazione tra alberi).
Per processare documenti HTML è necessario trasformarli in
XHTML (ad es., utilizzando HTMLTidy).
Non permette trasformazioni tra formati generici (PDF,
PostScript, RTF, TEX , ...) anche se l'utilizzo di
uno specifico processore FO permette di produrre output in tali formati
Da un punto di vista astratto, XSLT si basa sulla ricorsione strutturale come modello di computazione.
XSLT è un linguaggio di trasformazione molto espressivo.
<DOC>
<A>3</A>
<A> <B>xxx</B>
<C>5</C> </A>
<B>4</B>
</DOC>
Vogliamo estrarre da questo documento tutti gli elementi il cui testo è costituito da un numero, cioè ottenere:
<RIS><I>3</I> <I>5</I> <I>4</I></RIS>
La specifica dell'operazione è ricorsiva:
f(<DOC>cont</DOC>) = <RIS>f(cont)</RIS>
f(e1 ... en) = f(e1)...f(en)
f(<e>cont</e>) = f(cont)
f(text) = if (isInt(text)) <I>text</I>
else StringaVuota
f(StringaVuota) = StringaVuota
XSLT realizza la ricorsione strutturale attraverso regole e template:
Estrai i titoli di libri ed articoli dall'insieme di voci
bibliografiche
<xsl:template match="/bib//(libro|art)/tit">
<titolo>
<xsl:value-of select="."/>
</titolo>
</xsl:template>
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
XSLT mette a disposizione un insieme di elementi ed attributi con
significato particolare per selezionare nodi e generare output.
Consente di specificare il namespace, la versione ed altri attributi dello stylesheet
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
...
</xsl:stylesheet>
Output è un elemento di primo livello: attraverso l'attributo method di xsl:output è possibile specificare la forma dell'output:
Altri attributi di xsl:output: -
<xsl:output method="html"/>
<xsl:template>
<xsl:apply-templates/>
<xsl:call-template>
Produce in output la lista dei nomi di atomi.
Chiamiamo "istruzioni XSLT" gli elementi XSLT che si usano all'interno dei template
Esempio:
<xsl:value-of>
Tutti gli elementi (non-istruzioni) che si incontrano nel corpo di un template vengono considerati "Elementi letterali del risultato" e riportati testualmente in uscita.
<ATOMO STATO="GAS">
<NOME>Elio</NOME> </ATOMO>
<ATOMO STATO="SOLIDO"> <NOME>Oro</NOME> </ATOMO>
<xsl:template match="ATOMO">
<xsl:element name="@STATO">
<NOME> <xsl:value-of
select="NOME"/> </NOME>
</xsl:element>
</xsl:template>
Sostituisce ATOMO con il valore dell'attributo STATO:
<GAS> <NOME>Elio</NOME>
</GAS>
<SOLIDO> <NOME>Oro</NOME> </SOLIDO>
a
viene sostituito con un elemento A
e si continua a processare il contenuto:<xsl:template match="a">
<A><xsl:apply-templates/></A>
</xsl:template>
L'elemento b
viene sostituito con un elemento B
e si copia il contenuto
<xsl:template match="b">
<B><xsl:value-of select="."/></B>
</xsl:template>
L'elemento c
viene cancellato e si continua a
processare il contenuto
<xsl:template match="c">
<xsl:apply-templates/>
</xsl:template>
Per tutti gli altri elementi (*) si costruisce un elemento con lo
stesso nome e si processa il contenuto:
<xsl:template match="*">
<xsl:element name="{name()}"><xsl:apply-templates/></xsl:element>
</xsl:template>
Input
<a> <c> <a> |
<A> <A> |
Normalmente, per generare del testo in output è sufficiente
includerlo nella regola template:
<xsl:template match="TAVOLA-PERIODICA">
Atomi della tavola periodica:
<xsl:apply-templates select="ATOMO"/>
</xsl:template>
Per preservare gli spazi bianchi si può usare <xsl:text>
<xsl:template match="TAVOLA-PERIODICA">
<xsl:text>Atomi della tavola periodica:
</xsl:text>
<xsl:apply-templates select="ATOMO"/>
</xsl:template>
Normalmente, per i caratteri speciali "&" e "<"
viene emessa una sequenza di escape:
<xsl:text>
& <
</xsl:text>
emette: & <
Si può disabilitare l'escaping per nodi di testo:
<xsl:text disable-output-escaping="yes">
& <
</xsl:text>
emette: & <
Il nodo selezionato viene copiato dall'input all'output.
Per copiare anche nodi figlio, attributi, ...si può usare <xsl:apply-templates> all'interno di <xsl:copy>.
Esempio: trasformazione identità
<xsl:template
match="*|@*|comment()|pi()|text()">
<xsl:copy>
<xsl:apply-templates
select="*|@*|comment()|pi()|text()"/>
</xsl:copy>
</xsl:template>
Può essere adattata opportunamente per effettuare trasformazioni tra due formati molto simili.
XSLT è un linguaggio funzionale puro, ovvero il concetto di variabile dei linguaggi imperativi o ad oggetti non è definito (non esiste nessuno stato). Esiste, tuttavia la possibilià di definire delle variabili o parametri come "puntatori" a porzioni del documento XML da processare ovvero risultati di query XPath (result tree-fragment).
Le variabili XSLT consentono di compattare la codifica della
trasformazione o ad esprimere interrogazioni complesse.
A differenza delle variabili
proprie, le variabili XSLT non possono essere riassegnate.
Lo scope di una variable può essere globale all'intero foglio
di stile oppure locale ad un template.
I parametri sono particolari variabili da utilizzarsi per passare valori o dati ad un template. I parametri globali sono definiti per l'intero foglio di stile e devono essere valorizzati dal processo che invoca la trasformazione.
Assegna ad una variabile il nodeset derivante dalla valutazione di
un'espressione XPath
<xsl:variable name="v"
select="//libro[@titolo = 'XML']/autore"/>
La variabile può essere utilizzata nelle successive
espressioni XPath dello stesso template (visibilità locale)
<xsl:value select="//libro[./autore = $v]"/>
Un template dichiara la presenza di un parametro (argomento formale)
con il costrutto <xsl:param>
<xsl:template name="t">
<xsl:param name="p"/>
...
La valorizzazione di un parametro (argomento attuale) con il costrutto <xsl:with-param>
<xsl:call-template name="t">
<xsl:with-param name="p" select="//e[@id =
$v]"/>
</xsl:call-template>
I parametri vengono referenziati con la stessa sintassi delle variabili
XSLT definisce due regole che sono attive in tutti gli stylesheet (a meno che non vengano mascherate esplicitamente)
Regola di default per elementi: discende ricorsivamente
<xsl:template match="*|/">
<xsl:apply-templates/>
</xsl:template>
Regola di default per nodi testo / nodi attributo: copia il testo /
valore dell'attributo da input ad output
<xsl:template match="text()|@*">
<xsl:value-of select="."/>
</xsl:template>
<?xml version="1.0" encoding="UTF-8"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="simple" page-height="29.7cm" page-width="21.0cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm" margin-top="2cm"> <fo:region-body margin-top="1cm" margin-bottom="1cm"/> <fo:region-before extent="1cm"/> <fo:region-after extent="1cm"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="simple"> <fo:flow flow-name="xsl-region-body"> <fo:block space-before="6pt" space-after="4pt" text-align="justify"> Testo <fo:inline font-size="14pt" font-color="red">formattato</fo:inline> contenuto nell'area </fo:block> <fo:block><fo:external-graphic src="url(immagine.gif)" /></fo:block> </fo:flow> </fo:page-sequence> </fo:root>
processore XSLFO = traduttore da XSLFO ad un formato target testuale
principali processori XSLFO open-source:
formato target principale: PDF
altri formati target supportati (.TXT, .PS, .RTF,...)
XSL Transformations (XSLT)
Version 1.0 W3C Recommendation 16 November
1999
XSL Transformations (XSLT)
Version 2.0 W3C Recommendation 23 January
2007
XML Path Language (XPath)
Version 1.0 W3C Recommendation 16 November
1999
Extensible Stylesheet
Language (XSL) Version 1.1 W3C Recommendation
5 December 2006
Namespaces in XML
W3C
Recommendation 8 December 2009
XML Linking Language (XLink) Version 1.0 W3C Recommendation 27 June 2001
Chapter 17: XSL Transformations The XML Bible (Second Edition) 2001, Elliotte Rusty Harold
Chapter
18: XSL Formatting Objects The XML Bible (Second
Edition) 2001, Elliotte Rusty Harold
Chapter 19: XLinks The XML Bible (Second Edition) 2001, Elliotte Rusty Harold