440 likes | 536 Views
XSLT (e X tensible S tylesheet L anguage T ransformation). Laurea Magistrale in Informatica Reti 2 (2005/06). dott. Francesco De Angelis francesco.deangelis@unicam.it. Agenda. XSL e XSLT Modello XSLT I template Creazione di Elementi Creazione di Attributi Prelievo di valori
E N D
XSLT(eXtensible Stylesheet Language Transformation) Laurea Magistrale in Informatica Reti 2 (2005/06) dott. Francesco De Angelis francesco.deangelis@unicam.it
Agenda • XSL e XSLT • Modello XSLT • I template • Creazione di Elementi • Creazione di Attributi • Prelievo di valori • Definizione della struttura di destinazione • Iterazione • Istruzioni condizionali • Ordinamento • Stile Iterativo e ricorsivo • Esempi… XSLT - eXtensible Stylesheet Language Transformation
CSS e XSL • CSS (Cascading Style Sheets) è un linguaggio puramente descrittivo. Assegna ai nodi del documento XML una caratterizzazione tipografica senza nessuna modifica strutturale o organizzativa • XSL (eXtensible Stylesheet Language), invece, permette sia caratterizzazione tipografica che riscrittura, ovvero la possibilità di organizzare il contenuto finale in maniera diversa dall'originale XSLT - eXtensible Stylesheet Language Transformation
XSL e XSLT • XSLT (XSL Transformation) estende il concetto di foglio di stile fino a permettere la manipolazione della struttura stessa del documento • XSLT permette di trasformare un documento XML filtrandone i dati e riorganizzandoli in un’altra struttura XML, o persino in un semplice testo • XSLT possiede molte delle caratteristiche di un linguaggio di programmazione imperativo! • La proposta è divisa in due parti: • un linguaggio di trasformazione, XSLT • un vocabolario di elementi XML con semantica di formattazione, XSL-FO (XSL Formatting Object) • XSLT, inoltre, si basa su XPath XSLT - eXtensible Stylesheet Language Transformation
XSLT come formattatore • Per quel che riguarda l’abilità di generare una presentazione dei dati XML, XSLT dispone attualmente di due metodi: • E’ possibile trasformare il documento XML in un documento XHTML, per poi farlo visualizzare in qualsiasi browser. • E’ possibile usare gli XSL Formatting Object, che definiscono il formato di visualizzazione senza presupporre la trasformazione in HTML o in altri linguaggi di presentazione. XSLT - eXtensible Stylesheet Language Transformation
XSLT come trasformatore • Questa funzionalità, del tutto nuova, è la più interessante • Con XSLT è possibile modificare “al volo” la struttura che accoglie i dati, e in parte anche i dati stessi. Questo permette, ad esempio: • di offrire viste differenti sugli stessi dati a utenti differenti • di esportare i dati in un formato noto, come HTML o PDF • di adattare i dati a diversi dispositivi di visualizzazione XSLT - eXtensible Stylesheet Language Transformation
Il modello di XSLT input output processore XSLT XSLT - eXtensible Stylesheet Language Transformation
Struttura generale • Un documento XSLT, come ogni documento XML, inizia con una dichiarazione XML <?xml version="1.0" encoding="UTF-8"?> • L’elemento root è stylesheet • Se il documento deve emettere HTML o un altro linguaggio, bisogna dichiarare entrambi i namespace • Di solito il linguaggio target viene usato come default namespace, quindi tutti gli elementi XSLT vanno prefissati con il loro namespace (xsl:) <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> XSLT - eXtensible Stylesheet Language Transformation
I fogli di stile XSLT • Un foglio di stile XSL è composto sostanzialmente di template di costruzione, che permettono di riscrivere, modificandola, una selezione del documento XML d’origine nel documento destinazione • Ogni template individua un pattern da ricercare nel documento di partenza, e vi associa un blocco di elementi e testo da inserire nel documento di destinazione • Un template è indicato dall’elemento template <xsl:template match=pattern name=qname priority=number mode=qname > <!-- azione --> </xsl:template> XSLT - eXtensible Stylesheet Language Transformation
I template • Ad esempio, dato il frammento: Questo deve essere <emph>importante</emph> • Il seguente template: <xsl:template match=“emph”><html:b> <xsl:apply-templates/></html:b></xsl:template> • Fa match con l’elemento emph e scrive un elemento b di HTML ed inserisce tutti i nodi figlio del nodo di match nella lista dei nodi correnti • Il pattern in questo caso è un XPath relativo (equivalente a child::emph). Qualunque XPath che ritorni un nodeset può essere inserito nell'attributo match. XSLT - eXtensible Stylesheet Language Transformation
I template • Un template è una subroutine di trasformazione • L’XPath fornito dall’attributo match viene usato per filtrare il contesto: tutti i nodi filtrati vengono elaborati nel template <template match="song">...</template> • Ogni stylesheet deve avere un template con match=“/”, la sua procedura main, che viene chiamata all’avvio con tutto il documento come insieme di nodi. <template match="/"> • All’interno dell’elemento template vi sono una varietà di istruzioni che servono o per modificare la lista di nodi o per scrivere frammenti dell’albero di destinazione. XSLT - eXtensible Stylesheet Language Transformation
I template <xsl:apply-templates select="e" mode="m"/> <xsl:apply-templates/> richiama il template che fa match con i nodi selezionati da e nel contesto corrente (opzionale) e con attributo mode uguale a quello dato (opzionale) • Con questa forma è possibile gestire documenti dalla struttura complessa e ricorsiva, lasciando al parser il compito di cercare il template adatto agli elementi che incontra • Nel corso del processing qualunque nodo può essere inserito, anche più volte, nel documento, e in qualunque ordine (non è uno stack!). • il parser sospende il processing del template in corso e procede ricorsivamente ad esaminare i figli. XSLT - eXtensible Stylesheet Language Transformation
Esempio <xsl:apply-templates> • Questo template trasforma un “para” in un “p” di HTML: <xsl:template match=”PARA"><P><xsl:apply-templates/></P> </xsl:template> XSLT - eXtensible Stylesheet Language Transformation
Creazione di Elementi • Dentro il template scrivere direttamente il frammento XML richiesto. • Ogni elemento che non appartiene al namespace di XSL viene direttamente scritto nell’albero di destinazione così come appare nel template • Analogamente viene fatto per ogni nodo di testo <xsl:template match=“pippo”><b>Pippo</b></xsl:template> XSLT - eXtensible Stylesheet Language Transformation
Creazione di Elementi • Se è necessario scrivere un elemento complesso o calcolato si usa <xsl:element> • Ad esempio può servire per trasformare il valore di un attributo del documento di partenza nel nome di un tag nel documento destinazione • Dato il frammento <personatipo=”studente” nome=”Mario Rossi”/> e il template <xsl:template match=“persona”> <xsl:element name=“{@tipo}”> <xsl:value-of select=“@nome”/> </xsl:element></xsl:template> ottengo il frammento <studente>Mario Rossi</studente> XSLT - eXtensible Stylesheet Language Transformation
Creazione di Attributi • All’interno di un elemento è possibile specificare degli attributi in maniera esplicita con il tag <xsl:attribute> • E’ più chiaro e più potente delle parentesi graffe. Lo si può usare per stabilire con espressione anche il nome dell’attributo. • Dato il frammento <personaid=”1678.1245” nome=”Mario Rossi”/> e il template <xsl:template match=“persona”> <A><xsl:attribute name=“HREF”> <xsl:value-of select=“@id”/>.html </xsl:attribute> <xsl:value-of select=“@nome”/></A> </xsl:template> ottengo il frammento <A HREF=“1678.1245.html”>Mario Rossi</A> XSLT - eXtensible Stylesheet Language Transformation
Prelievo di valori • <xsl:value-of> crea un nodo di testo nell’albero di destinazione. L’attributo select (obbligatorio) contiene un espressione XPath che viene valutata e convertita in stringa. La stringa viene combinata con gli altri nodi di testo intorno • L’uso tipico è per convertire markup in testo (ad esempio il valore di attributi in contenuto). • Dato il frammento <personanome=”Mario” cognome=”Rossi”/> e il template <xsl:template match=“persona”><p><xsl:value-of select=“@nome”/> <xsl:text> </xsl:text> <xsl:value-of select=“@cognome”/></p></xsl:template> ottengo il frammento <p>Mario Rossi</p> XSLT - eXtensible Stylesheet Language Transformation
Uso delle graffe {} • Laddove non sia possibile usare del markup (ad esempio come valore di un attributo), è possibile usare le parentesi graffe, che hanno in questo senso lo stesso significato di <xsl:value-of> • L’uso tipico è per convertire markup in altro markup (ad esempio il valore di un attributo nel nome di un tag). • Dato il frammento <personanome=”Mario” cognome=”Rossi”/> e il template <xsl:template match=“persona”><a href=“mailto:{@nome}.{@cognome}@unicam.it”> <xsl:value-of select=“@nome”/> </a></xsl:template> ottengo il frammento <a href=“mailto:mario.rossi@unicam.it”>Mario</a> XSLT - eXtensible Stylesheet Language Transformation
Definire l’albero di destinazione • <xsl:text> • Inserisce esplicitamente il testo contenuto dentro al documento • E’ vantaggioso rispetto a mettere il testo letterale perché rispetta il white space. Inoltre con l'attributo disable-output-escaping="yes"rispetta anche i caratteri speciali (“&” e “<“) • <xsl:processing-instruction> • Altrimenti le processing instruction dentro al foglio di stile vengono ignorate, non trasferite • Ad esempio, <xsl:processing-instruction name="xml-stylesheet">href="book.css" type="text/css”</xsl:processing-instruction>genera il seguente output:<?xml-stylesheet href="book.css" type="text/css"?> • <xsl:comment> • Inserisce esplicitamente del commento dentro al documento XSLT - eXtensible Stylesheet Language Transformation
Definire l’albero di destinazione • <xsl:namespace-alias> • Permette di specificare esplicitamente il namespace di arrivo • <xsl:copy> • Copia nell’output il nodo di riferimento, insieme al suo namespace, ma non al suo contenuto e ai suoi attributi, che vanno copiati esplicitamente. • <xsl:number> • Viene usato per inserire esplicitamente numeri formattati dentro all’albero dei risultati. XSLT - eXtensible Stylesheet Language Transformation
Iterazione <xsl:for-each> • Per applicare un comportamento specifico ad ognuno dei figli direttamente dentro al template si utilizza <xsl:for-each> • Ad esempio il template: <xsl:template match=”BODY"> <xsl:apply-templates select=“H1”/></xsl:template><xsl:template match=”H1"><P><xsl:value-of select=“.”/></P></xsl:template> viene più facilmente realizzato così: <xsl:template match=”BODY"><xsl:for-each select=“H1”/><P><xsl:value-of select=“.”/></P></xsl:for-each></xsl:template> XSLT - eXtensible Stylesheet Language Transformation
Istruzioni condizionali <xsl:if> • <xsl:if> attiva condizionalmente dei comportamenti a seconda della verità di un XPath di test. • Ad esempio il template seguente colora di giallo lo sfondo di una riga ogni due di una tabella HTML: <xsl:template match="item"> <tr><xsl:if test="position() mod 2 = 0"> <xsl:attribute name="bgcolor">yellow </xsl:attribute></xsl:if> <xsl:apply-templates/> </tr></xsl:template> XSLT - eXtensible Stylesheet Language Transformation
Istruzioni condizionali <xsl:choose> • <xsl:choose> seleziona una tra molte alternative (la funzione di switch in java) <xsl:template match="item"> <tr> <xsl:choose> <xsl:when test="position() mod 3 = 0"> <xsl:attribute name="bgcolor">blue</xsl:attribute> </xsl:when> <xsl:when test="position() mod 3 = 1"> <xsl:attribute name="bgcolor">green</xsl:attribute></xsl:when><xsl:otherwise> <xsl:attribute name="bgcolor">red</xsl:attribute></xsl:otherwise> </xsl:choose> <xsl:apply-templates/> </tr> </xsl:template> XSLT - eXtensible Stylesheet Language Transformation
Ordinamento <xsl:sort> • <xsl:sort> ordina i nodi nella lista dei nodi correnti. Esso può essere soltanto figlio di un <xsl:apply-templates> o di un <xsl:for-each> • Gli elementi <xsl:sort> possono annidarsi • Vari attributi: • Select: l’espressione in base alla quale fare il sort • Data-type: il tipo di dato da ordinare (numero o testo o altro) • Order: il tipo ascendete o discendente di ordine • Case-order: come trattare le maiuscole e le minuscole XSLT - eXtensible Stylesheet Language Transformation
Esempio di ordinamento <xsl:template match=”lista"> <ul> <xsl:apply-templates select=“persona”><xsl:sort select=”cognome"/> <xsl:sort select="nome"/></xsl:apply-templates> </ul></xsl:template><xsl:template match=”persona"> <li> <xsl:value-of select=”nome"/> <xsl:text> </xsl:text> <xsl:value-of select=”cognome"/> </li></xsl:template> XSLT - eXtensible Stylesheet Language Transformation
Fogli di stile Pull o Push • Nel documento XSLT si usano dunque elementi provenienti da almeno due namespace: quello di XSLT e quello del modello di documenti di destinazione • Esistono due filosofie di riscrittura disponibili in XSLT • Iterativo, o Pull: basata su template, viene usata tipicamente per trasformare dati. In un documento pre-formattato per l’output, si vanno ad inserire le parti di documento tratte dal file XML d’origine • Ricorsivo, o Push: basata su regole, usata tipicamente per trasformare documenti XSLT - eXtensible Stylesheet Language Transformation
Stile iterativo (Pull) • I fogli di stile tipo pull sono adatti per riscrivere documenti XML dalla struttura di database, molto ripetitivi: <portfolio> <stock exchange="nyse"> <name>zacx corp</name> <sym>ZCXM</sym> <pr>28.875</pr> </stock> <stock exchange="nasdaq"> <name>zaffymat inc</name> <sym>ZFFX</sym> <pr>92.250</pr> </stock> <stock exchange="nasdaq"> <name>zysmergy inc</name> <sym>ZYSZ</sym> <pr>20.313</pr> </stock> </portfolio> XSLT - eXtensible Stylesheet Language Transformation
Stile iterativo (Pull) • Questo è un foglio di stile XSLT di tipo pull per generare un documento HTML con quei dati: <HTML xmlns:xsl=“http://www.w3.org/1999/XSL/Transform” xmlns=“http://www.w3.org/HTML4/”> <BODY><TABLE BORDER="2"> <TR><TD>Simbolo</TD><TD>Nome</TD><TD>Prezzo</TD></TR> <xsl:for-each select="portfolio/stock"> <TR> <TD><xsl:value-of select="sym"/></TD> <TD><xsl:value-of select="name"/></TD> <TD><xsl:value-of select="pr"/></TD> </TR> </xsl:for-each> </TABLE> </BODY> </HTML> XSLT - eXtensible Stylesheet Language Transformation
Stile iterativo (Pull) • Questo è sostanzialmente un documento HTML con qualche tag strano • xsl:for-each va a cercare uno ad uno una sequenza di elementi ed applica le istruzioni al suo interno per ciascun elemento • xsl:value-of va a cercare il valore (cioè il contenuto) di ogni elemento all’interno di xsl:foreach, e lo inserisce al suo posto XSLT - eXtensible Stylesheet Language Transformation
Stile ricorsivo (Push) • Supponiamo di avere questo documento XML dalla struttura di documento, molto diversificato: <document> <title>To the Pole and Back</title> <section> <title>The First Day</title> <para>It was the <emph>best</emph> of days, it was the<emph>worst </emph> of days.</para> <para><emph>Best</emph> in that the sun was out, but<emph>worst</emph> in that it was 39 degrees below zero.</para> </section> ... </document> XSLT - eXtensible Stylesheet Language Transformation
Stile ricorsivo (Push) • Questo è un foglio di stile XSLT di tipo push: <xsl:stylesheet version="1.0" xmlns:xsl=“http://www.w3.org/1999/XSL/Transform” xmlns=“http://www.w3.org/HTML4/”> <xsl:template match="/"> <HTML> <BODY> <H1><xsl:value-of select="document/title"/></H1> <xsl:apply-templates select="document/section"/> </BODY> </HTML> </xsl:template> <xsl:template match="section"> <HR/><H2><xsl:value-of select="title"/></H2> <xsl:apply-templates select="para"/> </xsl:template> <xsl:template match="para"> <P><xsl:apply-templates /></P> </xsl:template> <xsl:template match="emph"> <I><xsl:apply-templates /></I> </xsl:template> </xsl:stylesheet> XSLT - eXtensible Stylesheet Language Transformation
Stile ricorsivo (Push) • Questo non assomiglia ad un documento HTML, ma ad una serie di istruzioni di riscrittura separate: • xsl:template è la regola da applicare se l’elemento in esame corrisponde al valore dell’attributo match. Di volta in volta verrà applicato il template della radice (“/”), dell’elemento “section”, dell’elemento “para”, dell’elemento “emph”, ecc • xsl:apply-templates spinge a cercare, all’interno dell’elemento che stiamo considerando, se esistono altri template applicabili. E’ il modo per far ripartire ricorsivamente la ricerca di altri template XSLT - eXtensible Stylesheet Language Transformation
Uso di variabili • E’ possibile definire delle variabili. Il valore di una variabile è quello di qualunque espressione. • La variabile può essere usata nel sottoalbero in cui è definita e deve essere richiamata con l’uso delle graffe e del segno $ <xsl:variable name=”fs">12pt</xsl:variable> <xsl:template match="para"> <fo:block font-size="{$fs}"> <xsl:apply-templates/> </fo:block></xsl:template> • Attenzione: la variabile XSLT non è variabile!!!, ovvero il suo valore non può essere cambiato durante la computazione. E' una costante ottenuta attraverso la valutazione di un'espressione, non una variabile. XSLT - eXtensible Stylesheet Language Transformation
Altri aspetti di XSLT • Merging • E’ possibile porre frammenti di fogli di stile in file esterni. Con gli elementi <xsl:import> e <xsl:include> è possibile inserire frammenti esterni con due significati leggermente diversi: <xsl:import> modifica, diminuendola, la priorità degli elementi inclusi, mentre <xsl:include> la mantiene • Metodi di output • E’ possibile specificare che il documento risultante è XML, HTML o testo con l’elemento <xsl:output>. Se l’output è HTML o testo, il processore è meno rigoroso nel valutare la buona forma del documento risultante • White space • E’ possibile specificare quali elementi debbano preservare e quali debbano collassare il white space con due appositi elementi, <xsl:preserve-space> e <xsl:strip-space> XSLT - eXtensible Stylesheet Language Transformation
Un esempio complesso <publisher> <books> <book><title>Stranger in a strange land</title> <author-ref ref="rh"/></book> <book><title>Starman Jones</title> <author-ref ref="rh"/> <author-ref ref="jldr"/></book> <book><title>The Space Merchants</title> <author-ref ref="fp"/> <author-ref ref="ck"/></book> </books> XSLT - eXtensible Stylesheet Language Transformation
Un esempio complesso <authors> <author id="rh"> <name>Robert Heinlein</name></author> <author id="ck"> <name>Cyril Kornbluth</name></author> <author id="fp"> <name>Frederick Pohl</name></author> <author id="jldr"> <name>Judy-Lyn Del Rey</name></author> </authors> </publisher> XSLT - eXtensible Stylesheet Language Transformation
Un esempio complesso <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:variable name="books_by_rh" select="//book[author-ref/@ref='rh']"/> <xsl:variable name="more_than_one_auth" select="//book[count(author-ref) > 1]"/> <xsl:template match="/"> Total number of books by Robert Heinlein: <xsl:value-of select="count($books_by_rh)" /> Total number of books by several authors: <xsl:value-of select="count($more_than_one_auth)" /> Number of books in the union of the two sets <xsl:value-of select="count($books_by_rh | $more_than_one_auth)"/> </xsl:template> </xsl:stylesheet> XSLT - eXtensible Stylesheet Language Transformation
Un esempio complesso • La trasformazione genera un documento XML composto da un solo nodo di testo <?xml version="1.0" encoding="utf-8"?> Total number of books by Robert Heinlein: 2 Total number of books by several authors: 2 Number of books in the union of the two sets 3 XSLT - eXtensible Stylesheet Language Transformation
Un esempio complesso <?xml version="1.0"?> <book> <chapter title="It begins"> <para title="First paragraph"/> <para title="2nd paragraph"/> <para title="3rd paragraph"/> </chapter> <chapter title="The sequel"> <para title="Paragraph"/> <para title="Yet another paragraph"/> </chapter> </book> XSLT - eXtensible Stylesheet Language Transformation
Un esempio complesso • Numerare i capitoli ed i paragrafi <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <formatted-book> <xsl:apply-templates select="book/chapter"/> </formatted-book> </xsl:template> …. </xsl:stylesheet> XSLT - eXtensible Stylesheet Language Transformation
Un esempio complesso ... <xsl:template match="chapter"> Chapter <xsl:number format="I"/>: <xsl:value-of select="@title"/> <xsl:apply-templates select="para"/> </xsl:template> ... <xsl:template match="para"> Paragraph <xsl:number count="para|chapter" format="I.a"/>: <xsl:value-of select="@title"/> </xsl:template> ... XSLT - eXtensible Stylesheet Language Transformation
Un esempio complesso • Risultato: <?xml version="1.0" encoding="utf-8"?> <formatted-book> Chapter I: It begins Paragraph I.a: First paragraph Paragraph I.b: 2nd paragraph Paragraph I.c: 3rd paragraph Chapter II: The sequel Paragraph II.a: Paragraph Paragraph II.b: Yet another paragraph </formatted-book> XSLT - eXtensible Stylesheet Language Transformation
Conclusione • XSLT consente di trasformare documenti XML in altri documenti con struttura diversa • Funziona con un meccanismo di pattern matching e si basa su Xpath • Implementa istruzioni condizionali e meccanismi di iterazione XSLT - eXtensible Stylesheet Language Transformation
Riferimenti • Deitel et al, XML Corso di programmazione, Apogeo • Chris Bates, XML in theory and Practice, Wiley • XML Path Language (XPath) Version 1.0 W3C Recommendation 16 November 1999 http://www.w3.org/TR/xpath • W3Schools Online Web Tutorials http://www.w3schools.com/xsl/default.asp XSLT - eXtensible Stylesheet Language Transformation