Corso di Laurea Specialistica in Ingegneria Informatica Corso di Linguaggi e Tecnologie Web XSL (eXtensible Stylesheet Language) Eufemia TINELLI A. A. 2011 - 2012 Contenuti • XSL = XSLT + XSL-FO (+ XPath) • Struttura di un documento XSLT – modelli, documento di destinazione, variabili, iterazioni e istruzioni condizionali • XSL-FO (cenni) E. TINELLI – LTW A. A. 20112011-2012 2 Usare i CSS con XML • Per ciascun elemento del documento XML che si intende formattare occorre definire una regola del tipo: • Nel documento XML si inserisce un riferimento al CSS con un'apposita direttiva di elaborazione (processing instruction): <?xml-stylesheet type="text/css" href=“myCSS4XML.css" ?> • XSL è un linguaggio XML creato inizialmente per fornire a XML un supporto per la formattazione simile a CSS, ma potenziato per riflettere il linguaggio su cui viene applicato, che non è più HTML • XSL estende il concetto di foglio di stile fino a permettere la manipolazione della struttura stessa del documento E. TINELLI – LTW A. A. 20112011-2012 3 XSL: un linguaggio di stylesheet (1) • XSL è un insieme di tre linguaggi che forniscono gli strumenti per l'elaborazione e la presentazione di documenti XML in modo molto flessibile e si basa su tre meccanismi di base: – un meccanismo per l'individuazione dei dati da presentare – un meccanismo per il controllo dell'elaborazione dei dati e di come la presentazione deve essere effettuata – un meccanismo per la definizione della formattazione da applicare ai dati per la presentazione vera e propria • A ciascuno di questi tre meccanismi, XSL associa uno specifico linguaggio: – XPath consente di individuare gli elementi e gli attributi di un documento XML sui quali verranno applicate le operazioni necessarie per la presentazione dei dati – XSLT (XSL transformation) consente di controllare le operazioni che rendono i dati presentabili – XSL-FO (XSL Formatting Objects) definisce un insieme di tag di formattazione E. TINELLI – LTW A. A. 20112011-2012 4 XSL: un linguaggio di stylesheet (2) • Poiché nessun elemento di XML possiede un significato predefinito, il linguaggio di stylesheet si occupa di dare un significato agli elementi di un documento XML. • XSL è un working group di W3C che si occupa di definire un'insieme di specifiche volte a gestire in maniera altamente flessibile la presentazione e la trasformazione di documenti XML • La proposta è divisa in due parti: – un linguaggio di trasformazione da documenti XML a documenti XML – un vocabolario di elementi XML con semantica di formattazione • XSLT 1.0 è una recommendation W3C del novembre 1999 • XSLT 2.0 è una recommendation W3C di gennaio 2007 • XSL-FO è recommendation dell'ottobre 2001, la versione corrente di XSL-FO è la 1.1, da specifica W3C del dicembre 2006 E. TINELLI – LTW A. A. 20112011-2012 5 XSLT: il funzionamento • La presentazione dei dati racchiusi in un documento XML è basata su due elementi: – un documento che descrive come i dati devono essere elaborati per la presentazione, chiamato foglio di stile XSLT – un componente software, chiamato processore XSLT, in grado di prendere in input un documento XML e un foglio di stile XSLT e di produrre in output i dati secondo il formato di presentazione prescelto (XSL-FO, XHTML, testo, ecc.) <book> <title>…</title> <chapter n=“1”> <title> …</title> … </chapter> </book> c. c e , h2” “ , ” ”h1 , ” l m t -> “h XSL XSL XSL -> “fo:block”,”fo:inline”, ecc. -> “ libr o”,” capi tolo ”, e cc. E. TINELLI – LTW A. A. 20112011-2012 <libro> <titolo>…</titolo> <capitolo n=“1”> <titolo> …</titolo> … </capitolo> </libro> 6 XSLT: Input e Output • Nella terminologia di XSLT, il documento da trasformare è chiamato source document (documento di origine), mentre il documento generato dal processo di trasformazione è chiamato result document (documento risultante). • Il documento risultante di una trasformazione XSLT può essere un documento XML o un documento di altro tipo. Ad esempio, a partire da un documento XML possiamo generare un documento HTML, PDF, RTF, XML stesso o altri formati testuali. • La trasformazione avviene in base alle informazioni contenute in un particolare tipo di documento e interpretate da un processore XSLT. Questo documento di trasformazione, chiamato foglio di stile XSLT, non è altro che un documento XML che fa uso di tag appartenenti alla grammatica di XSLT in grado di controllare il processo di trasformazione. E. TINELLI – LTW A. A. 20112011-2012 7 XSLT: modelli o template • Il processo di trasformazione controllato da XSLT si basa sull’uso di XPath per individuare gli elementi del documento origine, sui quali viene applicato un template (o modello) di trasformazione. Ogni template: 1. seleziona un nodo della struttura del documento XML; 2. indica al processore XSLT come trasformare il nodo selezionato in 1 (ossia indica quale sostituzione deve essere eseguita) • Da un punto di vista sintattico, un template è un elemento del linguaggio XSLT che ha la seguente forma di base: <xsl:template match=“XPath pattern” name=“qname” priority=“number” mode=“qname”> <!-- azione --> </xsl:template> E. TINELLI – LTW A. A. 20112011-2012 8 XSLT: i fogli di stile • Un foglio di stile XSL è composto sostanzialmente di template di costruzione, che permettono di riscrivere una selezione di elementi del documento XML d’origine in altri elementi del documento destinazione. • Ogni template individua un pattern (XPath) da ricercare nel documento di partenza, e vi associa un blocco di elementi e testo da inserire nel documento di destinazione • Il processore XSLT : – va alla ricerca dei template da applicare partendo dal root element e seguendo l’albero di rappresentazione logica del documento stesso – Se il foglio di stile contiene diversi template che devono essere applicati è necessario specificare all’interno del template corrente l’elemento <xsl:apply-templates/> (è un modo per far ripartire ricorsivamente la ricerca di altri template) E. TINELLI – LTW A. A. 20112011-2012 9 Un esempio di documento XSLT • Un documento XSLT è un documento XML ben formato: – Un Prologo XML – Un unico root element che contiene tutti gli altri nodi del documento – All'interno del documento tutti i tag devono essere chiusi <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:my="http://sisinflab.poliba.it/ltw" xmlns="http://www.w3.org/TR/xhtml1" > <xsl:output method= "html" version="1.0" encoding="UTF-8" indent="yes"/> …identificare i template…. </xsl:stylesheet> E. TINELLI – LTW A. A. 20112011-2012 10 XSLT: child dell’elemento <xsl:stylesheet> • • • • • • • • • • • • xsl:import xsl:include xsl:strip-space xsl:preserve-space xsl:output xsl:key xsl:decimal-format xsl:namespace-alias xsl:attribute-set xsl:variable xsl:param xsl:template E. TINELLI – LTW A. A. 20112011-2012 11 Elemento <xsl:template> • All’interno dell’elemento template si possono annidare elementi che servono per scrivere frammenti del documento di destinazione o per modificare la lista di nodi. • Modificare il documento di destinazione • • • • • elementi letterali <xsl:element> <xsl:text> <xsl:comment> <xsl:copy> • • • • • <xsl:value-of> <xsl:attribute> <xsl:processing-instruction> <xsl:namespace-alias> <xsl:number> • Modificare la lista di nodi correnti • <xsl:apply-templates> • <xsl:if> • <xsl:sort> • <xsl:for-each> • <xsl:choose> E. TINELLI – LTW A. A. 20112011-2012 12 Elementi letterali – Si scrive direttamente il frammento XML richiesto – Ogni elemento che non appartiene al namespace di xsl viene direttamente scritto nel documento di destinazione così come appare nel template – Analogamente viene fatto per ogni nodo di testo <xsl:template match=“emph”> <html:b> <xsl:apply-templates/> </html:b> </xsl:template> E. TINELLI – LTW A. A. 20112011-2012 Qualunque espressione XPath che ritorni un insieme di nodi può essere inserito nell'attributo match 13 Identificare i template • Un template può essere identificato in due modi: con l’attributo match o per nome <xsl:template match=“xsl"> <h1>XSL tutorial di <xsl:value-of select=“autore"/></h1> … </xsl:template> • <xsl:template name=“xml"> <i>Lezione XML</i> … </xsl:template> Template di default – NODI E ROOT <xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template> – TESTO E ATTRIBUTI <xsl:template match="text()|@*"> <xsl:value-of select="."/> </xsl:template> – PIs E COMMENTI <xsl:template match="processing-instruction()|comment()"/> E. TINELLI – LTW A. A. 20112011-2012 14 Elemento <xsl:value-of> • Scrive in output il valore di una qualsiasi espressione XPath valida • Permette di estrarre informazioni da elementi ed attributi del documento di origine, combinandoli in maniera complessa • Permette l’uso delle funzioni XPath per ottenere nuove informazioni a partire da quelle contenute nel documento di origine e di documenti ad esso legati (fn:doc()) • L’uso tipico è per convertire markup in testo (ad esempio il valore di attributi in contenuto) <persona nome=”Mario” cognome=“Rossi”/> <p>Mario Rossi</p> <xsl:template match=“persona”> <p><xsl:value-of select=“@nome”/> <xsl:text> </xsl:text> <xsl:value-of select=“@cognome”/></p> </xsl:template> E. TINELLI – LTW A. A. 20112011-2012 15 Elemento <xsl:element> • Si usa se è necessario scrivere un elemento complesso o calcolato • Ad esempio può servire per trasformare nel nome di un tag nel documento destinazione il valore di un attributo del dcumento di partenza <persona tipo=”studente” nome=”Mario Rossi”/> <studente>Mario Rossi</studente> <xsl:template match=“persona”> <xsl:element name=“{@tipo}”> <xsl:value-of select=“@nome”/> </xsl:element> </xsl:template> E. TINELLI – LTW A. A. 20112011-2012 16 Cambiare la lista di nodi correnti: <xsl:apply-templates/> • Inserisce nella lista dei nodi correnti i figli diretti dell’elemento considerato, nell’ordine in cui appaiono • Se usato con l’attributo select (con un XPath per selezionare i nodi richiesti), inserisce i nodi che fanno match con il pattern • Nel momento in cui incontra un elemento <xsl:apply-templates>, il parser sospende il processing del template in corso e procede ricorsivamente ad esaminare i figli <xsl:apply-templates select="XPath expression" mode="mode name"> E. TINELLI – LTW A. A. 20112011-2012 17 <xsl:apply-templates/>: file XML di Esempio E. TINELLI – LTW A. A. 20112011-2012 18 <xsl:apply-templates/>: XSLT + output E. TINELLI – LTW A. A. 20112011-2012 19 Iterazioni: <xsl:for-each> • <xsl:for-each select="XPath expression"> Forma un template all'interno di un template, quindi essendo un template vero e proprio, va a modificare il context node E. TINELLI – LTW A. A. 20112011-2012 20 Istruzioni condizionali: <xsl:if> <xsl:if test="Boolean expression"> … </xsl:if> • N.B Anche se “test” valuta una espressione XPath <xsl:if> non modifica il context node, come invece fa template match E. TINELLI – LTW A. A. 20112011-2012 21 Istruzioni condizionali: <xsl:choose> <xsl:choose> <xsl:when test="Boolean expression"> … </xsl:when> … <xsl:otherwise> … </xsl:otherwise> </xsl:choose> E. TINELLI – LTW A. A. 20112011-2012 22 Le variabili <xsl:variable name="PI">3.14</xsl:variable> La variabile può essere utilizzata in una espressione XPath: <math pi="{$PI}"/> oppure <xsl:value-of select="$PI"/> Le variabili possono contenere non solo valori ma anche XML markup o XSLT. Le variabili XSLT sono in realtà identificatori associati a particolari valori (per poterli poi richiamare con più facilità all’interno di espressioni complesse) Æ più simili a costanti E. TINELLI – LTW A. A. 20112011-2012 23 CSS vs XSLT E. TINELLI – LTW A. A. 20112011-2012 24 XSL-FO (1) • Scopi del linguaggio: – definire la fase di formattazione – definire un vocabolario di elementi di formattazione indipendenti dal tipo di supporto utilizzato per l’output • L’idea alla base di XSL-FO è che l’utente non deve scrivere direttamente in linguaggio FO: è sufficiente creare un semplice documento XML e quindi trasformarlo utilizzando un opportuno XSLT. L’XSLT converte l’XML in XSL-FO. • Una volta che l’XSL-FO è stato generato, viene quindi passato ad una applicazione denominata XSL-FO processor, responsabile della creazione del documento in oggetto: PDF o PS, HTML, documenti RTF, ecc. E. TINELLI – LTW A. A. 20112011-2012 25 XSL-FO (2) La fase di formattazione è schematizzabile in cinque passi: 1. Trasformazione del documento XML attraverso un documento XSLT in un documento XSLFO 2. Trasformazione dell’albero in uno costituito, non da elementi e attributi, ma da oggetti di formattazione e loro proprietà – Ogni elemento genera un oggetto, ogni attributo genera un proprietà dell'albero 3. Raffinamento dell’albero degli oggetti di formattazione ovvero mapping dalle proprietà nelle caratteristiche (es. calcolo del valore espresso in unità di misura utilizzate dall'output) 4. Scioglimento dei valori relativi, ereditati, calcolati, raggruppati 5. Costruzione dell’albero delle aree. Identificazione degli elementi ripetuti, fissi, ecc. 6. Rendering finale E. TINELLI – LTW A. A. 20112011-2012 26 Riferimenti • Specifiche – http://www.w3.org/TR/xslt20/ – http://www.w3.org/TR/xsl/ • Testi consigliati – A. Moller and M. Schwartzbach, An Introduction to XML and Web Technologies, Addison Wesley, 2006 [cap. 5] – H. M. and P.J. Deitel, T. R. Nieto, T. M. Lin and P. Sadhu, XML Corso di programmazione, Apogeo, 2002 [cap. 12-13] E. TINELLI – LTW A. A. 20112011-2012 27