Linguaggi e tecnologie per il Web
Corso di Laurea in Ingegneria Informatica e Automatica
Sapienza Università di Roma
a.a. 2015/2016

XML

Parte 5:
Fogli di stile per XML: XSL e XSLT

Luigi Dragone, Riccardo Rosati


Fogli di stile per XML: XSL e XSLT


XSL e XSLT

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:

  1. XSLTransformations: linguaggio per la specifica di trasformazioni di documenti XML
  2. XSL Formatting Objects (XSLFO): linguaggio per la descrizione della formattazione e disposizione di testo in un documento

XML Stylesheet Language (XSL) utilizza altri due standard:

  1. Namespaces: sevono per definire il campo di azione degli identificatori
  2. XPath: linguaggio per identificare gli elementi di un documento

Visualizzazione con XSL

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 Formatting Objects (XSLFO)

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/XSL/Transform/1.0"
  xmlns:fo="http://www.w3.org/XSL/Format/1.0">


Altri usi di XSLT

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


Namespace

W3C Recommendation del 14/1/1999

http://www.w3.org/TR-REC-xml-names/

Permettono di:

Si usa un namespace diverso per ogni DTD da integrare
<persona:titolo> accademico
<libro:titolo> di una pubblicazione


Dichiarazioni di namespace

Fatte nell'etichetta iniziale di un elemento usando l'attributo speciale xmlns:prefisso:

<nome-el  xmlns:prefisso="URI" ... >

<xsl:stylesheet xmlns:xsl="http://www.w3.org/...">
  <xsl:template match="ATOM">
    <P> <xsl:apply-templates/> </P> 
  </xsl:template> 
</xsl:stylesheet>

Namespace - Osservazioni


XPath

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


Espressioni XPath


Percorsi-Location Paths

 
  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


Operatori e funzioni predefiniti in XPath


Documento XSLT

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">

IE 5.0 richiede un namespace diverso (ma IE6 è diventato conforme allo standard W3C):

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/TR/WD-xsl"
  version="1.0">


XSLT come linguaggio di trasformazione

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


Ricorsione strutturale

Da un punto di vista astratto, XSLT si basa sulla ricorsione strutturale come modello di computazione.

XSLT è un linguaggio di trasformazione molto espressivo.


Ricorsione strutturale - Esempio

   <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 - Template e regole

XSLT realizza la ricorsione strutturale attraverso regole e template:


Applicazione delle regole


XSLT - Esempio

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.


Elementi ed attributi di XSLT

  1. Elemento iniziale: <xsl:stylesheet>
  2. Elementi di primo livello (Es. output)
  3. Elementi template
  4. Istruzioni XSLT

Elemento iniziale

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>


Elemento xsl:output

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"/>


Elementi template

<xsl:template>

<xsl:apply-templates/>

<xsl:call-template>


XSLT - Esempio (2)



<TAVOLA-PERIODICA>
  <ATOMO> <NOME>Idrogeno</NOME> ... </ATOMO>
  <ATOMO> <NOME>Elio</NOME> ... </ATOMO>
  ...
</TAVOLA-PERIODICA>

<xsl:template match="TAVOLA-PERIODICA">
   <xsl:apply-templates select="ATOMO"/>
</xsl:template>

<xsl:template match="ATOMO">
   <xsl:value-of select="NOME"/>
</xsl:template>

Produce in output la lista dei nomi di atomi.


Istruzioni XSLT

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.


Istruzione <xsl:for-each>

<TAVOLA-PERIODICA>
  <ATOMO> <NOME>Idrogeno</NOME> ... </ATOMO>
  <ATOMO> <NOME>Elio</NOME> ... </ATOMO>
   ...
</TAVOLA-PERIODICA>

<xsl:template match="TAVOLA-PERIODICA">
    <xsl:for-each select="ATOMO">
         <xsl:value-of select="NOME"/>
    </xsl:for-each>
</xsl:template>

Istruzione <xsl:element>

<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>


Ristrutturazione profonda

L'elemento 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>


Ristrutturazione profonda (2)

Input
<a> <c> <a> 
<b>1</b>
<b>2</b>
</a>
<f><b>3</b>
</f>
</c>
<b> <c>4</c> 5 </b>
</a>
 

Output
<A> <A> 
<B>1</B>
<B>2</B>
</A>
<f> <B>3</B>
</f>

<B> 4 5 </B>
</A>


Ristrutturazione profonda (3)

Passo 1

Ristrutturazione profonda (4)

Passo 2

Ristrutturazione profonda (5)

Passo 3

Ristrutturazione profonda (6)

Passo 4

Ristrutturazione profonda (7)

Passo 5

Ristrutturazione profonda (8)

Passo 6

Ristrutturazione profonda (9)

Passo 7

Ristrutturazione profonda (10)

Passo 8

Ristrutturazione profonda (11)

Passo 9

Ristrutturazione profonda (12)

Passo 10

Ristrutturazione profonda (13)

Passo 11

Ristrutturazione profonda (14)

Passo 12

Ristrutturazione profonda (15)

Passo 13

Ristrutturazione profonda (16)

Passo 14

Ristrutturazione profonda (17)

Passo 15

Ristrutturazione profonda (18)

Passo 16

Ristrutturazione profonda (19)

Passo 17

Ristrutturazione profonda (20)

Passo 18

Ristrutturazione profonda (21)

Passo 19

Ristrutturazione profonda (22)

Passo 20

Ristrutturazione profonda (23)

Passo 21

Ristrutturazione profonda (24)

Passo 22

Istruzione <xsl:text>

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>


Generazione di caratteri speciali in output

Normalmente, per i caratteri speciali "&" e "<" viene emessa una sequenza di escape:

<xsl:text>
  &amp; &lt;
</xsl:text>

emette: &amp; &lt;

Si può disabilitare l'escaping per nodi di testo:

<xsl:text disable-output-escaping="yes">
  &amp; &lt;
</xsl:text>

emette: & <


Istruzione <xsl:copy>

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.


Variabili

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.


Istruzione <xsl:variable>

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]"/>


Parametri

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


Regole di default

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>


XSLFO: esempio

<?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> 


Processori per XSLFO

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,...)


Riferimenti

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