340 likes | 428 Views
Lezione 6. XSL, Xpath Slide adattate da http://nwalsh.com/docs/tutorials/xsl/ e http:// bfp.sp.unipi.it/~didonato/ovre/xmldocbook/corso_xmldocbook5.ppt Si ringraziano Walsch e Grosso. X… di oggi. Xpath : un modo per identificare univocamente uno più nodi in un albero XML
E N D
Lezione 6 XSL, Xpath Slide adattate da http://nwalsh.com/docs/tutorials/xsl/ e http://bfp.sp.unipi.it/~didonato/ovre/xmldocbook/corso_xmldocbook5.ppt Si ringraziano Walsch e Grosso
X… di oggi • Xpath: un modo per identificare univocamente uno più nodi in un albero XML • XSLT “XSL Transformations” un linguaggio per trasformare un albero XML in un’altra struttura arbitraria (spesso HTML, o un’altra struttura XML, o altro) • XSL “eXtensible Stylesheet Language”: XSLT più la descrizione di un insieme di istruzioni di formattazione (FO “Formatting Objects” e di proprietà di formattazione)
Caso tipico: da XSL a (X)HTML = eXtensible Stylesheet Language = Hyper Text Mark-up Language
Cosa fa un “foglio di stile” (stylesheet)? Due tecniche di base: • Trasformare un documento input in un altro documento con una diversa struttura • Descrivere come presentare la informazione che è stata trasformata (associando delle proprietà a ciascuna parte della informazione trattata)
Possibilità di trasformazione • Generazione di testo fisso Es.: testo <tag>testo</tag> • Eliminazione di contenutiEs.: testo, commento, altro testo testo, altro testo • Movimento di contenutiEs.: nome cognome cognome nome • Duplicazione di contenutiEs.: autore titolo titolo autore titolo • Ordinamento (sorting) di contenuti B A F C A B C F • Altre trasformazioni complesse che calcolano nuova informazione a partire dalla vecchia
Specifica della presentazione Tre livelli di informazioni di formattazione: • Specificare dell’aspetto generale della pagina. • Assegnare il contenuto trasformato a vari “contenitori” (liste, paragrafi, ecc.) • Definire le proprietà di formattazione di basso livello (font, margini, allineamento, spaziatura, ecc.)
Uno stylesheet XSL • Formato essenzialmente da una serie di template (“modelli”?) • Ciascun template trova (“match”) un qualche insieme di elementi marcati nell’albero XML di input e descrive il contributo di quegli elementi al documento output, il “result tree”. NB: In generale, gli elementi nello stylesheet con il namespace “xsl:” sono istruzioni del linguaggio XSLT, tutti gli altri sono ciò che verrà messo nell’ output.
Struttura di uno stylesheet • Il file XSLT sono documenti XML; i namespace (namespaces (http://www.w3.org/TR/REC-xml-names) sono usati per identificare gli elementi significativi • La maggior parte degli stylesheet sono documenti stand-alone (senza DTD) il cui elemento radice è <xsl:stylesheet> o <xsl:transform> (sinonimi)
Esempio minimo di stylesheet <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> ... </xsl:stylesheet>
Esempio 2 <html xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <head> <title>Esempio inutile</title> </head> <body> <h1>Esempio inutile</h1> <p>Tutto quello che dice questo file è che 3+4 è <xsl:value-of select="3+4"/>. </p> </body> </html>
Esempio completo • Questo stylesheet trasforma gli elementi <para> ed <emphasis> dell’input in tag HTML <?xml version='1.0'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="para"> <p><xsl:apply-templates/></p> </xsl:template> <xsl:template match="emphasis"><i><xsl:apply-templates/></i> </xsl:template> </xsl:stylesheet>
Input e output • Con questo stylesheet, l’ XML: <?xml version='1.0'?> <para>This is a <emphasis>test</emphasis>.</para> • verrebbe trasformato in: <?xml version="1.0" encoding="utf-8"?> <p>This is a <i>test</i>.</p>
Capire i template • La maggior parte dei template hanno la forma: <xsl:template match="emphasis"> <i><xsl:apply-templates/></i> </xsl:template> • L’intero elemento <xsl:template> è un template • Il match pattern determina dove si applica il template • Gli elementi letterali risultanti (Literal result element(s)) derivano dai namespace non XSL • Gli elementi XSLT derivano invece dal namespace XSL
Match pattern (come trovare il contenuto) • Ogni template deve avere un modo per descrivere univocamente a quale parte del documento input si applica. • Ciò viene ottenuto tramite la sintassi Xpath (XML Path Language (XPath) (http://www.w3.org/TR/xpath), ispirata al modo per descrivere la posizione (assoluta o relativa) dei file in un sistema di directory.
Esempio di albero XML / .. <para> . <emphasis> <para> <para> <para> <para> <para> <emphasis> <emphasis>
Applicazione recursiva degli stili • Viene crata una serie di template, uno per ogni contesto; questi vengono applicati ricorsivamente (uno chiama l’altro) a partire dalla radice. • <xsl:template match="section/title"> <h2><xsl:apply-templates/></h2> </xsl:template> • <xsl:apply-templates select="th|td"/>
Esempio ricorsivo 1 <doc> <para>questo è <emphasis>testo</emphasis>. <emphasis>enfasi <emphasis>annidata</emphasis></emphasis>.</para> </doc>
Esempio ricorsivo <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="doc"> <html><head><title>A Document</title></head> <body><xsl:apply-templates/></body></html> </xsl:template><xsl:template match="para"> <p><xsl:apply-templates/></p> </xsl:template> <xsl:template match="emphasis"> <i><xsl:apply-templates/></i> </xsl:template><xsl:template match="emphasis/emphasis"> <b><xsl:apply-templates/></b> </xsl:template> </xsl:stylesheet>
Output HTML <html> <head><title>A Document</title> </head> <body> <p>This is a <i>test</i>. <i>Nested <b>emphasis</b></i>.</p> </body> </html>
Applicazione sequenziale degli stili • Viene creata una serie di template che processano sequenzialmente gli elementi desiderati • Costruzione For-each: <xsl:for-each select="row"> <tr><xsl:apply-templates/></tr> </xsl:for-each> • Possibili anche template con nome (non trattati qui)
Esempio di For-each: file xml <?xml version='1.0'?> <table> <row> <entry>a1</entry> <entry>a2</entry> </row> <row> <entry>b1</entry> <entry>b2</entry> </row> <row> <entry>c1</entry> <entry>c2</entry> </row> </table>
Esempio di For-each: file XSL <?xml version='1.0'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="table"> <table> <xsl:for-each select="row"> <tr> <xsl:for-each select="entry"> <td><xsl:apply-templates/></td> </xsl:for-each> </tr> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet>
Output HTML <table> <tr> <td>a1</td> <td>a2</td> </tr> <tr> <td>b1</td> <td>b2</td> </tr> <tr> <td>c1</td> <td>c2</td> </tr> </table>
Creare il “result tree” • Literal Result Elements (Elementi risultanti letterali): qualsiasi elemento che non abbia la estensione del namespace XSL (normalmente “xsl:”) • Vengono copiati così come sono nell’albero risultante • <xsl:value-of> : inserisce il valore di una espressione nell’albero<xsl:value-of select=“$count +1”/>
Creare il “result tree” • <xsl:copy> : copia il valore del nodo corrente nell’albero. • <xsl:element> : inserisce l’elemento con un certo nome nell’albero. Esempio: <xsl:param name="header">h3</xsl:param> ... <xsl:element name="{$header}"> <xsl:apply-templates/> </xsl:element> <h3>…</h3> • <xsl:attribute> : aggiunge un attributo con un certo nome al più vicino nodo che lo contiene. <table> <xsl:if test="@pgwide='1'"> <xsl:attribute name="width">100%</xsl:attribute> </xsl:if> ... </table>
Contare il numero di elementi <xsl:number> : conta gli elementi nell’albero di input e converte il risultato in una stringa formattata. <xsl:number count="listitem" format="i. "/> <xsl:number count="chapter" from="book" level="any" format="1. "/> <xsl:number count="h1|h2|h3" level="multiple" from="chapter|appendix" format="1."/>