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 > 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> 42 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> 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