530 likes | 690 Views
XSL:Rappresentare i documenti XML. Marco Mesiti mesiti@disi.unige.it XSL, XSLT, XPath. 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
E N D
XSL:Rappresentare i documenti XML Marco Mesitimesiti@disi.unige.itXSL, XSLT, XPath
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)
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
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
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
Netscape 6 e 7 • Netscape 6 non supporta completamente la raccomandazione XSL del W3C • Netscape 7 invece supporta completamente la raccomdazione XSL del W3C
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
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
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
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: • namenodes with that name • *any node
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
Xpath - abbreviazioni Sintassi di baseAbbreviazione child::niente attribute::@ /descendant-or-self::node()/// self::node(). parent::node()..
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>
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"] • 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)]
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 "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]]
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"]
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 • 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 XML XSLT XHTML
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.
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
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
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
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
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
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> </xsl:template></xsl:stylesheet> catalog.xsl
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>
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
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
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
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
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
Qui c’è la select 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> </xsl:template>
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>
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>
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
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>
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>
XSLTProcessare 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à
L’elemento <xsl:if> • Applicato solo se la condizione è vera <xsl:if test="price > 10"> some output ... </xsl:if> <xsl:for-each select="catalog/cd"> <xsl:if test="price > 10"> <tr> <td><xsl:value-of select="title"/></td> <td><xsl:value-of select="artist"/></td> </tr> </xsl:if> </xsl:for-each>
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>
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
Un 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
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
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"
XSLT - xsl:stylesheet • Può contenere, ad esempio i seguenti elementi: xsl:import xsl:include xsl:strip-space xsl:preserve-space xsl:output xsl:key xsl:decimal-format xsl:namespace-alias xsl:attribute-set xsl:variable xsl:param xsl:template • top-level element: elemento che compare come figlio di xsl:stylesheet
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="..."/> <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> Se c’è un import deve trovarsi per primo
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” />
Tag articolo Tag vuoto Link ad altro file Esempio