Indice

Logo CNR

Logo ISTI

Logo SI-LAB

 

 

 

 

 

  Valid XHTML 1.1! Valid CSS!

XSL

Massimo Martinelli
massimo.martinelli AT isti.cnr.it
Istituto di Scienza e Tecnologie dell'Informazione
Consiglio Nazionale delle Ricerche
via G. Moruzzi, 1 - 56124 Pisa


Corso logo Corso di Laurea Informatica Umanistica CODIFICA DI TESTI

Pisa 10 Dicembre 2018

Le componenti di XML

processo completo di codifica XML

Visualizzazione di markup XML

visualizzazione di markup XML

Esempio d'uso di CSS

visualizzazione con CSS
<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="biblioteca.css"?>
<biblioteca>
  <libro codice="R414">
    <titolo>2001: Odissea nello spazio</titolo>
    <autore>
      <cognome>Clarke</cognome>
      <nome>Arthur Charles</nome>
    </autore>
    <editore>Rizzoli</editore>
    <parola_chiave>romanzo</parola_chiave>
    <parola_chiave>fantascienza</parola_chiave>
  </libro>
</biblioteca>
titolo { display: block;            cognome, nome { display: inline; }
         text-align: center;        editore { display: block;
         background: blue;                 margin-left: 15%;
         color: white;                     color: green;
         font-family: Arial;               font-family: Arial;
         font-size: 20pt                   font-size: 14pt
       }                                 }
autore { display: block;            parola_chiave { display: block;
         margin-left: 10%;                          margin-left: 5%;
         text-align: left;                          color: black;
         color: red;                                font-family: "Times New Roman";
         font-family: Arial;                        text-align: justify;
         font-style: italic;                        font-size: 14pt
         font-size: 14pt                          }
       }

CSS non è sufficiente

eXtensible Stylesheet Language (XSL)

Costituito da 3 parti:

W3C Recommendation

World Wide Web Consortium Process Document

A cosa serve XSLT

Consente di trasformare documenti XML in un altro formato:

Applicazioni

Premessa: Alberi

albero

Nodi dell'albero:

Il processo di trasformazione

processo di trasformazione

Trasformazioni

Lato client

Lato server

Programma

Due esempi

Funzionamento

Regole XSL-T

Template (sagoma)


<xsl:template match="modello">
... trasformazione ...
</xsl:template>

se sagoma uguale modello allora esecuzione della trasformazione

confronto tra sagoma e modello

Esempio di template


    <xsl:template match="nodo">
	 testo <tag> <xsl:value-of select="." /> </tag>
    </xsl:template>

Se un nodo del documento XML combacia con quello della regola dell'esempio viene prodotto come risultato

testo  <tag>  valore (contenuto) dell'elemento corrente </tag>

Dato il seguente frammento XML

<nominativo>Mario Rossi</nominativo>

e il il seguente frammento XSLT

<xsl:template match="nominativo">
       Nominativo: <strong><xsl:value-of select="."/></strong>
</xsl:template>

Risultato trasformazione:

Nominativo:  <strong>Mario Rossi</strong>

Visualizzato da un browser in questo modo:

Nominativo:  Mario Rossi

i nodi?

Abbiamo visto che una regola di template specifica un nodo come sagoma

ma come si specificano i nodi ? ...

XPath

Contesto

Passi di un percorso di localizzazione

Esempi (sintassi non abbreviata) #1

Esempi (sintassi non abbreviata) #2

Esempi (sintassi abbreviata)

Asse

Specifica la direzione verso cui spostarsi a partire dal nodo di contesto

Test sui nodi

Il Node-Test determina il tipo di nodo da selezionare

XPath: Predicati

Esempi

Predicati - Insiemi di nodi - Booleani

Insiemi di nodi

Booleani

  • and
  • or
  • true()
  • false()

Esempio:

<xsl:template match="libro[position() > 2]">
... 
</xsl:template>

Predicati: numeri e stringhe

Stringhe

  • starts-with(string string1, string string2) - Boolean
  • contains(string string1, string string2) - Boolean
  • substring(string string1, number offset, number length) - String
  • substring-before(string string1, string string2) - String
  • substring-after(string string1, string string2) - String
  • string-length(string string1) - Number
  • normalize-space(string string1) - String
  • translate(string string1, string string2,string string3) - String
  • concat(string string1, string string2,...) - String

Numeri

Esempio di trasformazione di XML in HTML

Documento XML

<?xml version="1.0" encoding="UTF-8" ?>
<saluto>
	Benvenuto nel mondo di XSL-T
</saluto>

Documento XSL-T

<?xml version="1.0" encoding='UTF-8'?>
<xsl:stylesheet version="1.0" 
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
   <html>
     <head><title>Saluto</title></head>
     <body>
          <xsl:apply-templates select="saluto"/>
     </body>
   </html>
</xsl:template>

<xsl:template match="saluto">
     <xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>

Risultato della trasformazione

Associare lo stile aggiungendo nel file xml alla 2a riga

<?xml-stylesheet href="esempio3_documento.xsl" title="stile" type="text/xsl"?>

e aprire il file per esempio con Firefox e osservare con firebug oppure con Opera

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>  <-- aggiunta dal processore
<title>Saluto</title>
</head>
<body>
   Benvenuto nel mondo di XSL-T
</body>
</html>

Elementi di XSL-T

Nel successivo esempio vedremo questo template

Esempio di trasformazione di XML in HTML

Documento XML

<?xml version="1.0" encoding="UTF-8" ?>
<documento>
	<autore>Mario Rossi</autore>
</documento>

Documento XSL-T

<?xml version="1.0" encoding='UTF-8'?>
<xsl:stylesheet version="1.0"
         xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
   <html>
     <head><title>Autore</title></head>
     <body>
          <xsl:apply-templates select="documento/autore"/>
     </body>
   </html>
</xsl:template>

<xsl:template match="autore">
     <xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>

Risultato della trasformazione

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Autore</title>
</head>
<body>Mario Rossi</body>
</html>

Elementi di XSL-T

Un altro esempio

Documento XML

<?xml version="1.0" encoding="utf-8" ?>
<documento>
	<autore>Mario Rossi</autore>
</documento>

Documento XSLT

<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		version="2.0">
	<xsl:template match="autore">
		<div>Autore: <strong> <xsl:apply-templates /> </strong></div>
	</xsl:template>
</xsl:stylesheet>

Applica i template relativi agli elementi figli (ove ve ne siano)
...e non solo...

Il risultato della trasformazione

<div>
Autore:
<strong>Mario Rossi</strong>

</div>

Attenzione: non funziona come ci aspetteremmo perché esistono delle regole predefinite...

 

p.s. togliamo i due tag <div> e </div> e controlliamo cosa fanno firefox e opera:

Esempio di template

<xsl:template match="nodo">
	 testo <tag> <xsl:apply-templates /> </tag>
</xsl:template>
 testo  <tag>
   valore dell'elemento corrente                          <--regola di default
   applicazione delle altre regole di template 
</tag>

Regole XSLT precostituite, per difetto (default)


1.   <xsl:template match="/ | *">                       Applica le regole per qualsiasi elemento
         <xsl:apply-templates/>
      </xsl:template>

2.   <xsl:template match="text()">                      per qualsiasi testo
	  <xsl:value-of select="."/>
     </xsl:template>

3.  <xsl:template match="@*">                           La regola per gli attributi è "ingannevole"
	<xsl:value-of select="."/>                       Se non specifichiamo il template per gli attributi
    </xsl:template>                                     non vengono prodotti in output i valori

4.   <xsl:template match="comment()"/>                  Non applicare le regole per i  commenti

5.   <xsl:template match="processing-instruction()"/>   Ne per le istruzioni di processo

Esempio minimale #1

Dato il seguente file XML ...

<?xml version="1.0"?>
<biblioteca>
   <libro codice="R415">
	<titolo>Destinazione cervello</titolo>
	<autore>
		<cognome>Asimov</cognome>
		<nome>Isaac</nome>
	</autore>
	<editore>Mondadori</editore>
	<parola_chiave>romanzo</parola_chiave>
	<parola_chiave>fantascienza</parola_chiave>
   </libro>
      <libro codice="N516">
	<titolo>Sostiene Pereira</titolo>
	<autore>
		<cognome>Tabucchi</cognome>
		<nome>Antonio</nome>
	</autore>
	<editore>Feltrinelli</editore>
	<parola_chiave>romanzo</parola_chiave>
	<parola_chiave>narrativa</parola_chiave>
   </libro>
</biblioteca>

Esempio minimale #2

... e il seguente stylesheet minimale


<?xml version="1.0" encoding='UTF-8'?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 
</xsl:stylesheet>

Esempio minimale #3

il risultato della trasformazione:

<?xml version="1.0" encoding="UTF-8"?>   <--Prologo XML


   
	Destinazione cervello
	
		Asimov
		Isaac
	
	Mondadori                <-- contenuto degli elementi senza i relativi tag
	romanzo
	fantascienza
   
      
	Sostiene Pereira
	
		Tabucchi
		Antonio
	
	Feltrinelli              <-- Attenzione agli spazi prodotti!!!
	romanzo                  Il secondo template di default ha 
	narrativa                prodotto in output anche gli spazi

Sostituzione delle regole precostituite

<xsl:template match="nodo">
</xsl:template>

Non applica alcuna trasformazione per il nodo specificato

 

<xsl:template match="*|text()" />

Non applica alcuna per gli elementi e per i testi (a meno di regole più specifiche)

Tipo di Output

apply-templates

<xsl:apply-templates/>

 

<xsl:apply-templates select="nodo" />

Output XHTML

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"
    doctype-public="-//W3C//DTD XHTML 1.1//EN"
    doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"/>

<xsl:template match="/">
   <html xmlns="http://www.w3.org/1999/xhtml">
     <head>
       <title>esempio di output XHTML</title>
     </head>
     <body>
        <xsl:apply-templates />
     </body>
     </html>
</xsl:template>
  ...
</xsl:stylesheet>

Esempio

Concorso CNR 2017

Problema: ottenere elenco pubblicazioni seguendo le regole del concorso

2018: Martinelli M., Tampucci M. - Ottenere l'elenco delle pubblicazioni CNR con 'stile' - Nota tecnica aperta.

file pubblicazioni scaricato dal sito People CNR

file XSLT

Esercizio

Dato il seguente documento XML:

<?xml version="1.0"?>
<brano id="5">
	<titolo>Asturias<titolo/>
	<autore>Andres Segovia</autore>
	<incisione>Deutsche Grammophon</incisione>
</brano>

Trasformare in XHTML 1 (strict) in modo da produrre questo risultato:

                                Titolo brano: Asturias
                                Identificatore: 5
                                Incisione: Deutsche Grammophon

Risoluzione dei Conflitti - Precedenza tra template

La priorità di default è determinata come segue:

Esempi

Ricorsività delle regole di template

i
<doc>
<para>Questo è un <em>esempio</em>.
<em>Contenuto  <emphasis>nidificato</emphasis></em>.</para>
</doc>
<html>
<head>
<title>titolo del documento</title>
</head>
<body>
<p>Questo è un <em>esempio</em>.
<em>Contenuto <span>nidificato</span></em>.</p>
</body>
</html>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="doc">
  <html><head><title>Titolo del documento</title></head>
  <body><xsl:apply-templates/></body></html>
</xsl:template>

<xsl:template match="para">
  <p><xsl:apply-templates/></p>
</xsl:template>

<xsl:template match="em">
  <em><xsl:apply-templates/></em>
</xsl:template>

<xsl:template match="em/em">
  <span><xsl:apply-templates/></span>
</xsl:template>
</xsl:stylesheet>

Modi

A volte può essere necessario includere più volte lo stesso nodo del documento sorgente in quello finale, ovvero applicare più trasformazioni sullo stesso nodo (ad esempio per fare un indice di oggetti presenti nel documento).
I modi permettono di applicare più regole per lo stesso nodo

<?xml version="1.0"?>
<capitolo id="c1"> <titolo>Titolo capitolo</titolo>
<para>Questo capitolo si auto referenzia:
<xref linkend="c1" /> . </para>
</capitolo>
<h2>Titolo capitolo</h2>
<p>Questo capitolo si auto referenzia:
<em>Titolo capitolo</em>.</p>
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     version="1.0">

<xsl:output method="html"/>

<xsl:template match="capitolo/titolo">
  <h2><xsl:apply-templates/></h2>
</xsl:template>

<xsl:template match="capitolo/titolo" mode="crossref">
  <em><xsl:apply-templates/></em>                   \
</xsl:template>                                       \
                                                        \
                                                    applica questo
                                                              \
<xsl:template match="xref">                                     \
  <xsl:variable name="linkend" select="@linkend"/>                \
  <xsl:apply-templates select="//*[@id=$linkend]/titolo" mode="crossref"/>
</xsl:template>

<xsl:template match="para">
  <p><xsl:apply-templates/></p>
</xsl:template>

</xsl:stylesheet>

xsl:text

<xsl:text>xyz</xsl:text>

Restituisce in output il testo xyz

 

Scrivere xyz all'interno di un template è equivalente

<xsl:template match="nome_elemento">
  xyz
</xsl:template>

xsl:comment

Commenti in XSL-T

<xsl:comment>commento</xsl:comment>

xsl:for-each

Come abbiamo visto XSL-T permette di elaborare elementi multipli contenuti all'interno di altri elementi mediante l'applicazione di due template:
il primo fa eseguire il secondo al suo interno.

<xsl:template match="persona">
      <xsl:apply-templates select="cognome"/>
  </xsl:template>

  <xsl:template match="cognome">
       <xsl:value-of select="."/>
  </xsl:template>

Esiste un'altra regola, molto più leggibile, che permette di ottenere lo stesso risultato:
<xsl:for-each select="el"> Cicla su tutti gli elementi el all'interno dell'elemento corrente

<xsl:template match="persona">
     <xsl:for-each select="cognome">
          <xsl:value-of select="."/>
     </xsl:for-each>
</xsl:template>

select="." all'interno del for-each seleziona l'elemento selezionato dal for-each (cognome)

Elementi di controllo:

condizioni

xsl:if (valori booleani) - Elaborazione condizionale ("if" senza "else")

<xsl:if test="$condizione">
    questo messaggio apparirà solo se $condizione è true
</xsl:if>

Dividiamo gli autori con una virgola:

<xsl:template match="autore">
   <xsl:value-of select="./cognome" />
   <xsl:text>  </xsl:text>
   <xsl:value-of select="./nome" />
   <xsl:apply-templates />
   <xsl:if test="not(position()=last())">, </xsl:if>
</xsl:template>                          ^

Dichiarazione di variabili - xsl:variable

<xsl:variable name="var" expr="subelement[position() mod 3]"/>

* Notare la dichiarazione di una variabile il cui valore è una espressione matematica

apply-template multipli

<xsl:template match="film">
  <h1> elenco dvd</h1>
  <table>
    <xsl:apply-templates select="dvd"/>
  </table>
  <h1> elenco videocassette</h1>
  <table>
  	<xsl:apply-templates select="cassetta"/>
  </table>
</xsl:template>

xsl:choose - alternative

Supponiamo di dover gestire la prenotazione di lezioni che possono essere di gruppo o individuali

<xsl:template match="lezione">
    <h3><xsl:value-of select="titoloLezione"/></h3>
    <h4>Aula: <xsl:value-of select="../../@name"/></h4>
    <h4>Prenotata da : <xsl:value-of select='prenotataDa'/></h4>
    <h4>Allievi:</h4>
    <xsl:for-each select='allievi'>
      <xsl:choose>
        <xsl:when test="gruppo">   <-- Esiste un elemento gruppo figlio dell'elemento corrente ?
          &#160;&#160;Gruppo: <em><xsl:value-of select="gruppo"/></em><br />
        </xsl:when>
        <xsl:otherwise>
          &#160;&#160;<xsl:value-of select="individuo"/><br />
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
    <p> dalle ore <xsl:value-of select="oriario/da"/> 
	     alle ore <xsl:value-of select="orario/alle"/></p>
     . . .
</xsl:template>                    &#160; == &nbsp;

xsl:choose #2

<xsl:template match="elemento">
     <xsl:variable name="var" expr="sottoelemento[position() mod 3]"/>
      <xsl:choose>
        <xsl:when test='$var=1'>
          ... fai qualcosa...
        </xsl:when>
      <xsl:when test='$var=2'>
	     ... fai un'altra cosa ...
        </xsl:when>
        <xsl:otherwise>
          ... fai qualcosaltro ...
        </xsl:otherwise>
      </xsl:choose>
  <xsl:apply-templates/>
</xsl:template>

xsl:sort

Modificare l'ordine dei libri per autore

<xsl:template match="biblioteca">
	<xsl:apply-templates select="libro[code >= 'M']" >
		<xsl:sort select="libro/autore/cognome" />			  Ordina per cognome
		<xsl:sort select="libro//nome" />					poi per nome
	</xsl:apply-templates>
</xsl:template>

Supponendo di voler modificare l'ordine per prezzo (numerico)

<xsl:sort select="libro/prezzo"
		order="descending"            Specifica l'ordine discendente (per difetto = ascending)
		data-type="number" />			Specifica il tipo di dato (per difetto = text)

xsl:number

Numerazione

<xsl:template match="libro">
    <xsl:number />
    <xsl:text> </xsl:text>                Inserisce uno spazio tra il numero e il titolo
	<xsl:value-of select="titolo" />
</xsl:template>

xsl:number inserisce una sequenza di numeri contanto il numero dei fratelli che precedono l'elemento e aggiunge 1

 

1 Destinazione cervello
2 Sostiene Pereira

xsl:number format

Indica il normato della numerazione

<xsl:number format="tipo_formato">

tipo_formato

Numerazione multipla (xsl:number multiple)


<xsl:template match="titolo">
    <xsl:number level="multiple" 
      count="capitolo|sezione|sottosezione"
      format="1.1.a" />
	<xsl:apply-templates />
</xsl:template>
1  		Titolo del capitolo
1.1 	Titolo della Sezione 
1.1.a	Titolo della Sottosezione 
1.2	...

Se aggiungo questo:

<xsl:template match="capitolo/titolo">
    <xsl:number level="multiple" 
      count="capitolo"
      format="1:" />
	<xsl:apply-templates />
</xsl:template>
Capitolo 1  Titolo del capitolo
1.1 	Titolo della Sezione 
1.1.a	Titolo della Sottosezione 
1.2	...

xsl:element

<xsl:element name="nome_elemento">

Crea un elemento <nome_elemento> e lo restituisce in uscita

<xsl:element name="cognome">
	 <xsl:value-of select=".">
</xsl:element>

Crea un elemento <cognome> contenente il valore dell'elemento corrente

xsl:attribute

<xsl:attribute name="nome_attributo">

Crea un attributo nome_attributo su <xsl:element> corrente.

Il contenuto di <xsl:attribute> diventa il valore dell'attributo creato

<indirizzo_sito_web>http://www.cnr.it</indirizzo_sito_web>


<xsl:element name="a">
	<xsl:attribute name="href">
		<xsl:value-of select="indirizzo_sito_web">
	</xsl:attribute>
   il sito web del CNR
</xsl:element>
<a href="http://www.cnr.it">il sito web del CNR</a>

Id e key

Riferimenti incrociati e funzione id()

<xsl:value-of select="id(@refid)/@reftext" />

restituisce l'attributo @reftext del nodo che ha un id con un valore equivalente al valore @refid del nodo corrente

solo un attributo deve essere dichiarato ID nella DTD/Schema

Key supera questo limite

Ottimo esempio capitolo 5 del libro "XSL-T" O'Reilly

Invocazione di template ("procedure")

XSL-T mette a disposizione la possibilita di invocare una regola template per nome passandogli dei parametri

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:param name="nome" />		// parametro con visibilità globale

<xsl:template name="calcoloArea">
	<xsl:param name="larghezza" />
	<xsl:param name="altezza" />
	
	<xsl:value-of select="$larghezza * $altezza" />
</xsl:template>
<xsl:call-template name="calcolaArea">		// invoca il template
	<xsl:with-param  name="larghezza" select="10" />	// passaggio di parametro
	<xsl:with-param  name="altezza" select="20" />	// passaggio di parametro
<xsl:call-template>

</xsl:stylesheet>

I template si possono invocare ricorsivamente (call template all'interno dello stesso template che chiama)
Un ottimo esempio è il template Somma riportato nel capitolo 7 sezione 2 del libro "XSL-T" O'Reilly
http://oreilly.com/catalog/orxmlapp/chapter/ch07.html

xsl:import - xsl:include

XSL-T mette a disposizione due metodi per combinare regole template contenute in documenti distinti: import e include

<xsl:import href = "uri-reference" />  	href = URI del foglio di stile da importare
<xsl:import>    importa uno stylesheet esterno

Le regole template importate da un'altro documento hanno una priorità inferiore.

<xsl:include href = "uri-reference" />

<xsl:include> include le regole da un altro documento:
Le regole template incluse da un altro documento hanno la stessa priorità di quelle contenute nel primo documento.

Questi due metodi vanno specificati subito dopo il tag <xsl:stylesheet>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="nomefile.xsl"/>
<xsl:include href="nomealtrofile.xsl"/>
...
</xsl:stylesheet>

document

Un foglio di stile può elaborare più di un documento XML caricando altri documenti con la funzione document()

prodotti.xml

<?xml version="1.0"?>
<prodotti>
    <prodotto>
         <nome>Monitor<nome>
         <prezzo valuta="eu">900</prezzo>
         <descrizione>Display LCD ... </descrizione>
    </prodotto>
    ...
</prodotti>

valute.xml

<?xml version="1.0"?>
<valute>
    <valuta>
         <codice>eu<codice>
         <nome>Euro<nome>
    </valuta>
    ...
</valute>
...
<xsl:variable
   nome=valute
   select="document(valute.xml)/valute" />
...
<xsl:template match="prodotto">
     <xsl:variable name="valuta" select="prezzo/@valuta" />
     <xsl:value-of select="prezzo" />
      <xsl:value-of select="$valute/valuta[codice="$valuta"]/nome" />
     <xsl:value-of select="descrizione" />
</xsl:template>

Estensioni

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/XSL/Transform"
xmlns:myxslt="http://www.apache.org/xslt" exclude-result-prefixes="myxslt">
...
<xsl:variable name="angolo" select="javascript-extension:cos(90)" />
...
<myxslt:component prefix="javascript-extension" functions=cos sin">
   <myxslt:script lang="javascript">
  function cos(a)
  { 
   return Math.cos(a); 
   }

  function sin(a)
  { 
   return Math.cos(a); 
   }
 </myxslt:script>
</myxslt:component>
...
</xsl:stylesheet>

Processori XSL-T

Linux:

sudo apt-get install xsltproc
    
xsltproc --output risultato.xml directorystile/stile.xsl directorysorgente/sorgente.xml

Programmazione

Da una applicazione si può richiamare un processore XSL per eseguire una trasformazione di un documento XML

XSLTProcessor processor = XSLTProcessorFactory.getProcessor(); 
processor.process(new XSLTInputSource(XMLFile), 
new XSLTInputSource(XSLFile), 
new XSLTResultTarget(NewXMLFile));

Apache Xalan (XSL 1.0)

Saxonica saxon (XSL 1.0 e 2.0)

Apache FOP (XSL 1.0 e XSL-FO)

Preparazione all'esercizio (Trasformazione lato server o da linea di comando)

Esercizio

Dato il seguente documento XML
<?xml version="1.0"?>
<anagrafe>
	<persona>
		<cognome>Rossi</cognome>
		<nome>Mario</nome>
		<datanascita>
			<giorno>15</giorno>
			<mese>05<mese>
			<anno>2003<anno>
		</datanascita>
	<persona>
	<persona>
		...
	<persona>
</anagrafe>

Trasformare in XHTML con una tabella come questa:

<table summary="...." >
    <caption>
    <thead>
	<tr>
	<th>cognome</th>
	</tr>
    </thead>
    <tbody>
	<tr>
	    <td>Rossi</td><td>Mario</td><td>15/05/2003</td>
	<tr>
    </tbody>
</table>

I valori devono essere ordinati per anno, mese, giorno di nascita

Esempi

Analizziamo gli esempi iniziali
trasformazione di un stesso documento XML in SVG, HTML e PDF

Risorse su XSLT

Una parentesi: XQuery (Recommendation W3C)

Linguaggio di interrogazione
SQL : database relazionali = XQuery : documenti XML su Web

"Trasformazione" da XML a XML

Si avvaleva di un XPath modificato

Forti implicazioni con XSL (XPath2 uniforma l'uso nei due linguaggi XSL e XQuery)

Esempio XQuery FLWOR

<utenti>
  <utente>
    <userid>U01</userid>
    <nome>Mario Rossi</nome>
  </utente>
  ...

Elenca i nomi degli utenti che hanno fatto un acquisto singolo di almeno 100 euro

<risultato>
  {
    for $u in document("utenti.xml")//utente
    let $s := document("acquisti.xml")//acquisto[userid=$u/userid and costo>=100]
    where count($s) > 1								Se c'è n'è almeno uno
    order by $u/utente/nome descending
    return
        <spendaccione>{ $u/nome/text() }</spendaccione>
  }
</risultato>

Risultato effettivo :
<risultato>
    <spendaccione>Maria Bianchi</spendaccione>
    <spendaccione>Anna Verdi</spendaccione>
    <spendaccione>Giuseppe Gialli</spendaccione>
</risultato>

Grazie per l' attenzione

Domande?


... troverete le slide all'indirizzo (http://www1.isti.cnr.it/~Martinelli/XML/doc/xsl/)