1 / 44

XSLT (e X tensible S tylesheet L anguage T ransformation)

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

brook
Télécharger la présentation

XSLT (e X tensible S tylesheet L anguage T ransformation)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. XSLT(eXtensible Stylesheet Language Transformation) Laurea Magistrale in Informatica Reti 2 (2005/06) dott. Francesco De Angelis francesco.deangelis@unicam.it

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. Il modello di XSLT input output processore XSLT XSLT - eXtensible Stylesheet Language Transformation

  8. 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

  9. 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

  10. 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

  11. 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

  12. 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

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

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

  19. 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

  20. 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

  21. 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

  22. 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

  23. 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

  24. 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

  25. 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

  26. 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

  27. 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

  28. 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

  29. 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

  30. 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

  31. 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

  32. 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

  33. 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

  34. 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

  35. 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

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

  37. 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) &gt; 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

  38. 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

  39. 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

  40. 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

  41. 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

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

  43. 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

  44. 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

More Related