xslt (extensible stylesheet language transformation) laurea magistrale in informatica reti 2...
TRANSCRIPT
XSLT (eXtensible Stylesheet
Language Transformation)
Laurea Magistrale Laurea Magistrale in Informaticain Informatica
Reti 2 (2005/06)Reti 2 (2005/06)
dott. Francesco De [email protected]
XSLT - eXtensible Stylesheet Language Transformation 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
processore XSLT
input
output
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
Questo template trasforma un “para” in un “p” di HTML:
<xsl:template match=”PARA"> <P><xsl:apply-templates/></P> </xsl:template>
Esempio <xsl:apply-templates>
XSLT - eXtensible Stylesheet Language Transformation 14
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>
Creazione di Elementi
XSLT - eXtensible Stylesheet Language Transformation 15
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
<persona tipo=”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>
Creazione di Elementi
XSLT - eXtensible Stylesheet Language Transformation 16
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
<persona id=”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>
Creazione di Attributi
XSLT - eXtensible Stylesheet Language Transformation 17
<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
<persona nome=”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>
Prelievo di valori
XSLT - eXtensible Stylesheet Language Transformation 18
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
<persona nome=”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:[email protected]”>Mario</a>
Uso delle graffe {}
XSLT - eXtensible Stylesheet Language Transformation 19
<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
Definire l’albero di destinazione
XSLT - eXtensible Stylesheet Language Transformation 20
<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.
Definire l’albero di destinazione
XSLT - eXtensible Stylesheet Language Transformation 21
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>
Iterazione <xsl:for-each>
XSLT - eXtensible Stylesheet Language Transformation 22
<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>
Istruzioni condizionali <xsl:if>
XSLT - eXtensible Stylesheet Language Transformation 23
<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>
Istruzioni condizionali <xsl:choose>
XSLT - eXtensible Stylesheet Language Transformation 24
<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
Ordinamento <xsl:sort>
XSLT - eXtensible Stylesheet Language Transformation 25
<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>
Esempio di ordinamento
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
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
Stile ricorsivo (Push)
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
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>
Altri aspetti di XSLT
XSLT - eXtensible Stylesheet Language Transformation 35
<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>
Un esempio complesso
XSLT - eXtensible Stylesheet Language Transformation 36
<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>
Un esempio complesso
XSLT - eXtensible Stylesheet Language Transformation 37
<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>
Un esempio complesso
XSLT - eXtensible Stylesheet Language Transformation 38
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: 2Total number of books by several authors: 2Number of books in the union of the two sets 3
Un esempio complesso
XSLT - eXtensible Stylesheet Language Transformation 39
<?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>
Un esempio complesso
XSLT - eXtensible Stylesheet Language Transformation 40
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>
Un esempio complesso
XSLT - eXtensible Stylesheet Language Transformation 41
...<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>...
Un esempio complesso
XSLT - eXtensible Stylesheet Language Transformation 42
Risultato:
<?xml version="1.0" encoding="utf-8"?><formatted-book>
Chapter I: It beginsParagraph I.a: First paragraphParagraph I.b: 2nd paragraphParagraph I.c: 3rd paragraph
Chapter II: The sequelParagraph II.a: ParagraphParagraph II.b: Yet another paragraph
</formatted-book>
Un esempio complesso
XSLT - eXtensible Stylesheet Language Transformation 43
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
Conclusione
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.0W3C Recommendation 16 November 1999http://www.w3.org/TR/xpath
W3Schools Online Web Tutorialshttp://www.w3schools.com/xsl/default.asp