002cap01.fm Page 3 Wednesday, July 10, 2002 6:06 AM Giorno 1 Introduzione all’XSLT Con un numero sempre crescente di persone che utilizzano l’Extensible Markup Language (XML) nelle loro applicazioni, sorge la necessità di un linguaggio generale che permetta di manipolare i documenti XML. Questo linguaggio è l’Extensible Stylesheet Language Transformations (XSLT), che è stato sviluppato dal W3 Consortium (W3C) e che ora ha ottenuto lo status di Raccomandazione, cioè la posizione più vicina a uno standard nel World Wide Web. Poiché i documenti XML di per sé non contengono informazioni di formattazione, c’è bisogno di qualcos’altro per formattare e visualizzare i dati in modo da renderli più gradevoli. L’XSLT è il linguaggio che permette di manipolare un documento XML. Da quel documento, si può poi creare un altro documento che contenga informazioni di formattazione, come lo Hypertext Markup Language (HTML), il Portable Document Format (PDF) o il Rich Text Format (RTF). Inoltre, è possibile utilizzare XSLT per ristrutturare i documenti XML. Oggi impareremo quanto segue: ● Che cos’è XSLT ● Quali sono i vantaggi di XSLT Come XSLT esegue le trasformazioni ● ● Quali strumenti utilizzare per creare documenti XSLT ● Come utilizzare i processori per eseguire trasformazioni Generalità su XSLT Negli ultimi anni, le dimensioni del World Wide Web sono enormemente aumentate. Il mero numero dei siti e delle pagine Web è inimmaginabile. Poiché queste pagine contengono solo informazioni di formattazione e quasi nessuna informazione riguardante il loro contenuto, trovare le informazioni necessarie diventa sempre più difficile man mano che il Web cresce. Scegliete un motore di ricerca sul Web e inserite un argomento. Molto probabilmente otterrete mi- 002cap01.fm Page 4 Wednesday, July 10, 2002 6:06 AM 4 Giorno 1 gliaia di risposte, la maggior parte delle quali irrilevante. Oltre a questo problema, quasi tutte le informazioni sul Web sono codificate in HTML, che è stato appositamente progettato per formattare testo da visualizzare nei browser. Utilizzare questo formato è conveniente, quando si esaminano le pagine con un browser, ma le applicazioni progettate per elaborare informazioni incontrano molte difficoltà a operare con HTML perché i dati in un documento HTML non hanno significato e HTML è troppo non strutturato per reperire facilmente i dati in esso immagazzinati. Prendiamo l’Extensible Markup Language o XML. Sebbene sia molto simile all’HTML, non contiene informazioni di formattazione, bensì informazioni circa il significato dei dati in un documento. Ciò in effetti significa che, in ogni documento scritto in XML, il significato dei suoi dati fa parte del documento stesso. Lungo tutto il libro, utilizzerò il termine documento XML sia per i file XML sia per l’XML immagazzinato in altre forme, come una stringa in memoria o in un database. Il vantaggio sicuro è che i dati di XML possono essere estratti e confrontati in modo più accurato con una query di ricerca. La query visualizza così le informazioni che si desiderano effettivamente, scartando tutto ciò che è irrilevante. Un motore di ricerca che utilizzi le informazioni di XML può anche chiedervi di specificare meglio la query – per esempio, per determinare se intendevate computer chips (chip per computer) o French fries (patatine fritte) quando avete introdotto la parola di ricerca chips. L’idea è che col tempo il Web passi da pagine di testo a Web semantico, dove tutte le pagine avranno un significato non solo per le persone, ma anche per le applicazioni. Sebbene XML sia orientato verso il Web e introdotto dal W3C, non è previsto che venga utilizzato solo sul Web. Può essere utilizzato in tutti i tipi di applicazione, sia per immagazzinare dati sia come mezzo di comunicazione fra applicazioni. Questo uso potrebbe sembrare un po’ strano, poiché c’è sempre stata differenza fra immagazzinare e comunicare dati. Invece è effettivamente del tutto naturale: i dati sono dati, indipendentemente da dove si utilizzano. Questo concetto sta diffondendosi un po’ alla volta, man mano che aumenta il numero dei fornitori che utilizzano XML nelle loro applicazioni. Microsoft, per esempio, attualmente supporta in un modo o nell’altro XML nella maggior parte dei suoi prodotti. Infatti, il .NET Framework, che è stato sviluppato per gestire la maggior parte delle applicazioni e dei servizi futuri, è più o meno costruito attorno a XML. Altri fornitori che hanno adottato XML comprendono Sun e IBM, che lo utilizzano in varie applicazioni. Introduzione a XML e XSLT Un documento XML assomiglia molto a un documento HTML. Come HTML, XML utilizza tag che hanno influenza sul loro contenuto, come in questo esempio: 002cap01.fm Page 5 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT 5 <title>Teach Yourself XSLT in 21 Days</title> Un vantaggio importante è che XML è solo testo, non un qualche formato proprietario o binario. Ciò significa che potete leggerlo e visualizzarlo con un editor di testi; un altro vantaggio è che ogni computer può leggerlo e reperire dati dal documento. Quest’ultimo vantaggio è reso possibile dal fatto che i tag attorno ai dati comunicano al computer il significato di quei dati. Il lato negativo è che la formattazione delle informazioni non è più associata con i dati, per cui presentare i dati in modo gradevole per un lettore umano non è possibile quando si utilizza solo XML. Si può capire e visualizzare XML, ma non ha un aspetto gradevole e sicuramente non viene visualizzato in modo consono agli scopi per i quali lo si utilizza. Consideriamo questo libro, per esempio. Se ogni capoverso, titolo e così via, fosse accompagnato da tag XML, la lettura sarebbe molto più difficile di quello che è con l’attuale formattazione. Pertanto, per formattare i dati in modo appropriato, è necessario manipolarli prima di poterli visualizzare. Cos’è XSLT? Senza uno strumento o linguaggio di tipo generale per manipolare XML, formattarlo per la visualizzazione sarebbe molto difficile. Bisognerebbe scrivere un’apposita applicazione per leggere XML e visualizzarlo nel modo desiderato. Bisognerebbe indicare all’applicazione come formattare ogni diverso tag XML. E cosa succederebbe se si volesse cambiare la formattazione? Bisognerebbe ricominciare tutto daccapo. Per ovviare a questo problema, il W3C cominciò a sviluppare l’Extensible Stylesheet Language (XSL), che è un linguaggio generale per manipolare e visualizzare dati in un documento XML. XSL consiste in XSL Formatting Objects (XSLFO) e XSL Transformations (meglio conosciuto come XSLT). Il primo, ancora ufficialmente chiamato XSL, è un vocabolario XML che definisce elementi utilizzati per specificare come visualizzare un documento XML. Un vocabolario XML è un insieme di tag XML definite per un certo scopo. XHTML è un altro esempio di vocabolario XML. XSLT è un linguaggio utilizzato per manipolare strutture o documenti XML. È anche un vocabolario XML. L’effettiva manipolazione di un documento XML con XSLT viene chiamata trasformazione.La trasformazione è il processo di creazione di un nuovo documento basato sul documento originale. Questo processo non cambia il documento sorgente. XSLT è estremamente versatile e può essere utilizzato per convertire XML in molti altri formati. Tutte le trasformazioni generano una nuova struttura ad albe- 002cap01.fm Page 6 Wednesday, July 10, 2002 6:06 AM 6 Giorno 1 ro. XSL può anche essere utilizzato per creare documenti XSLFO, che sono utili per creare documenti su cui possono operare applicazioni native. I documenti XSLFO possono essere utilizzati, per esempio, per creare file Adobe PDF o Microsoft Word. L’idea principale, in questo caso, è che XSLFO abbia carattere generale e possa essere utilizzato per formattare su diverse “superfici”, per così dire. XSLFO ha molte capacità per la formattazione di alta qualità, ma questo argomento esula dagli scopi di questo libro, che copre solo XSLT. Che cosa fa XSLT? XSLT trasforma un documento XML in un altro documento, che può contenere tag XSLFO per formattare i dati del documento per la visualizzazione, ma ciò non è obbligatorio. Infatti, non siamo affatto obbligati a utilizzare XSLT come parte di XSL. Come XSL è progettato per essere utilizzato da molte applicazioni, XSLT è progettato per trasformare in molti output diversi. Perciò, come XSL, XSLT è un linguaggio generale creato per essere utilizzato da molte applicazioni su molte piattaforme. Con XSLT, si possono creare documenti HTML, XHTML, testo semplice, PDF e diversi altri tipi di documenti. Possiamo anche utilizzare XSLT per trasformare un documento XML in un altro documento XML con una struttura diversa. Adesso i vantaggi di questa possibilità possono non essere evidenti, perché possiamo semplicemente utilizzare i dati dal documento originale. Vedremo, tuttavia, che la capacità di trasformare il documento XNL originale in un documento XML diverso è effettivamente una funzionalità molto potente e utile per molte applicazioni. Come si presenta XSLT? XSLT è un linguaggio di programmazione che trasforma documenti XML; tuttavia è diverso da altri linguaggi. Differisce nell’aspetto, nello stile e nel funzionamento. XSLT è in sé XML e, come XSLFO, è un vocabolario XML. Tuttavia, i suoi tag non dicono a un programma come visualizzare qualcosa, ma piuttosto che cosa fare quando trova un certo tag. Se avete già programmato in precedenza, alcuni di questi tag hanno nomi e funzioni che vi saranno familiari. Altri tag vi saranno del tutto sconosciuti, come potete vedere nel Listato 1.1. Listato 1.1 Esempio di XSLT <?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="xml" encoding="UTF-8" omit-xml-declaration="yes" indent="yes" /> <xsl:template match="/"> 002cap01.fm Page 7 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT 7 <xsl:apply-templates /> </xsl:template> <xsl:template match="books"> <xsl:for-each select="book"> <xsl:value select="title" /> </xsl:for-each> </xsl:template> </xsl:stylesheet> Capire la funzione del Listato 1.1 non è in questo momento importante. Questo esempio semplicemente mostra come si presenta XSLT. Se utilizzate Internet Explorer versione 5.0 o successive, potete scrivere il codice precedente e visualizzarlo. Vedrete che un foglio stile è XML e ha una struttura ad albero. ANALISI Ciascun tag in XSLT esprime un comando per il programma che esegue la trasformazione. In XSLT, a differenza della maggior parte dei linguaggi di programmazione, questi comandi possono occupare molte righe. Infatti, poiché XSLT è in sé XML, esso deve conformarsi alle stesse regole di sintassi di ogni altro documento XML. Se avete esperienza di programmazione con Visual Basic, C++, Java, eccetera, questa codifica può sembrarvi piuttosto strana perché manca il concetto di righe che compiono una certa azione. XSLT, in effetti, opera in modo diverso da quei linguaggi. Non preoccupatevi di questo per ora; ne parlerò con maggior particolari più avanti. XSLT e la famiglia di XML XSLT si basa su XML e interagisce con molti degli altri membri della famiglia di XML. La conoscenza della posizione di XSLT nella famiglia di XML e della sua origine ci aiuterà a capire meglio XSLT e come utilizzarlo. Poiché la famiglia di XML è diventata piuttosto grande ed è in continua evoluzione, i paragrafi che seguono non forniranno la mappa di tutti i membri della famiglia di XML. Breve storia di XML e XSLT Non vi annoierò con una lunga e particolareggiata storia di XML e XLST. Vi farò solo un breve resoconto in modo che possiate vederli in prospettiva. Dopo tutto, non sono proprio nati dal nulla. XML è basato in effetti su concetti che sono stati sviluppati nei primi tempi dell’elaborazione. 002cap01.fm Page 8 Wednesday, July 10, 2002 6:06 AM 8 Giorno 1 Origini di XML XML è basato sullo Standard Generalized Markup Language (SGML), ma SGML è molto più complesso. In questo senso, XML è più basato su HTML, perché il progetto per XML mirava a renderlo generale come SGML, ma facile come HTML, in modo da agevolarne l’adozione. SGML fu effettivamente sviluppato come Generalized Markup Language (GML) nel 1969 da Ed Mosher, Ray Lorie e Charles F. Goldfarb alla IBM Research. Nonostante l’International Standards Organization (ISO) abbia adottato SGML come standard per immagazzinamento e scambio di dati nel 1986, era troppo complesso per ottenere un riconoscimento generale. HTML, d’altra parte, è il linguaggio di marcatura più diffuso che esista, soprattutto per la sua semplicità. XML è in effetti un sottoinsieme semplificato di SGML e come tale è molto più facile da capire e da utilizzare nella programmazione. Questa facilità, inoltre, permette di creare più agevolmente un parser per XML che per SGML; questo può giustificare in gran parte la diffusione di XML. Un parser è un programma in grado di leggere e capire la sintassi e la grammatica di un linguaggio. Due anni dopo l’inizio, nel febbraio 1998, XML 1.0 diventò una Recommendation del W3C. Da allora, il lavoro su linguaggi e sistemi basati su XML ha cominciato a diffondersi rapidamente. XHTML, WML, SVG, Xpath, Xpointer e XML Query sono solo alcune delle tecnologie XML che sono state sviluppate. XSLT è anch’esso uno di questi linguaggi, che è diventato una Recommendation del W3C il 16 novembre 1999. Origini di XSLT Come XML, anche XSLT è basato su concetti già esistenti. Nei primi anni Novanta, venne creato uno standard basato su SGML che venne chiamato Document Style Semantics and Specification Language (DSSSL). Questo linguaggio generale doveva essere utilizzato per manipolare documenti SGML, convertendoli in un formato adatto alla visualizzazione o alla stampa. Tuttavia, poiché questa tecnologia era molto complessa e difficile da utilizzare (e molto costosa), soltanto alcune grandi case editrici poterono permettersi di creare applicazioni da utilizzare per la composizione tipografica di alta qualità. Gli approcci SGML e DSSSL sono ancora utilizzati e tali rimarranno finché non verranno sviluppate applicazioni XML/XSLT che li possano sostituire. XSLT ha le sue origini nel DSSSL, ma è molto più semplice. Sebbene XSLT sia basato sul DSSSL, non è un vero sottoinsieme del DSSSL, poiché alcune caratteristiche di XSLT non esistono nel DSSSL. 002cap01.fm Page 9 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT 9 Altri componenti della famiglia XML Oltre a XML e XSL, ci sono parecchi altri componenti della famiglia XML: alcuni specifici di XML, altri condivisi da tecnologie come HTML. Definire strutture XML Per definire una struttura o vocabolario XML, esistono due opzioni. Si può utilizzare una Document Type Definition (DTD) o il più recente XML Schema. Il vantaggio di definire tale struttura è che tutti i documenti che corrispondono alla definizione avranno una struttura predefinita, rendendo più facile scrivere applicazioni che utilizzano questi documenti. Le definizioni DTD o XML Schema possono essere inserite nel file XML stesso (definizioni interne) o in un file esterno (definizioni esterne). Nel secondo caso, il documento XML deve fare riferimento al file DTD o XML Schema. Vi sono due tipi di parser: ● Parser validanti Parser non validanti ● Un parser validante segnala errore se un documento XML non si conforma alle regole nella DTD o nello Schema associato; un parser non validante no. La maggior parte dei parser validanti ha l’opzione di poter disabilitare la convalida, rendendoli così parser non validanti. Una DTD in sé non è XML e come tale non può essere utilizzata da un parser per compiti diversi dalla convalida di un documento XML. La DTD non può essere consultata come XML. Alcuni parser offrono funzioni per ottenere informazioni dalla DTD, ma queste sono separate dalle funzioni che si applicano a XML. Inoltre, le DTD danno poche informazioni circa il tipo di dati dei valori. Solo alcuni tipi di dati sono noti nelle DTD, ma la maggior parte delle applicazioni ne hanno molti di più. Non è possibile definire nuovi tipi di dati, perciò si è limitati ai soli tipi di dati disponibili nella DTD. Ciascun documento XML può avere una sola DTD che ad esso corrisponde. Si possono creare DTD complesse per aggregare altre DTD, ma il documento XML in sé è associato con una singola DTD. Per rimediare alla maggior parte dei problemi delle DTD, il W3C ha creato gli XML Schema. Gli XML Schema, che hanno ottenuto lo status di Recommendation il 2 maggio 2001, sono XML e anche molto più flessibili delle DTD. Questi definiscono inoltre più tipi di dati delle DTD. Molti sviluppatori adottarono rapidamente gli XML Schema, anche prima che diventassero una Recommendation del W3C. 002cap01.fm Page 10 Wednesday, July 10, 2002 6:06 AM 10 Giorno 1 Distinguere fra i vocabolari Utilizzando gli XML Schema (o le DTD), si possono definire vocabolari XML. Tuttavia, se si mescolano i vocabolari, si possono avere vocabolari che hanno elementi con gli stessi nomi. Questo problema non può essere risolto solo definendo i vocabolari. Per risolvere questo problema sono stati aggiunti alla famiglia di XML i namespace (aree semantiche). I namespace XML servono a distinguere i vocabolari XML. Per ciascun vocabolario utilizzato in un documento, si può definire un diverso namespace con un nome univoco entro il documento stesso. Questa definizione di namespace può puntare a un XML Schema o a una DTD esistente, ma ciò non è necessario. Il vantaggio di puntare il namespace a una DTD o a un XML Schema effettivo è che tutti sanno quale aspetto dovrà avere il documento. Possiamo identificare un namespace in un documento XML perché il namespace compare davanti al nome di elemento o di attributo. Il namespace e l’elemento o attributo sono separati dal segno di due punti. Supponiamo di definire un namespace per i libri. Un elemento titolo che utilizzi il namespace book apparirebbe come segue: <book:title>Teach Yourself XSLT in 21 Days</book:title> Ricorderete l’esempio di XSLT nel Listato 1.1. In quell’esempio, tutti gli elementi che facevano parte di XSLT erano preceduti dal namespace xsl Lo stesso XSLT utilizza un namespace XML per operare. Un namespace per un documento viene definito come attributo di un elemento: nella maggior parte dei casi, l’elemento radice. Per XSLT, il namespace viene definito come segue: xmlns:xsl=http://www.w3.org/1999/XSL/Transform La definizione di namespace ha tre parti. Il nome dell’attributo ha due parti: la dichiarazione di namespace xmlns (un namespace predefinito), seguita dal namespace che si vuole introdurre (in questo caso, xsl). Il namespace introdotto non deve necessariamente essere lo stesso in ogni documento. Il namespace xsl in XSLT è solo una convenzione. Volendo, si può creare un altro namespace (per esempio, transform) e utilizzarlo al posto di xsl. L’ultimo pezzo della dichiarazione è un Uniform Resource Identifier (URI), che deve essere univoco per ogni vocabolario. Un URI è un nome o indirizzo univoco per una risorsa. Può essere un Uniform Resource Locator (URL) o un Uniform Resource Name (URN). L’URI potrebbe puntare a una DTD o a un XML Schema per definire il vocabolario che il namespace rappresenta, ma ciò non è necessario. Inoltre, se non è implicata alcuna convalida, il namespace può contenere qualsiasi nome di ele- 002cap01.fm Page 11 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT 11 mento. La dichiarazione di namespace all’inizio di questo paragrafo punta specificamente a un URI che lo definisce come XSLT. Se si utilizza un altro namespace per XSLT, l’unico requisito è che punti allo stesso URI. Maggiori particolari circa i namespace di XML saranno presentati nel Giorno 15, “Uso dei namespace”. Il Document Object Model Se si vuole programmare con XML, ovviamente occorre un modo per arrivare ai dati. Si può scrivere un programma che legga XML da un file e lo utilizzi. Questo approccio genererebbe probabilmente una soluzione proprietaria. Il concetto principale che sta alla base di XML è che si tratta di uno standard che tutti possono utilizzare, per cui creare una soluzione proprietaria non è il modo migliore di procedere. Ciò che serve è una Application Programming Interface (API) standard per interagire con XML. Il W3C ha creato il Document Object Module (DOM) da utilizzare come API standard. L’idea che sta alla base del DOM è che un documento XML è un albero gerarchico di elementi e attributi che può essere rappresentato in memoria e manipolato attraverso un meccanismo standard. L’utilizzo del DOM non è limitato a XML; opera anche con HTML 4.0. Tuttavia, poiché HTML è meno strutturato di XML, può nascere qualche problemi a utilizzarlo con HTML. Come gli altri membri della famiglia di XML, il DOM sta progredendo. Fin dal 13 novembre 2000, il DOM Level 2 ha status di Recommendation. Il DOM Level 3 è attualmente in corso di sviluppo. Simple API for XML Il DOM è uno standard per decreto del W3 Consortium. Tuttavia, già prima che apparisse il DOM si sentiva la necessità di un metodo standard per utilizzare XML. Il metodo che è diventato automaticamente uno standard, Simple API for XML (SAX), segue una strada completamente diversa dal DOM quando lavora con un documento XML. Invece di leggere l’intero documento, SAX legge il documento un elemento alla volta. Ogni elemento che il parser incontra innesca un evento. Se volete, potete collegare una routine all’evento per agire sull’elemento e generare output. Un grande vantaggio di questo approccio è che praticamente non utilizza memoria, perché non è necessario costruire l’intero documento in memoria. Questo approccio è estremamente utile quando lavorate con grandi documenti. Molti parser utilizzano il modello SAX. Altri utilizzano DOM o, come il parser MSXML della Microsoft, consentono di scegliere fra i due. 002cap01.fm Page 12 Wednesday, July 10, 2002 6:06 AM 12 Giorno 1 Indirizzare elementi e attributi Poiché i documenti XML hanno una struttura gerarchica ad albero, è possibile raggiungere gli elementi specificando un percorso, che è simile al percorso che indirizza un file in un file system o in un sito Web. XPath è stato sviluppato per indirizzare elementi e attributi in un documento XML. Sebbene XPath sia un linguaggio separato, non viene utilizzato da solo; viene sempre utilizzato insieme a XSLT o a XPointer. Lo scopo di XPath è quello di indirizzare parti di un documento XML. Con XPath si può scegliere una singola voce o creare un’espressione di percorso che corrisponda a diverse voci. Questa capacità di stabilire una corrispondenza è molto importante per XSLT; è la base su cui gli elementi vengono selezionati da XSLT per essere trasformati. XPointer è l’equivalente XML dei collegamenti ipertestuali in HTML. Un collegamento in XPointer è definito per mezzo di XPath. XPath è una parte essenziale di XSLT. Maggiori particolari al riguardo si troveranno nel Giorno 3, “Scelta dei dati”. I vantaggi di XSLT I vantaggi dell’utilizzo di XSLT sono strettamente collegati ai vantaggi dell’utilizzo di XML. Supponendo che i dati siano immagazzinati o comunicati come XML (che è ciò a cui serve XML), i vantaggi di XSLT sono i seguenti: Richiamare dati da dati in un documento XML ● ● Formattare dati da un documento XML per la visualizzazione Tradurre fra un documento XML utilizzato per la comunicazione e un ● formato utilizzato entro un sistema XML e XSLT nell’immagazzinamento dati Quando bisogna immagazzinare dati, XML è molto flessibile. È possibile modificarlo per adattarlo facilmente al tipo di dati che deve immagazzinare. A questo riguardo, è molto più comodo di un database relazionale, perché un database è limitato alle tabelle che lo costituiscono. Ciascuna tabella contiene righe con un numero fisso di colonne, dove ciascuna colonna ha un significato fisso. La conseguenza è che, entro un database, i dati sono costretti ad avere un formato fisso. L’inconveniente è che non tutti i dati si adattano esattamente a questo formato fisso. XML ha una struttura gerarchica flessibile che può riprodurre molte, se non tutte, le strutture di dati esistenti. Per esempio, si può creare facilmente un documento XML contenente un intero database. Quando i dati sono immagazzinati in formato XML, XSLT può essere utilizzato per reperire dati da quel documento. Il formato fisso di un database rende diffi- 002cap01.fm Page 13 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT 13 cile interrogare dati da tabelle differenti con una sola operazione. Poiché XML non ha questa struttura rigida, un documento XSLT può facilmente raccogliere dati da diverse sezioni di un documento XML. Poiché XML è così flessibile, può anche immagazzinare dati relativamente non strutturati, come documenti di testo con una certa formattazione. Come ho ricordato all’inizio di questa lezione, il vantaggio di separare le informazioni dalla formattazione è che potete fare una ricerca basata su un significato contestuale. Con la maggior parte dei linguaggi di programmazione, creare un output formattato da un tale formato con segni di marcatura (tag) è difficile, mentre XSLT è effettivamente adatto a questo scopo. Il Listato 1.2 mostra un esempio di documento con tag di questo tipo che può essere formattato con XSLT. Listato 1.2 Articolo con segni di marcatura in XML <document xmlns:code="http://www.aspnl.com/xmlns/code" xml:lang="en-us"> <title>Hello world sample</title> <text> This sample shows how to use <keyword>Response</keyword>. <keyword>Write</keyword> to write text to a <device>browser</device> </text> <code:block multiline="yes" type="lesson" subject="ASP" name="write" language="ASP"> <code:html> &lt;html&gt; <tab />&lt;body&gt; </code:html> <code:asp> <code:keyword>Option</code:keyword> <code:keyword>Explicit</code:keyword><br /> <br /> <code:comment>'declare variable(s)</code:comment> <code:keyword>Dim</code:keyword> strWrite<br /> strWrite = "Hello World!"<br /> <code:object>Response</code:object>. <code:method>Write</code:method> strWrite </code:asp> <code:html> <tab />&lt;/body&gt; &lt;/html&gt; </code:html> </code:block> </document> ANALISI XML nel Listato 1.2 fa parte di un documento utilizzato per creare HTML per un sito Web con esempi di codice con codifica a colori. Potete chiedervi come mai 002cap01.fm Page 14 Wednesday, July 10, 2002 6:06 AM 14 Giorno 1 non ho creato HTML direttamente invece di crearlo da XML, dato che creare HTML da XML richiede un passaggio in più. La risposta è che XML non è utilizzato solamente per creare file HTML, ma anche il file dell’indice analitico ed esempi di codice che le persone possono eseguire per vedere il risultato. Inoltre, lo stesso XML può essere utilizzato per creare un manuale stampato che potrebbe essere utilizzato in un corso. I file separati vengono creati utilizzando XSLT. Ciascun tipo di output viene creato utilizzando un diverso documento XSLT e ciascun documento XSLT è un modello per il suo tipo di output. Qualsiasi documento che utilizza gli stessi tag XML può essere trasformato in quel tipo di output utilizzando lo stesso documento XSLT, come illustrato nella Figura 1.1. Sebbene all’inizio dobbiate fare un po’ di lavoro in più per creare XML e XSLT, alla fine risparmierete un sacco di tempo perché potrete riutilizzare XSLT per creare tutti i file che vi servono. Ciò rende XML e XSLT molto utili nella gestione dei documenti e negli scenari di gestione dei siti Web. Quest’ultimo caso è particolarmente vero per i siti Web che si rivolgono a più piattaforme, come i dispositivi palmari, in aggiunta ai normali browser. Oltre a rivolgervi a più piattaforme utilizzando un solo documento XML e diversi documenti XSLT, potete anche creare una modalità di presentazione unificata per più documenti XML. Ciò significa che dovete creare un solo documento XSLT che assicuri la stessa modalità di presentazione in un intero sito. Un ulteriore vantaggio in questo caso è che potete farlo per più linguaggi. Perciò, crea- XSLT XSLT HTML INDEX XML Figura 1.1 Trasformazione XML in più output. XSLT Code Samples XSLT Other formats 002cap01.fm Page 15 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT 15 re un sito Web che possa essere visualizzato in più linguaggi è molto più facile che con altri approcci. Dopo tutto, l’immagazzinamento dei dati è lo stesso e così è il documento XSLT. Un ulteriore vantaggio di immagazzinare dati in un documento XML è che questo può essere consultato utilizzando XPath. Questa procedura funziona un po’ come selezionare dati da un database utilizzando lo Structured Query Language (SQL). Il documento XML viene perciò utilizzato un po’ come un database. Un problema con questo tipo di utilizzo si verifica quando si cominciate a lavorare con più utenti. Se chi fa modifica un documento blocca l’accesso, qualcun altro non può leggerlo o consultarlo. Ciò rende XML inadatto all’impiego in ambiente multiutente. I database (e i server dei database in particolare) sono adatti all’impiego in ambiente multiutente, ma non possono gestire molto bene XML. Si può scaricare un documento XML in un database come campo testo, ma poi bisogna estrarlo dal database prima di poterlo consultare. Per questa ragione, il supporto di XML si sta introducendo sempre di più nella tecnologia dei database. Alcuni database permettono di estrarre i dati relazionali in essi immagazzinati come XML. Sebbene questa capacità sia solo all’inizio, non è altrettanto valida quanto un database che permette un supporto nativo per immagazzinamento XML e rende l’intero XML consultabile con XPath. Tuttavia, questi tipi di database sono diffusi e stanno lentamente evolvendo. Non si avvicinano ancora alla velocità dei sistemi di database relazionali, ma stanno migliorando rapidamente. Con questi database, molti tipi di applicazioni esistenti potrebbero essere create più facilmente e forse potrete creare nuove applicazioni che sono ancora fuori dalla vostra portata. Potete trovare maggiori particolari sui database XML all’indirizzo http://www.rpbourret.com/xml/XMLDatabaseProds.htm XML e XSLT nella comunicazione Poiché XML è un formato dati non proprietario, basato su uno dei principali tipi di dati, la stringa, può essere letto da quasi tutti i computer. Ciò lo rende il formato dati più utilizzato per la comunicazione tra sistemi. Qualsiasi sistema dotato di un parser XML può consumare e utilizzare XML. I Web Services sono basati su questo concetto. Un Web Service è una funzione fornita da un sistema e utilizzabile da un altro sistema attraverso Internet. Un Web Service differisce da una pagina Web per il fatto che una pagina Web è prevista per la visualizzazione, mentre il risultato di un Web Service nella maggior parte dei casi non è diretto. I risultati di un Web Service possono non vedere la luce del giorno per molto tempo dopo che il servizio è stato utilizzato, ma è ugualmente possibile che il risultato venga utilizzato per visualizzare immediatamente un risultato composito. 002cap01.fm Page 16 Wednesday, July 10, 2002 6:06 AM 16 Giorno 1 I Web Services possono essere implementati con diverse tecnologie. Due delle tecnologie più diffuse sono XML Remote Procedure Calling (XML-RPC) e Simple Object Access Protocol (SOAP). Entrambi definiscono un protocollo (o formato di messaggio) che permette a un sistema di utilizzare una funzione o un altro sistema, come illustrato nella Figura 1.2. Sebbene le due tecnologie siano essenzialmente le stesse, utilizzano due diversi formati XML. Fintantoché un’applicazione che utilizza il servizio sa quale protocollo gestisce, può reperire dati da quel formato. Se l’applicazione deve manipolare i dati, deve contare su XML DOM o utilizzare XSLT. Il tipo di comunicazione implementato da XML-RPC e SOAP non è nuovo. Alcune tecnologie esistenti hanno la stessa funzione. Tuttavia, queste tecnologie, incluse CORBA/IIOP, Microsoft COM/DCOM e Java Remote Method Invocation, sono tutte molto specifiche del sistema. Inoltre, queste tecnologie non utilizzano l’Hypertext Transfer Protocol (HTTP) per la comunicazione fra sistemi e perciò non passano attraverso un normale firewall di protezione delle reti. Questi metodi lavorano solo se il firewall è specificamente configurato per permettere altri protocolli. I sistemi di comunicazione basati su XML non sono specifici del sistema, perché ogni sistema può trattare dati in forma di stringhe. Con XML- <?xml version="1.0"?> <MethodCall> Application <methodName>add</methodName> <params> Function <param> Local function call Add(5, 2) <value><int>5</int></value> </param> </params> Local response Add = 7 </methodCall> Local response Add = 7 Local function XML-RPC call Add(5, 2) XML-RPC Remote Translatiion server XML-RPC response <?xml version="1.0"?> <methodResponse> <params> <param> <value><int>7</int></value> </param> </methodResponse> Figura 1.2 Applicazione che fa una chiamata di funzione attraverso Internet. 002cap01.fm Page 17 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT 17 RPC e SOAP, la comunicazione può avvenire attraverso HTTP, per cui funzionerà bene perfino se c’è un firewall installato. XML-RPC e SOAP non sono limitati all’HTTP; tuttavia, sono anche possibili l’e-mail o qualche altro sistema per comunicare i messaggi. BizTalk BizTalk è un’architettura che sviluppa ulteriormente il concetto di comunicazione fra sistemi con XML. È un’architettura per Enterprise Application Integration, basata su XML. È progettata per interagire con diversi sistemi in un processo commerciale. Ciascun sistema coinvolto nel processo può utilizzare diversi formati XML, ognuno dei quali viene interpretato da un server che dirige il processo. Se necessario, questo server può trasformare i messaggi in un altro formato in modo che possano essere compresi da un altro sistema. Un’implementazione dell’architettura BizTalk sarebbe difficilmente possibile senza che XML per interagire fra i sistemi e XSLT per trasformare i messaggi da un formato all’altro. Per saperne di più su BizTalk, si consulti il sito http://www.biztalk.org. Alcuni vecchi protocolli, come Electronic Data Interchange (EDI), stanno anch’essi adottando XML per la comunicazione. Applicazioni chat che utilizzano XML sono già disponibili. Un giorno o l’altro la maggior parte dei protocolli di comunicazione verrà sostituita da un singolo protocollo basato su XML. XML può essere utilizzato anche per comunicare entro un’applicazione. Un importante vantaggio di questo approccio è che ogni componente nel sistema può accedere nella stessa maniera a dati passati entro il sistema, indipendentemente dal tipo di componente. Anche dati da fonti diverse possono essere rappresentati nello stesso modo. Perciò, indipendentemente dal fatto che il dato venga da un database, da un server di posta o da altra fonte, la rappresentazione dei dati è la stessa. XSLT può essere utilizzato per eliminare le differenze e trasformare i dati in un formato adatto per tutte i sorgenti. Il vantaggio è che le applicazioni non devono affrontare le differenze d’interfaccia del sistema sottostante. Ciò vale anche per le funzioni che interagiscono attraverso XML. Quando non utilizzare XSLT Sebbene XSLT sia un potente strumento nelle moderne applicazioni guidate dai dati, non è affatto la risposta a tutti i vostri problemi. In alcune situazioni, altri approcci sono molto più logici. Non è possibile fornire un elenco completo delle situazioni, ma tratterò alcune delle più comuni applicazioni nei paragrafi seguenti. Queste informazioni daranno un’idea delle situazioni da che dovete evitare o almeno pensarci su due volte. Dovrete utilizzare queste informazioni insieme alla vostra esperienza per giudicare se XSLT è la giusta soluzione per il problema che state cercando di affrontare. 002cap01.fm Page 18 Wednesday, July 10, 2002 6:06 AM 18 Giorno 1 Problemi di prestazioni di XSLT XSLT è estremamente utile nelle applicazioni in cui la conversione dei dati è essenziale, come nella gestione dei documenti e nelle applicazioni per l’editoria. A causa delle sue prestazioni, XSLT è meno utile in applicazioni che richiedono molta elaborazione. Le prestazioni di XML e XSLT cambieranno, tuttavia, mano a mano che le applicazioni diventeranno sempre più centrate attorno ad essi. Le applicazioni che non soffrono molto per i problemi di prestazione sono quelle di tipo distribuito, in cui la trasformazione può essere effettuata sul client. Con i principali fornitori di browser che inseriscono il supporto XML e XSLT nei loro prodotti, le applicazioni Web che utilizzano XML e XSLT possono utilizzare la potenza del client e così probabilmente ridurre il traffico di rete. Questo approccio è molto meglio di un server che deve effettuare tutta la trasformazione in un formato che possa essere letto dal client, poiché il processo di trasformazione in una tale applicazione potrebbe diventare un importante collo di bottiglia. Uno specifico scenario che soffre per problemi di prestazione è costituito dai siti Web che utilizzano XML e XSLT. Fino a questo momento, i principali browser non supportano adeguatamente XSLT. Perciò, operare trasformazioni nel browser, distribuendo il carico, non è ancora possibile. Trasformare tutto l’XML in fase di esecuzione in un sito Web in attività è una soluzione troppo lenta per essere fattibile. Benchmark preliminari con il processore XSLT nel .NET Framework della Microsoft suggeriscono, tuttavia, che questa situazione può cambiare anche prima del previsto. Applicazioni di immagazzinamento dati Attualmente, problemi sia di prestazione sia di concorrenza rendono XML e XSLT meno adatti per applicazioni di immagazzinamento dati. Sebbene esistano database XML nativi, essi non possono competere con i principali database relazionali che sono stati per un po’ sulla cresta dell’onda. Se potete strutturare i vostri dati per immagazzinarli in un database relazionale, tuttavia, è possibile estrarre i dati come XML se si utilizza qualcuno dei database relazionali correnti. SQL Server 7 e Oracle forniscono aggiornamenti che permettono di restituire il risultato di una query in formato XML. SQL Server 2000 offre questa possibilità per default e può essere configurato per farlo sul Web. Applicazioni di elaborazione XSLT è carente anche nelle applicazioni a forte carico elaborativo. Sebbene XSLT offra certamente capacità di elaborazione, la maggior parte dei linguaggi, come C e FORTRAN, tanto per citarne alcuni, offrono molte più funzioni per elaborazioni complesse e con prestazioni molto superiori. 002cap01.fm Page 19 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT 19 Utilizzare CSS invece di XSLT In scenari in cui i documenti XML sono indirizzati al Web, XSLT potrebbe essere eccessivo. Se i dati non hanno bisogno di essere filtrati e sono nel giusto ordine, i Cascading Stylesheets (CSS) fa molto bene il suo lavoro. I CSS non sono affatto limitati all’utilizzo con HTML. Infatti, potete “inventare” tag in HTML e associarli a uno stile. Poiché, a tutti gli effetti, i tag XML possono essere considerati come tag HTML inventati da voi stessi, collegarvi uno stile è facile come in HTML. In questo scenario, utilizzare XSLT è in realtà controproducente. Utilizzare i CSS è una soluzione rapida, che non richiede la conoscenza di XSLT e che può essere probabilmente gestita dalla maggior parte degli sviluppatori Web. Come opera XSLT? Una volta afferrato il quadro generale di XSLT, è ora di passare alle applicazioni effettive del linguaggio. Prima di cominciare a lavorare effettivamente con XSLT, tuttavia, bisogna capire alcuni concetti fondamentali sul suo modo di operare. Il processo di trasformazione di un documento XML viene effettuato da un processore, che è un’applicazione (o componente software) che legge un documento XML e un documento XSLT e applica XSLT a XML. I processori esistono sia come applicazioni eseguibili dalla riga comandi, sia come componenti software che possono essere utilizzati in un’applicazione. Nel prossimo paragrafo parlerò di alcuni dei processori più diffusi e del modo in cui vengono utilizzati. Un processore consuma XML e, come tale, è costruito su un parser XML. Questo parser può caricare i documenti XML e XSLT per mezzo del DOM e quindi applicare XSLT a XML. Un’altra opzione è un processore basato su SAX. La mia discussione sulla trasformazione di XSLT a questo punto è puramente teorica e liberamente basata sull’approccio DOM. I processori effettivi molto probabilmente non seguono esattamente questo processo. Spiegazione della trasformazione XSLT Per capire l’effettivo processo di trasformazione, esaminiamo un esempio di trasformazione. I Listati 1.3 e 1.4 mostrano un esempio di documento XML e il documento XSLT da applicare ad esso. Listato 1.3 XXXXXXXXXXXXXXXXXXXXXXXXXXX <?xml version="1.0" encoding="UTF-8" ?> <pets> 002cap01.fm Page 20 Wednesday, July 10, 2002 6:06 AM 20 Giorno 1 <pet type="cat">Max</pet> <pet type="parrot" color="red">Peter</pet> </pets> ANALISI Il Listato 1.3 è un semplice documento XML che rappresenta i miei animali preferiti (pets) (in realtà non ho un pappagallo). I nomi degli animali preferiti compaiono fra i tag <pet>, che hanno un attributo type che denota il tipo di animale preferito (in questo caso, un gatto (cat) e un pappagallo (parrot)). Per il pappagallo, ho anche definito un attributo color. La Figura 1.3 mostra una rappresentazione ad albero del Listato 1.3. Nella Figura 1.3, i cerchi rappresentano elementi (tags) nel sorgente XML. Le losanghe rappresentano gli attributi (di un tag). I rettangoli rappresentano i valori dell’elemento o dell’attributo cui sono associati. Entro questo albero, i cerchi e le losanghe sono chiamati nodi. Quando quest’albero viene trasformato utilizzando XSLT, il processore parte dal nodo radice e “percorre l’albero”nella direzione indicata dalle frecce. Quando il processore trova un nodo, cerca una regola nel documento XSLT corrispondente al nome e alla posizione di quel par- root node pets element pet Max type pet Cat value Peter type Parrot color green attribute color Figura 1.3 Albero a nodi che rappresenta il Listato 1.3. red 002cap01.fm Page 21 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT 21 ticolare nodo entro l’albero. Se trova la regola, quella regola viene poi applicata a quel nodo. Ciò significa che l’esecuzione di XSLT non la una sequenza passo per passo che è comune a linguaggi come C, FORTRAN e COBOL. Questi linguaggi sono procedurali di natura e quindi seguono una successione predeterminata di comandi. I linguaggi orientati agli oggetti, come C++, Java e Visual Basic, sono basati sullo stesso modello, salvo che le sequenze fanno parte delle operazioni su oggetti. Una caratteristica che i linguaggi orientati agli oggetti aggiungono a questa è l’esecuzione guidata dagli eventi, che significa che il codice viene eseguito quando si verifica qualche evento: per esempio, quando fate clic su un pulsante. L’esecuzione di XSLT è simile all’esecuzione guidata dagli eventi. In questo tipo di esecuzione, un evento determina la sequenza in cui il codice viene eseguito. Nell’XSLT, questa sequenza è determinata dai dati che incontra. Questa è la ragione per cui XSLT è basato sull’esecuzione guidata dai dati, che significa che il codice viene eseguito quando si incontra un certo dato. Il Listato 1.4 contiene un semplice documento XSLT che potete utilizzare per trasformare l’XML del Listato 1.3. Consiste in quattro regole che determinano se il codice deve essere eseguito o meno. Listato 1.4 Esempio di documento XSLT per Pets <?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" omit-xml-declaration="yes" /> <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="pets"> <xsl:apply-templates /> </xsl:template> <xsl:template match="pet"> My <xsl:value-of select="@type" /> is called <xsl:value-of select="." />. <xsl:apply-templates select="@color" /> </xsl:template> <xsl:template match="@color"> <xsl:value-of select=".." /> is <xsl:value-of select="." />. </xsl:template> </xsl:stylesheet> 002cap01.fm Page 22 Wednesday, July 10, 2002 6:06 AM 22 Giorno 1 L’output del Listato 1.4 appare come Listato 1.5. Listato 1.5 Output quando si applica il Listato 1.4 al Listato 1.3 My cat is called Max. My parrot is called Peter. Peter is red. A meno che non sia diversamente specificato, tutti gli output sono il risultato dell’utilizzo di (Instant) Saxon versione 6.2.2. Questo programma e parecchi altri saranno trattati più avanti in questa lezione. Lo spazio bianco fra le righe di testo nel Listato 1.5 deve esserci. Sembra basato sul modo in cui XSLT tratta lo spazio bianco per default. Nel Giorno 7, “Controllo dell’output”, si imparerà come eliminare lo spazio bianco. La prima regola <xsl:template match=” /”> viene applicata quando comincia l’elaborazione, poiché corrisponde alla radice del documento. Entro questa regola, il comando <xsl:apply-templates /> dice al processore di proseguire verso un nodo o nodi figlio. In questo esempio, il nodo figlio è pets, che dice al processore di rifare la stessa cosa. Questo porta il processore su al primo nodo pet, innescando il modello appropriato, il primo dei quali effettivamente genera output. Il secondo nodo figlio viene elaborato dalla stessa regola, che procede a innescare la regola dell’attributo color. Come si può vedere, l’output è diverso per il primo e il secondo pet, perché il primo non ha un attributo color. Questa è la caratteristica essenziale di XSLT. Se non c’è un nodo (elemento o attributo), non accade nulla. Ma se c’è, la regola viene applicata. Se avete esperienza di programmazione, potreste pensare che ciò non sia molto diverso da un programma che legge l’input e opera su di esso. Tale programma, tuttavia, contiene comandi espliciti che spiegano cosa fare con un certo input. XSLT funziona nel modo opposto: i comandi sono là, ma vengono utilizzati solo quando si possono applicare. Programmare codice guidato dagli eventi può essere difficile perché non si sa in quale ordine possano presentarsi gli eventi; così, non si sa in che sequenza sarà eseguito il codice. Per contro, il modello guidato dagli eventi è molto più simile a ciò che avviene nella maggior parte delle applicazioni. Scrivere codice guidato dai dati può essere ancora più difficile, perché il codice viene eseguito in modo non deterministico, a seconda che certi dati esistano e della posizione dei dati entro l’albero del documento. Se la posizione di qualche dato è diversa, diverso è anche l’ordine di esecuzione. Il risultato, tuttavia, non deve essere necessariamente diverso. 002cap01.fm Page 23 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT 23 Comprendere la programmazione dichiarativa Finora, abbiamo visto che XSLT è un linguaggio di programmazione basato su regole. Un’altra differenza importante fra XSLT e alcuni dei linguaggi di programmazione più comuni è che XSLT è anche un linguaggio di programmazione dichiarativo. Con un linguaggio di programmazione dichiarativo, si dice al computer che cosa fare invece di come fare qualcosa. I linguaggi di programmazione dichiarativi distinguono i passi che il computer deve eseguire da ciò che si vuole che il computer faccia. Invece di programmare i passi che il computer deve eseguire, si specifica cosa si vuole che avvenga. Probabilmente il linguaggio dichiarativo più utilizzato è lo Structured Query Language (SQL). SQL specifica quali dati si vogliono ottenere da un database. Non dice al database come ottenere i dati. Questo compito è riservato al processore delle query. In modo analogo, XSLT riserva il “come” al processore. Ciò effettivamente tiene conto dei diversi modelli parser/processore. La differenza rispetto al “come” dei processori basati su DOM e SAX è grandissima, ma XSLT opera ugualmente bene su entrambi i tipi senza alcuna modifica. Analogamente, i server dei database possono implementare un immagazzinamento dati completamente diverso l’uno dall’altro. Purché possano capire SQL, il risultato è lo stesso. Come per la programmazione basata su regole, la programmazione dichiarativa richiede un po’ di tempo per familiarizzarsi. Con i linguaggi non dichiarativi, si ha un controllo effettivo su ciò che accade perché si specifica ogni passo del processo. Poiché non si specifica ogni passo in un linguaggio dichiarativo, c’è un minor controllo sul risultato (o questo è ciò che si pensa, in ogni caso). Il vantaggio della programmazione dichiarativa è che, in generale, il processo di programmazione procede più rapidamente. Quando occorre un risultato leggermente diverso dal caso generale, la programmazione richiede un impegno maggiore, perché si deve operare con un corredo diverso di strumenti. Laddove nei linguaggi tradizionali è possibile cambiare un passo dell’elaborazione, qui ci si deve accontentare di ciò che il processore offre. Bisogna trovare il modo di utilizzare gli strumenti forniti dal linguaggio. Si può paragonare la programmazione dichiarativa all’allenamento di una squadra di calcio. Come allenatore, non giocate effettivamente in una partita. Vi limitate a dire ai giocatori ciò che volete che facciano. Come lo fanno dipende da ciò che accade durante la partita. La differenza fra un computer e una squadra di calcio è che il computer farà esattamente quello che gli dite di fare, mentre una squadra non è detto che lo faccia. Tuttavia, anche se il computer fa esattamente ciò che gli dite di fare, il risultato può essere diverso da quello che vi aspettavate. Ricordate i Listati 1.3 e 1.4. Volevo solo due righe di testo; invece ho ottenuto più righe e uno spazio bianco che non avevo previsto. Per elimina- 002cap01.fm Page 24 Wednesday, July 10, 2002 6:06 AM 24 Giorno 1 re lo spazio bianco, ovviamente devo specificare ciò che voglio con maggior precisione. Creare file XSLT Prima di fare qualsiasi cosa, bisogna creare documenti XML e XSLT. Per creare entrambi, si hanno molte opzioni; le più comuni verranno trattate nei prossimi paragrafi. La maggior parte sono applicazioni Windows, ma alcune sono disponibili per altre piattaforme o sono basate su Java e potranno essere eseguite su qualsiasi piattaforma che utilizza il Java Runtime Enviroment. Utilizzare un editor di testi Si può creare un file XML con diversi strumenti. Poiché è solo testo, va bene qualsiasi editor di testi, come Blocco note, Textpad o UltraEdit. Il vantaggio di utilizzare un editor di testi è chiaramente quello di poter fare cambiamenti rapidi, perché questi programmi sono leggeri e si caricano velocemente. Inoltre, i testi sono facili da modificare. Tuttavia, l’utilizzo di un editor di testi non è l’approccio migliore per scrivere XSLT (o XML). Lo svantaggio principale è che XML e XSLT devono essere adeguatamente strutturati e che i comandi devono essere precisi. Quando si utilizza un editor di testi è facile fare errori di battitura e spesso dimenticare un tag di chiusura. Utilizzare un editor di XML Gli editor di XML si presentano in diverse forme. I più elementari offrono una visualizzazione con codifica a colori e talvolta il controllo della sintassi. Questi editor fanno spesso parte di un ambiente di sviluppo utilizzato per creare siti Web. Un buon esempio di editor di questo tipo è Allaire Homesite. A partire dalla versione 4.5.2, supporto i tag XML standard e, per le versioni precedenti, sono disponibili espansioni. Altri tipi di editor offrono un’interfaccia in è facile modificare i nodi entro un documento. Questi editor rappresentano il documento XML come una diagramma ad albero che si può manipolare. Il più semplice editor di questo tipo è XML Notepad, che è possibile scaricare gratuitamente da http://msdn.microsoft.com/xml/. Anche XML Pro version 2.01 della Vervet Logic ( http://www.vervet.com) supporta questo tipo di interfaccia e ha supporto DTD. Il terzo tipo di editor combina la modifica del codice sorgente con quello dell’albero dei nodi. Questo tipo di editor dà il vantaggio di una manipolazione dell’albero meno soggetta a errori, ma allo stesso tempo offre un maggior controllo sul codice sorgente effettivo. Quando si ha a che fare con un output più specifico, questo controllo è molto importante. Nel momento in cui scrivo, uno dei migliori editor è XML Spy (http://www.xmlspy.com), che offre molte opzio- 002cap01.fm Page 25 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT 25 ni. Con l’utile opzione di completamento automatico, è facile raccogliere elementi e attributi XSLT. Poiché il completamento automatico è sensibile al contesto, mostra solamente gli elementi o gli attributi che valgono per quella posizione in un documento. XML Spy è componibile con altri strumenti, per cui potete configurarlo con il parser che volete. Il problema della maggior parte dei normali editor XML è che non hanno il supporto XSLT incorporato. Ciò significa che non possono convalidare in modo predefinito i tag XSLT. Se supportano la convalida contro uno Schema o una DTD, potete implementare questa convalida voi stessi. Convalidare i vostri documenti XSLT è di capitale importanza se volete essere in grado di creare rapidamente questo tipo di documenti. La convalida riduce gli errori tipo tag XSLT sbagliati o attributi che non sono supportati da un tag specifico. Editor e debugger XSLT Sono attualmente disponibili alcuni editor e debugger XSLT. Queste applicazioni offrono molto di più di un’interfaccia che permetta la rapida creazione di documenti XSLT. Offrono opzioni di debugging; per esempio, permettono di eseguire una trasformazione passo per passo, dove ciascun passo indica quale regola viene innescata. Il principale vantaggio di questa capacità è che consente di vedere che cosa sta accadendo e talvolta dove si sta sbagliando. eXcelon Stylus Studio eXcelon Stylus Studio (http://www.stylusstudio.com) permette di scrivere XSLT completamente a mano, aiutati da uno strumento di completamento automatico che mostra gli elementi e attributi XSLT disponibili. Un’altra opzione è quella di scrivere il documento XSLT solo parzialmente a mano, sulla base di un file XML esistente. Dalla rappresentazione ad albero del file XML, si possono anche creare regole che dovrebbero essere applicate a quell’elemento. Con il parser incorporato, si può poi attraversare il processo di trasformazione. Altri processori possono essere associati, ma in questo caso non viene supportato il percorso passo per passo. Marrowsoft Xselerator Marrowsoft Xselerator (http://www.marrowsoft.com) non ha così tante caratteristiche come Stylus Studio, ma offre un completamento automatico sensibile al contesto. Offre solo quegli elementi XSLT che dovrebbero essere disponibili in quella parte del documento su cui state lavorando. Come Stylus Studio, fornisce processori passo per passo e incorporabili. Xselerator è molto facile da utilizzare e fornisce rapidi risultati. 002cap01.fm Page 26 Wednesday, July 10, 2002 6:06 AM 26 Giorno 1 Debugger XSL Un’alternativa interessante ai prodotti commerciali descritti nei precedenti paragrafi è il Debugger XSL, sviluppato da TopXML.com (http://www.topxml.com), un sito Web di comunità su XML. Sebbene limitato come editor, fornisce un solido debugging, che lo rende utile come strumento di sviluppo addizionale per chi sta già utilizzando un editor come XML Spy. Visual Studio.NET Visual Studio.NET in sé non fornisce alcuna capacità di debugging XSLT. Tuttavia, Visual Studio.NET è altamente inseribile, dando ai venditori terzi l’opportunità di creare qualcosa. Active State (http://www.activestate.com) ha sviluppato Visual XSLT come elemento aggiuntivo per Visual Studio.NET. Questo elemento aggiuntivo fornisce un debugging tipo XSL Debugger e la convalida dei tag. Strumenti di progettazione XSLT L’ultimo tipo di editor disponibile va alla creazione di XSLT dalla direzione opposta. Utilizzando un documento XML esistente, potete creare documenti XSLT in ambiente WYSIWYG. Utilizzare questo editor è un po’ come lavorare con un editor HTML WYSIWYG, ma con alcune funzioni aggiunte per lavorare con documenti XML. Whitehall <xsl> Composer (http://www.whitehall.com) è l’unico prodotto di questo tipo disponibile sul mercato. <xsl> Composer è straordinario perché non dovete avere alcuna conoscenza di XSLT per utilizzarlo. Tuttavia, come con tutti questi ambienti, è molto difficile ottenere esattamente ciò che si vuole. Processori per trasformazione di XML con XSLT Attualmente sono disponibili molti processori e molti altri sono in via di sviluppo. Non è necessario trattarli tutti, per cui ci limitiamo qui a parlare di quelli più conosciuti: MSXML, Saxon e Xalan. Sebbene questi processori siano gratuiti, vi consigliamo di leggere l’accordo di licenza prima di utilizzarli. Potete trovare un elenco di altri parser disponibili all’indirizzo http://www.w3.org/Style/XSL/. Un altro processore destinato a diventare popolare è il processore XSLT .NET Framework. Qui non viene trattato perché non può ancora essere chiamato dalla riga comandi. Lo cito, tuttavia, perché i test preliminari mostrano che questo processore supera tutti i processori esistenti con un notevole margine. 002cap01.fm Page 27 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT 27 MSXML MSXML è il parser/processore disponibile da Microsoft. La prima versione è stata distribuita insieme con Internet Explorer 5.0. Poiché è stata distribuita prima che la specifica XSLT fosse definitiva, questa versione non è completamente conforme. Le versioni 2.0 e 2.6 sono un passo avanti nella giusta direzione, ma sono ancora carenti in alcune aree. MSXML 3.0 e versioni successive funzionano bene e vengono spesso utilizzate dagli sviluppatori Visual Basic e Active Server Pages (ASP). L’ultima versione è disponibile all’indirizzo http://msdn.microsoft.com/xml/. MSXML è un componente, per cui non può essere eseguito come applicazione separata. Se volete utilizzarlo, dovete scrivere un’applicazione. Dover affrontare tutti questi fastidi suona piuttosto male, ma nove volte su dieci XML e XSLT verranno ad ogni modo utilizzati in un’applicazione personalizzata. Tuttavia, Microsoft ha fornito un eseguibile dalla riga comandi chiamato MSXSL, che potete anche scaricare dall’indirizzo http://msdn.microsoft.com/xml/. Installazione di MSXML e MSXSL MSXML viene offerto in un package di installazione Windows. Per installarlo, aprite il package e seguite la procedura di installazione. Poiché non ha opzioni, la vostra installazione non può che riuscire. MSXML viene fornito senza alcuna documentazione. La documentazione fa parte del MSXML Software Developers Kit (SDK), che potete scaricare da http://msdn.microsoft.com/xml. MSXML viene fornito in un file ZIP. Salvo aprire il package, non dovete fare alcuna installazione. Potete eseguirlo dalla riga comandi, ma assicuratevi che sia nella stessa directory o che sia definito un percorso alla directory che contiene l’eseguibile. Il modo più facile per assicurarvi di ciò è quello di mettere MSXSL.exe nella directory System o System32 di Windows. Il file ZIP contiene anche un documento Word che riporta tutte le opzioni della riga di comando. Esecuzione di MSXSL Per eseguire MSXSL, seguire questa procedura: 1. Aprire il prompt dei comandi di MS-DOS. 2. Passare alla directory che contiene i file XML e XSL. Si può anche specificare l’intero percorso ai file quando si chiama MSXSL. 3. Al prompt dei comandi, scrivere: msxsl source.xml stylesheet.xsl Se la sintassi dei documenti è corretta, viene visualizzato l’output. 002cap01.fm Page 28 Wednesday, July 10, 2002 6:06 AM 28 Giorno 1 Come si può vedere, la trasformazione dal prompt dei comandi è abbastanza facile. Le opzioni dalla riga comandi di MSXSL saranno trattate nell’Appendice C, “Opzioni dalla riga comandi per i parser comuni”. Saxon Saxon è un processore XSLT basato su Java che è stato sviluppato da Michael Kay. Viene distribuito con un parser SAX, ma può operare anche con altri parser SAX. Poiché funziona su Java, potrà lavorare su tutti i sistemi che hanno Java Runtime Environment installato. Per gli utenti di Windows, è anche disponibile un eseguibile che può essere eseguito dal prompt dei comandi. Per i programmatori, Saxon offre un’API che può essere utilizzata con Java. Installazione di Saxon Potete scaricare Saxon da http://users.iclway.co.uk/mhkay/saxon/ . In questo caso, potete scegliere fra due versioni: la versione completa e Instant Saxon. Dovete eseguire la versione completa sotto Java, mentre la Instant Saxon può essere eseguita dal prompt dei comandi di Windows. Entrambe richiedono che sia installato Java Runtime Environment versione 1.1 o superiori. Dopo aver aperto il package di Instant Saxon, mettetelo in una directory a vostra scelta. Quindi eseguite Instant Saxon dalla riga dei comandi, o nella stessa directory come eseguibile o da un’altra directory se avete definito il percorso all’eseguibile. Se installate la versione completa, assicuratevi che la variabile d’ambiente della classpath Java abbia un riferimento a saxon.jar. Esecuzione di Saxon Per eseguire Saxon, seguie questa procedura: 1. A seconda del sistema operativo, aprire il prompt dei comandi, una finestra di comando o la shell. 2. Se si utilizza Instant Saxon, scrivere: saxon source.xml stylesheet.xsl Se si utilizza Saxon con Java, scrivere java com.icl.saxon.StyleSheet source.xml stlesheet.xsl Se l’input è corretto, dovrebbe essere visualizzato l’output. Xalan Xalan è un processore sviluppato da Apache XML Project ( http://xml.apaLa prima versione Xalan-C++, non è più disponibile ed è stata sostitu- che.org). 002cap01.fm Page 29 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT 29 ita da Xalan-Java. Potete scaricarlo da http://xml.apache.org/xalan-j/index.html. Xalan lavora sul parser Xerces-Java. È inseribile, per cui può girare anche con altri parser. Come Saxon, Xalan offre un’API che permette di utilizzare Xalan entro le applicazioni Java. Installazione di Xalan-Java Il parser Xalan-Java viene offerto in un package ZIP o GNU-ZIP, che può essere estratto nella directory che si preferisce. Bisogna poi aggiungere un riferimento nella variabile d’ambiente classpath Java che punta a xalan.jar nella directory bin del package estratto. Esecuzione di Xalan-Java Per eseguire Xalan-Java, seguire questa procedura: 1. A seconda del sistema operativo, aprire il prompt dei comandi, una finestra di comando o la shell. 2. Dal prompt dei comandi, eseguire Xalan, scrivendo java org.apache.xalan.xslt.Process stylesheet.xsl -in source.xml -xsl Riepilogo Oggi abbiamo imparato che XSLT è un linguaggio per manipolare e trasformare i documenti XML. XSLT, che è esso stesso XML, offre un vocabolario di comandi che esegue certe funzioni su un documento XML. XSLT è stato sviluppato come parte di XSL, ma può essere utilizzato per conto suo. XSLT incorpora XPath per selezionare e filtrare elementi e attributi entro un documento XML. XML e XSLT hanno le loro origini in SGML e DSSSL, ma sono molto più semplici. Altre tecnologie sono state aggiunte alla famiglia di XML, per cui è ancora in crescita. Alcune di queste tecnologie, come i namespace XML, hanno grande influenza su XSLT. XSLT è utile in scenari di gestione di documenti in cui occorrono più output dello stesso documento. Questi documenti di destinazione possono essere di vari tipi, come per esempio testo semplice, HTML, XML e PDF. Quando il Web è l’unica destinazione, il CSS può essere una possibile alternativa. A causa dei problemi di concorrenza e di prestazione, l’XML è meno utile per l’immagazzinamento dati di livello superiore e per scenari in cui è richiesta la trasformazione dal lato server. Molti processori sono disponibili per XSLT, basati su diversi parser e su diversi tipi di parser (cioè, DOM e SAX). I parser basati su Java possono essere utilizzati nelle applicazioni Java e dalla riga di comando. Anche la Microsoft offre un par- 002cap01.fm Page 30 Wednesday, July 10, 2002 6:06 AM 30 Giorno 1 ser/processore e un componente addizionale per eseguirlo dalla riga di comando. Domani imparerete i fondamenti di XSLT e comincerete a lavorare sulla prima trasformazione. Domande e risposte D. XSLT sostituirà CSS? R. Probabilmente no. XSLT è più complesso di CSS, per cui per documenti semplici CSS è una buona soluzione che molti sanno come utilizzare. Inoltre, CSS può creare effetti che XSLT non sa creare. XSLT e CSS possono essere utilizzati insieme per creare documenti in Rich Text Format. Un problema di CSS è che opera soltanto su dati elemento. I dati immagazzinati negli attributi non possono essere visualizzati con CSS, mentre possono esserlo con XSLT. D. Sembra che XML/XSLT abbia alcuni difetti che devono essere eliminati. Perché dovrei cominciare a imparare XSLT proprio ora? R. XML/XSLT è uno dei campi della tecnologia a più rapido sviluppo in questo momento, con il supporto della maggior parte delle principali aziende. Molti dei problemi sono noti e sotto esame. Al più presto si cercherà di risolverli. Un buon esempio è rappresentato dai debugger XSLT. Fino a poco tempo fa, non era disponibile alcun debugger XSLT e non molti avevano un’idea di come crearne uno, perché XSLT opera in modo diverso dai linguaggi come Visual Basic. Ora sono invece disponibili molti buoni prodotti. Quando cominciate a operare con XSLT, anche voi vedrete che può risolvere problemi che ora richiedono un grande sforzo. XSLT, in questo senso, è solo un altro strumento a vostra disposizione. Aree in cui XSLT sarà molto utile sono le applicazioni orientate verso più piattaforme, applicazioni in più linguaggi, conversione fra diversi formati di immagazzinamento dati e applicazioni che lavorano con dati relativamente non strutturati che richiedono di essere consultati. Esercizi Questi esercizi vi permetteranno di mettere alla prova i concetti appresi in questa lezione. Vi sarà utile conoscere e capire le risposte prima di iniziare la prossima lezione. Potete trovare le risposte al quiz e agli esercizi nell’Appendice A. 002cap01.fm Page 31 Wednesday, July 10, 2002 6:06 AM Introduzione all’XSLT Quiz 1. Vero o falso: XSLT può trasformare XML in XML, HTML e diversi formati di file basati su testo. 2. Vero o falso: dovete utilizzare xsl come namespace per XSLT. 3. Cosa vi serve per eseguire XSLT? 4. XSLT è basato su un modello di programmazione guidato dai dati. Cosa vuol dire? 5. XSLT è un linguaggio di programmazione dichiarativo. Qual è la differenza fra linguaggi dichiarativi e linguaggi come C, Java e Visual Basic? 6. Quale tipo di strumenti potete utilizzare per creare documenti XSLT? Esercizio 1. Create un documento XML con il seguente codice: <?xml version="1.0" encoding="UTF-8" ?> <pets> <pet type="cat">Max</pet> <pet type="parrot" color="red">Peter</pet> </pets> Adesso create un documento XSLT col seguente codice: <?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8" omit-xml-declaration="yes" /> <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="pets"> <xsl:apply-templates /> </xsl:template> <xsl:template match="pet"> My <xsl:value-of select="@type" /> is called <xsl:value-of select="." />. <xsl:apply-templates select="@color" /> </xsl:template> <xsl:template match="@color"> <xsl:value-of select=".." /> is <xsl:value-of select="." />. 31 002cap01.fm Page 32 Wednesday, July 10, 2002 6:06 AM 32 Giorno 1 </xsl:template> </xsl:stylesheet> Eseguire i file utilizzando qualcuno dei processori trattati oggi. Se utilizzate due diversi processori, l’output sarà il medesimo?