XSL:Rappresentare i documenti XML
description
Transcript of XSL:Rappresentare i documenti XML
1
XSL:Rappresentare XSL:Rappresentare i documenti XML i documenti XML
Marco [email protected]
XSL, XSLT, XPath
2
XSL - eXstensible Stylesheet LanguageXSL - 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)(XSLT) un vocabolario per definire la formattazione (XSL)(XSL) una sintassi per indirizzare parti di un documento ad una
certa formattazione (XPath)(XPath)
3
XSL è uno Standard W3CXSL è 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
4
XSLT, XPath: Scopi e funzionalitàXSLT, XPath: Scopi e funzionalità
XSLT è in pratica un linguaggio dedicato alla trasformazione di documenti XML in trasformazione di documenti XML in documenti XMLdocumenti 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
5
Internet Explorer 5 e 6Internet 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
6
Netscape 6 e 7Netscape 6 e 7
Netscape 6 non supporta completamente la raccomandazione XSL del W3C
Netscape 7 invece supporta completamente la raccomdazione XSL del W3C
8
XpathXpath
9
XPathXPath
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
10
XPathXPath
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
11
XPathXPath
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
12
AxesAxes
13
Node testsNode 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
14
PredicatesPredicates
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
15
Xpath - abbreviazioniXpath - abbreviazioni
Sintassi di base Abbreviazione child:: niente
attribute:: @
/descendant-or-self::node()/ //
self::node() .
parent::node() ..
16
EsempioEsempio
<?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>
17
EsempiEsempi
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"]
Supponendo che Customer ammetta come sottoelemento ContactName, selezionare tutti i Customer che: hanno almeno un ContactName
/Customers/Customer[ContacName]
non hanno ContactName /Customers/Customer[not(ContacName)]
18
EsempiEsempi
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 "Ord-10643”, 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]]
19
EsempiEsempi
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"]
20
XSLTXSLT
21
XSLT XSLT Trasformare documenti XMLTrasformare documenti XML
XSLT è sicuramente la parte più interessante dello standard XSL
XSLT, nella trasformazione, può anche aggiungere nuovi elementi o rimuoverne di vecchi
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
XSLTXSLT
XMLXML
XHTMLXHTML
22
Come funziona?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.
23
Una trasformazioni XSLTUna trasformazioni XSLT
La trasformazione viene attuata associando patternspatterns con templatestemplates
Un patternpattern deve coincidere con un elemento dell’input tree
Un templatetemplate serve per formare parte dell’albero in output
24
XSLT - Regole di Template 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
25
XSLT - I PatternsXSLT - 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
26
XSLT - I Patterns - EsempiXSLT - I Patterns - Esempi
paragrafoparagrafo ogni elemento <paragrafo>
** qualsiasi elemento
lista/elementolista/elemento ogni elemento con una <lista> come genitore
// il nodo radice
text()text() ogni nodo text
node()node() ogni nodo
id(“unico")id(“unico") l’elemento con ID uguale a unico
para[1]para[1] ogni <para> elemento primo nel contesto genitore
@*@* ogni attributo
27
Procediamo con un esempio (XML)Procediamo con un esempio (XML)
<?xml version="1.0" encoding="ISO-8859-1" ?> <?xml version="1.0" encoding="ISO-8859-1" ?> <catalog><catalog> <cd><cd> <title><title>
Empire Burlesque Empire Burlesque</title> </title>
<artist>Bob Dylan</artist> <artist>Bob Dylan</artist> <country>USA</country> <country>USA</country> <company>Columbia</company> <company>Columbia</company> <price>22.23</price> <price>22.23</price> <year>1985</year> <year>1985</year> </cd></cd>
……</catalog></catalog>
catalog.xmlcatalog.xml
28
Procediamo con un esempio (XSL)Procediamo con un esempio (XSL)
<?xml version="1.0" encoding="ISO-8859-1"?><?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0" <xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/"><xsl:template match="/"> <html><html> <body><body> <h2>My CD Collection</h2><h2>My CD Collection</h2> <table border="1"><table border="1"> <tr bgcolor="#9acd32"><tr bgcolor="#9acd32"> <td align="left">Title</td><td align="left">Title</td> <td align="left">Artist</td><td align="left">Artist</td> </tr></tr> <xsl:for-each select="catalog/cd"><xsl:for-each select="catalog/cd"> <tr><tr> <td><xsl:value-of select="title"/><td><xsl:value-of select="title"/>
</td> </td> <td><xsl:value-of select="artist"/></td><td><xsl:value-of select="artist"/></td> </tr></tr> </xsl:for-each></xsl:for-each> </table></table> </body></body> </html></html></xsl:template></xsl:stylesheet></xsl:template></xsl:stylesheet> catalog.xslcatalog.xsl
29
Associare il Associare il foglio di stile a un documento XMLfoglio di stile a un documento XML
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl“ <?xml-stylesheet type="text/xsl“ href="cdcatalog.xsl"?> href="cdcatalog.xsl"?>
<catalog> <catalog> <cd> <cd> <title>Empire Burlesque</title> <title>Empire Burlesque</title> <artist>Bob Dylan</artist> <artist>Bob Dylan</artist> <country>USA</country> <country>USA</country> <company>Columbia</company> <company>Columbia</company> <price>10.90</price> <price>10.90</price> <year>1985</year> <year>1985</year> </cd> </cd> … …</catalog></catalog>
30
L’elemento <xsl:template>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
31
XSL usa TemplatesXSL 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
32
XSLT - Definire una regola di templateXSLT - 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
33
XSLT - Definire una regola di templateXSLT - 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
34
XSLT - Applicare una regola TemplateXSLT - 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
35
XSLT - Applicare una regola TemplateXSLT - 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>
</xsl:template>
Qui c’è la selectQui c’è la selectQui c’è la selectQui c’è la select
36
XSLT - Applicare una regola TemplateXSLT - 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>
37
L’elemento <xsl:value-of>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> <tr>
<td><xsl:value-of select="catalog/cd/title"/></td> <td><xsl:value-of select="catalog/cd/title"/></td> <td><xsl:value-of select="catalog/cd/artist"/></td> <td><xsl:value-of select="catalog/cd/artist"/></td>
</tr></tr>
38
XSLT – RipetizioniXSLT – 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
39
L’elemento <xsl:for-each>L’elemento <xsl:for-each>
<xsl:for-each select="catalog/cd"> <xsl:for-each select="catalog/cd">
<tr> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="title"/></td>
<td><xsl:value-of select="artist"/></td> <td><xsl:value-of select="artist"/></td> </tr> </tr>
</xsl:for-each> </xsl:for-each>
40
L’elemento <xsl:sort>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:for-each select="catalog/cd"> <xsl:sort select="artist"/> <xsl:sort select="artist"/> <tr> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> <td><xsl:value-of select="artist"/></td> </tr> </tr>
</xsl:for-each> </xsl:for-each>
41
XSLTXSLTProcessare seguendo una condizione 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à
42
L’elemento <xsl:if>L’elemento <xsl:if>
Applicato solo se la condizione è vera
<xsl:if test="price > 10"><xsl:if test="price > 10"> some output ... </xsl:if> some output ... </xsl:if>
<xsl:for-each select="catalog/cd"> <xsl:for-each select="catalog/cd"> <xsl:if test="price > 10"> <xsl:if test="price > 10"> <tr> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> <td><xsl:value-of select="artist"/></td>
</tr> </tr> </xsl:if> </xsl:if>
</xsl:for-each> </xsl:for-each>
43
L’elemento <xsl:choose>L’elemento <xsl:choose>
Insieme a <xsl:when> ed <xsl:otherwise> per test condizionali multipli
<xsl:choose><xsl:when test="price > 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 > 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>
44
Ancora Ancora l’elemento <xsl:apply-templates> 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
45
Un foglio di stile XSLUn foglio di stile XSL
E’ un documento XML.
Deve iniziare con la dichiarazione di documento XML <?xml version="1.0" encoding="ISO-8859-1"?>
Il TAG <xsl:stylesheet> è l’elemento radice del foglio di stile
46
XSLT NamespaceXSLT 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
47
XSLT:XSLT:Dichiarazione di Foglio di StileDichiarazione di Foglio di Stile
L’elemento root che dichiara un foglio di stile XSLT è <xsl:stylesheet> o <xsl:transform>.
Codice di dichiarazioneCodice di dichiarazione
<xsl:stylesheet version="1.0" <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
oppure
<xsl:transform version="1.0" <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
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"
48
XSLT - xsl:stylesheetXSLT - xsl:stylesheet
Può contenere, ad esempio i seguenti elementi:
xsl:import xsl:import xsl:include xsl:include xsl:strip-spacexsl:strip-space xsl:preserve-space xsl:preserve-space xsl:outputxsl:output xsl:key xsl:key xsl:decimal-format xsl:decimal-format xsl:namespace-alias xsl:namespace-alias xsl:attribute-set xsl:attribute-set xsl:variable xsl:variable xsl:param xsl:param xsl:template xsl:template
top-level element: top-level element: elemento che compare come figlio di xsl:stylesheet
49
Un esempioUn esempio
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0” <xsl:stylesheet version="1.0”
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="..."/><xsl:import href="..."/>
<xsl:include href="..."/><xsl:include href="..."/>
<xsl:strip-space elements="..."/><xsl:strip-space elements="..."/>
<xsl:preserve-space elements="..."/><xsl:preserve-space elements="..."/>
<xsl:output method="..."/><xsl:output method="..."/>
… …… …
<xsl:variable name="...">...</xsl:variable><xsl:variable name="...">...</xsl:variable>
<xsl:param name="...">...</xsl:param><xsl:param name="...">...</xsl:param>
<xsl:template match="...">… </xsl:template><xsl:template match="...">… </xsl:template>
<xsl:template name="...">...</xsl:template><xsl:template name="...">...</xsl:template>
</xsl:stylesheet></xsl:stylesheet>
Se c’è un Se c’è un importimport
deve deve trovarsi per trovarsi per
primoprimo
50
XSLT:XSLT:Combinare fogli di Stile diversiCombinare fogli di Stile diversi
Due meccanismi per combinare fogli di stile:
un meccanismo di inclusionemeccanismo 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 importazionemeccanismo di importazione che permette ai fogli di stile di sovrascriversi
<xsl:import href = “url-reference” />
51
EsempioEsempio
Tag articoloTag articolo
Link ad altro fileLink ad altro file
Tag vuotoTag vuoto
52
Esempio file .xslEsempio file .xsl
Lo trasforma in un file HTMLLo trasforma in un file HTML
53
RisultatoRisultato
linkslinks