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 > 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> 36 18 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> 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