XSL - DISI

Transcript

XSL - DISI
Rappresentare
i file XML - XSL
Laura Papaleo
[email protected]
CSS2, XSL, XSLT, XPath
1
XSL - eXstensible Stylesheet Language
XSL Raccomandazione del W3C (2001)
Per aumentare la flessibilità dello standard
XML
ü
ü
Più sofisticato di CSS
Contiene specifiche di CSS e DSSSL
XSL consiste di tre parti:
ü
ü
ü
Un linguaggi o per trasformare i documenti XML (XSLT)
un vocabolario per definire la formattazione (XSL)
una sintassi per indirizzare parti di un documento ad una certa
formattazione (XPath)
2
1
XSL è uno Standard W3C
XSL è uno standard del World Wide
Web Consortium
XSLT ed XPath sono diventate
Raccomandazioni nel Novembre 1999
Il linguaggio completo che include
“XSL formatting” è diventato
raccomandazione al W3C nell’Ottobre
2001
3
XSLT, XPath: Scopi e funzionalità
XSLT è in pratica un linguaggio dedicato alla
trasformazione di documenti XML in
documenti XML
XPath è un linguaggio dedicato alla
definizione ed al recupero di parti di
documenti XML
(Indirizzamento di documenti XML)
Useremo XSLT per trasformare XML in XHTML
e XPath per il recupero di parti da
trasformare
4
2
XSLT
Trasformare documenti XML
XSLT è sicuramente la parte più
interessante dello standard XSL
XSLT, nella trasformazione,
può anche aggiungere nuovi
elementi o rimuoverne di vecchi
XML
XSLT
XSLT può ordinare i dati, può
prendere decisioni su quali
elementi mostrare e molto di più
Formalmente il processo di
trasformazione XSLT prende in
input un albero XML sorgente e
produce un nuovo albero XML
XHTML
5
Come funziona?
Nel processo di trasformazione XSLT utilizza
XPath per determinare le parti dell’albero
sorgente che corrispondono a determinati
template operativi
Quando un “match” viene trovato XSLT
trasforma la parte interessata nel pattern
stabilito che restituisce in output
Le parti che non trovano matching con alcun
template non verranno modificate nel
risultato o addirittura non compariranno
nell’albero di output.
6
3
Internet Explorer 5 e 6
XSL in Internet Explorer 5 NON è compatibile
con la raccomandazione ufficiale del W3C su
XSL.
Internet Explorer 5.0 uscito nel Marzo 1999,
Lo standard XSL era ancora un W3C Working
Draft.
Internet Explorer supporta completamente XSL
Il Parser XML 3.0 è basato sulla
Raccomandazione
http://msdn.microsoft.com/xml/general/xmlparser.asp
7
Netscape 6
Netscape 6 non supporta
completamente la raccomandazione
XSL del W3C
La maggior parte degli esempi non
dovrebbe funzionare anche su
Netscape 6
8
4
Una trasformazioni XSLT
La trasformazione viene attuata associando
patterns con templates
Un pattern deve coincidere con un elemento
dell’input tree
Un template serve per formare parte
dell’albero in output
Come già detto, la struttura dell’albero
risultante potrebbe essere del tutto diversa
da quella dell’albero in input
9
XSLT Namespace
http://www.w3.org/1999/XSL/Transform
I parser XSLT devono usare il concetto di
namespaces XML per riconoscere elementi e
attributi del Linguaggio XSLT
Tali elementi sono riconosciuti solo nello
stylesheet e non nel documento sorgente
10
5
XSLT:
Dichiarazione di Foglio di Stile
L’elemento root che dichiara un foglio di stile XSLT è
<xsl:stylesheet> o <xsl:transform>.
Codice di dichiarazione
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
oppure
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
identifica il namespace per XSL
Occorre includere l’attributo version="1.0“
11
XSLT - xsl:stylesheet
Può contenere, ad esempio i seguenti
elementi:
xsl:import
xsl:strip-space
xsl:output
xsl:decimal-format
xsl:attribute-set
xsl:param
xsl:include
xsl:preserve-space
xsl:key
xsl:namespace-alias
xsl:variable
xsl:template
top-level element: elemento che
compare come figlio di xsl:stylesheet
12
6
Un esempio
<xsl:stylesheet version="1.0”
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="..."/>
<xsl:include href="..."/>
<xsl:strip-space elements="..."/>
<xsl:preserve-space elements="..."/>
Se c’è un
import deve
trovarsi per
primo
<xsl:output method="..."/>
… …
<xsl:variable name="...">...</xsl:variable>
<xsl:param name="...">...</xsl:param>
<xsl:template match="...">… </xsl:template>
<xsl:template name="...">...</xsl:template>
</xsl:stylesheet>
13
XSLT:
Combinare fogli di Stile diversi
Due meccanismi per combinare fogli di stile:
un meccanismo di inclusione che permette
agli stylesheet di essere combinati senza
cambiare la loro semantica e
<!-- Category: top-level-element -->
<xsl:include href =“url-reference”/>
un meccanismo di importazione che permette
ai fogli di stile di sovrascriversi
<xsl:import href = “url-reference” />
14
7
Inserire fogli di stile in XML
E’ possibile inserire l’elemento xsl-stylesheet nel
documento XML
<?xml version=“1.0”>
<?xml-stylesheet type=“text/xml” href=“#style1” ?>
<doc>
<intestazione>
<xsl:stylesheet id=“style1” version="1.0”
xmlns:xsl="http://www.w3.org/1999/XSL/Transform”>
<xsl:import href="doc.xsl"/>
<xsl:template match=“body/para”>
<b><xsl:apply-templates/></b>
</xsl:template>
<xsl:template match="xsl:stylesheet">
</xsl:template>
</xsl:stylesheet>
</intestazione>
<body> <para> testo di esempio</para> </body> </doc>
15
XSLT
Espressioni per la trasformazione
XSLT usa un linguaggio di espressioni
definito da XPath
Le espressioni sono usate per:
ü Selezionare un nodo da processare;
ü Specificare le condizioni per differenti modi di
processare un nodo;
ü Generare del testo da inserire nell’albero di output.
Le espressioni compaiono come valori
di certi attributi di elementi nel file
XSLT dentro parentesi graffe
16
8
XSLT - Regole di Template
L’albero in output viene creato appendendo i
nodi processati partendo dal nodo radice
Un nodo viene processato cercando tutti le
regole di template con il pattern
corrispondente
Un template contiene, tipicamente istruzioni
di selezione di nuovi nodi da processare
Il processo di matching, la creazione di nodi
e la selezione continuano ricorsivamente fino
a quando non esistono nuovi nodi da
aggiungere
17
XSLT - I Patterns
Le regole di Template identificano i nodi
I patterns sono usati anche per la
numerazione e per la dichiarazione di chiavi
ü
ü
Un pattern specifica un insieme di condizioni su un nodo
Un nodo che soddisfa quelle condizioni corrisponde al pattern
La sintassi di patterns è un sottoinsieme
della sintassi di espressioni in XPath
18
9
XSLT - I Patterns - Esempi
paragrafo
ogni elemento <paragrafo>
*
qualsiasi elemento
lista/elemento
ogni elemento con una
<lista> come genitore
/
il nodo radice
text()
ogni nodo text
node()
ogni nodo
id(“unico")
l’elemento con ID uguale a
unico
para[1]
ogni <para> elemento primo
nel contesto genitore
@*
ogni attributo
19
Procediamo con un esempio (XML)
<?xml version="1.0" encoding="ISO-8859-1" ?>
<catalog>
<cd>
<title>
Empire Burlesque
</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>22.23</price>
<year>1985</year>
</cd>
…
</catalog>
catalog.xml
20
10
Procediamo con un esempio (XSL)
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>
<body>
<h2>My CD Collection</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th align="left">Title</th>
<th align="left">Artist</th>
</tr>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/>
</td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
catalog.xsl
</xsl:template></xsl:stylesheet>
21
Associare il
foglio di stile a un documento XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl“
href="cdcatalog.xsl"?>
<catalog>
<cd>
<title>Empire Burlesque</title>
<artist>Bob Dylan</artist>
<country>USA</country>
<company>Columbia</company>
<price>10.90</price>
<year>1985</year>
</cd>
…
</catalog>
22
11
L’elemento <xsl:template>
Come abbiamo detto un foglio di stile
corrisponde ad una serie di regole
dette templates
Ogni regola è definita da un elemento
<xsl:template>
Questo contiene regole da applicare ai
nodi che fanno “match” con
l’espresisone di XPath
23
XSL usa Templates
L’attributo match viene usato per
associare il template ad un elemento
XML
L’attributo match viene anche usato
per definire un template da applicare
ad un intero ramo dell’albero XML di
input
Ad esempio match="/" definisce
l’intero documento
24
12
XSLT - Definire una regola di template
<!-- Category: top-level-element -->
<xsl:template
match
= pattern
name
= qname
priority
= number
mode
= qname >
<!-- Content: (xsl:param*, template) -->
</xsl:template>
viene specificata da un elemento xsl:template
match è un pattern che identifica il nodo
(nodi) sorgente a cui applicare la regole
25
XSLT - Definire una regola di template
Esempio:
This is an <emph>important</emph> point.
<xsl:template match="emph">
<B>
<xsl:apply-templates/>
</B>
</xsl:template>
l’xsl:apply-templates ricorsivamente
processa i figli dell’elemento sorgente
26
13
Un foglio di stile XSL
E’ un documento XML.
Deve iniziare con la dichiarazione di
documento XML
<?xml version="1.0" encoding="ISO8859-1"?>
Il TAG <xsl:stylesheet> è l’elemento
radice del foglio di stile
27
XSLT - Applicare una regola Template
<!-- Category: instruction -->
<xsl:apply-templates
select = node-set-expression
mode
= qname>
<!-- Content:(xsl:sort | xsl:with-param)* -->
</xsl:apply-templates>
<xsl:template match="chapter">
<my_rules>
<xsl:apply-templates/>
</my_rules>
</xsl:template>
in assenza di select xsl:apply-templates processa
tutti i figli del nodo corrente
28
14
XSLT - Applicare una regola Template
ESEMPIO:
Processa tutti gli elementi <author>
figli dell’elemento <author-group>
<xsl:template match="author-group">
<b>
<xsl:apply-templates select="author"/>
</b>
Qui c’è la select
</xsl:template>
29
XSLT - Applicare una regola Template
Più xsl:apply-templates possono essere usati in
un singolo template per fare ordinamenti
Ad esempio per creare due tabelle HTML
w La prima riempita da domestic sales
w la seconda da foreign sales
<xsl:template match="product">
<table>
<xsl:apply-templates select="sales/domestic"/>
</table>
<table>
<xsl:apply-templates select="sales/foreign"/>
</table>
</xsl:template>
30
15
L’elemento <xsl:value-of>
<xsl:value-of> viene utilizzato per
selezionare il valore di un elemento
XML ed aggiungerlo all’albero di
output
<tr>
<td><xsl:value-of select="catalog/cd/title"/></td>
<td><xsl:value-of select="catalog/cd/artist"/></td>
</tr>
31
XSLT – Ripetizioni
<!-- Category: instruction -->
<xsl:for-each
select = node-set-expression>
<!-- Content: (xsl:sort*, template) -->
</xsl:for-each>
ü Quando il documento ha una struttura più o meno
regolare è utili selezionare un certo template per nodi
dello stesso genere
l’istruzione xsl:for-each contiene un
template, che viene creato per ogni
nodo selezionato
L’attributo select è obbligatorio
32
16
L’elemento <xsl:for-each>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
33
L’elemento <xsl:sort>
Dove ordinare le informazioni
Occorre inserire un sort all’interno di
un elemento for-each nel file XSL.
<xsl:for-each select="catalog/cd">
<xsl:sort select="artist"/>
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>
34
17
XSLT
Processare seguendo una condizione
Esistono due istruzioni in XSLT che
supportano il processing condizionale in un
template
xsl:if
L’istruzione xsl:if fornisce un semplice if-then
xsl:choose
l’istruzione xsl:choose supporta la selezione
di una scelta quando esistono varie
possibilità
35
L’elemento <xsl:if>
Applicato solo se la condizione è vera
<xsl:if test="price &gt; 10">
some output ... </xsl:if>
<xsl:for-each select="catalog/cd">
<xsl:if test="price &gt; 10">
<tr>
<td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td>
</tr>
</xsl:if>
</xsl:for-each>
36
18
L’elemento <xsl:choose>
Insieme a <xsl:when> ed <xsl:otherwise>
per test condizionali multipli
<xsl:choose>
<xsl:when test="price &gt; 10">
... some code ...</xsl:when>
<xsl:otherwise>... some code .... </xsl:otherwise>
</xsl:choose>
<xsl:for-each select="catalog/cd">
<tr>
<td><xsl:value-of select="title"/></td>
<xsl:choose>
<xsl:when test="price &gt; 10">
<td bgcolor="#ff00ff">
<xsl:value-of select="artist"/></td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="artist"/></td>
</xsl:otherwise>
</xsl:choose> </tr> </xsl:for-each>
37
Ancora
l’elemento <xsl:apply-templates>
Applica la regola all’elemento corrente
o ai figli.
Se aggiungiamo un attributo select
processerà solo i figli che match-ano
con la richiesta.
Si può usare le select per selezionare
in che ordine processare i figli
38
19
Esempio
Tag articolo
Tag vuoto
Link ad altro file
39
Esempio file .xsl
Lo trasforma in un file HTML
40
20
Risultato
links
41
Un esempio:
Trasformare XML con Javascript
In certi casi potrebbe essere utile applicare
un foglio di sitle senza includerlo
Una soluzione versatile potrebbe essere
usare JavaScript per fare la trasformazione
Con JavaScript, possiamo:
ü
ü
Fare test speciale sul tipo di browser
Utilizzare diversi fogli di stile a seconda delle necessità dell’utente
Il vero scopo di XSL
ü
Braille, Web printers, handheld devices
42
21
Un esempio:
Trasformare XML con Javascript
Consideriamo il codice:
<html> <body>
<script type="text/javascript">
// Load XML
var xml = new ActiveXObject("Microsoft.XMLDOM")
xml.async = false
xml.load("cdcatalog.xml")
// Load XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load("cdcatalog.xsl")
// Transform
document.write(xml.transformNode(xsl))
</script>
</body> </html>
43
Un esempio:
Trasformare XML lato server
A Cross Browser Solution
Soluzione javascript non funzionante nel
caso di browser che non supportano un XML
parser.
Dobbiamo trasformare i documenti XML sul
SERVER e mandarli come XHTML puro al
BROWSER
Internet Information Server si stanno
evolvendo nel rispetto di queste richieste
44
22
Un esempio:
Trasformare lato server con ASP
<%
'Load XML
set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load(Server.MapPath("cdcatalog.xml"))
'Load XSL
set xsl = Server.CreateObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load(Server.MapPath("cdcatalog.xsl"))
'Transform file
Response.Write(xml.transformNode(xsl))
%>
45
23