XSL:Rappresentare
i documenti XML
Marco Mesiti
[email protected]
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
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
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 6 supporta completamente
XSL
Il Parser XML 3.0 è basato sulla
Raccomandazione
http://msdn.microsoft.com/xml/general/xmlparser.asp
5
Netscape 6 e 7
Netscape 6 non supporta
completamente la raccomandazione
XSL del W3C
Netscape 7 invece supporta
completamente la raccomdazione XSL
del W3C
6
Xpath
8
XPath
Linguaggio per esprimere espressioni
di cammino sulla struttura gerarchica
dei documenti XML
Basato sul concetto di context node.
Un context node è il nodo a partire dal
quale viene valutata un’espressione
Esempi
 /books/book/author
 /child::books/child::book/child::author
9
XPath
Il costrutto di base è il location path,
sequenza di location steps separati da /
Un location step viene valutato rispetto ad un
contesto che restituisce un insieme di nodi
Un location path viene valutato
composizionalmente, da sinistra a destra,
iniziando da un contesto iniziale
Ogni nodo risultante dalla valutazione di un
passo viene usato come contesto per la
valutazione del passo successivo
10
XPath
Un location step has the form
axis :: node-test [ predicate ]
Esempio:
child::section[position()<6]/descendant::cite/attribute::href
seleziona tutti gli attributi href attributes contenuti in
elementi cite nelle prime 5 sezioni di un articolo
11
Axes
12
Node tests
Testing by node type:




text() chardata nodes
comment() comment nodes
processing-instruction()
processing instruction nodes
node() all nodes (not including attributes and namespace decl.s)
Testing by node name:


name
nodes with that name
*
any node
13
Predicates
expressions coerced to type boolean
A predicate filters a node-set by
evaluating the predicate expression on
each node in the set with that node as
the context node
Different predefined predicates are
available
Predicates can be conjunction,
disjunction, negation of other predicates
14
Xpath - abbreviazioni
Sintassi di base
Abbreviazione
child::
niente
attribute::
@
/descendant-or-self::node()/
//
self::node()
.
parent::node()
..
15
Esempio
<?xml version=“1.0”?>
<costumers>
<costumer costumerID=“ALFKI”>
<order orderID=“1”> …</order>
<order orderID=“2”> …</order>
…
</costumer>
<costumer costumerID=“BIKNE”>
<contactName>S. Franzoni</ContactName>
<order orderID=“1”> …</order>
<order orderID=“2”> …</order>
</costumer>
…
</costumers>
16
Esempi
Seleziona dalla radice (elemento più
esterno), I clienti con attributo ClientID =
="ALFKI"

/Customers/Customer[@CustomerID="ALFKI"]
supponendo che Customer abbia come
sottoelemento Order, seleziona tutti gli
ordini in cui OrderID = 1

/Customers/Customer/Order[@OrderID="1"]

hanno almeno un ContactName
Supponendo che Customer ammetta come
sottoelemento ContactName, selezionare
tutti i Customer che:

 /Customers/Customer[ContacName]
non hanno ContactName
 /Customers/Customer[not(ContacName)]
17
Esempi
Selezionare gli ordini che si riferiscono al
cliente identificato da "ALFKI"


/Customers/Customer/Order[../@CustomerID="ALFKI"]
/Customers/Customer[@CustomerID="ALFKI"]/Order
selezionare l’ordine identificato da "Ord10643”, relativo al cliente identificato da
"ALFKI"

/Customers/Customer[@CustomerID="ALFKI"]/Order[@OrderID
="Ord-10643"]
selezionare i clienti che hanno effettuato
almeno un ordine di un prodotto inquantità
superiore a 5

/Customers/Customer[Order/OrderDetail[@Quantity>5]]
18
Esempi
Selezionare I vari prodotti ordinati,
che complessivamente costano più di
2000
 //OrderDetail[@UnitPrice * @Quantity = 2000]
seleziona il cliente "ALFKI" e il cliente
“ANATR”
 /Customers/Customer[@CustomerID="ALFKI" or
@CustomerID="ANATR"]
19
XSLT
20
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
21
Come funziona?
Nel processo di trasformazione XSLT utilizza
XPath per determinare le parti dell’albero
sorgente che corrispondono a determinati
template operativi (identificazione di
“match”)
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.
22
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
23
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
24
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
25
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
26
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
27
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">
<td align="left">Title</td>
<td align="left">Artist</td>
</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>
28
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>
29
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
30
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
31
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
32
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
33
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
34
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>
35
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
 La prima riempita da domestic sales
 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>
36
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>
37
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
38
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>
39
L’elemento <xsl:sort>
Serve per 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>
40
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à
41
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>
42
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>
43
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
44
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
45
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
46
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"
47
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
48
Un esempio
<?xml version="1.0" encoding="ISO-8859-1"?>
<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>
49
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” />
50
Esempio
Tag articolo
Tag vuoto
Link ad altro file
51
Esempio file .xsl
Lo trasforma in un file HTML
52
Risultato
links
53
Scarica

ppt - DISI