INVITO ALLO STUDIO - ITIS "Luigi di Savoia"
Transcript
INVITO ALLO STUDIO - ITIS "Luigi di Savoia"
XML INVITO ALLO STUDIO EUROPEAN NETWORK OF INNOVATIVE SCHOOLS CSS e XML Per formatare i documenti XML è possibile seguire due strade: 1)ricorrere a CSS; 2) ricorrere a XSL. Nelle prossime slides vedremo brevemente come utilizzare CSS per agire esternamente al documento XML e predisporre una specifica formattazione per ogni suo elemento. Quando non c’è bisogno della potenza elaborativa di XSL, l’utilizzo di CSS può rilevarsi una soluzione ottimale, specialmente perché più gestibile dal pubblico meno esperto. Senza entrare nei dettagli della sintassi del linguaggio CSS vediamo subito praticamente come può avvenire l’interazione fra XML e CSS. Il seguente esempio è relativo a un documento XML che descrive la struttura dei nuovi articoli pronti per la vendita in un negozio di informatica. <?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/css" href="catalogo.css"?> <database nome="Negozio" server="http://www.mioserver.it"> <articoli descrizione="articoli venduti" numero="20"/> <clienti descrizione="nuovilienti" numero="3"/> <nuoviarticoli> <articolo> <codice>C099</codice> <codcat tipo="C" /> <descrizione>CPUDoppiaVentola</descrizione> <prezzo>200</prezzo> <quantita>12</quantita> </articolo> <articolo> <codice>BO1 1</codice> <codcat tipo="S" /> <descrizione>ScheaVideo4500plus</descrizione> <prezzo> 150</prezzo> <quantita>9</quantita> </articolo> </nuoviarticoli> </database> catalogo.xml Osserviamo in particolare la seconda riga, che indica il tipo di documento di stile che si vuole utilizzare e il suo URL mediante l’elemento xml-stylesheet, avente la seguente sintassi: <?xml-stylesheet type=”TipoDocumentoStyle”href=”URLDocumentoDiStyle”?> dove l’attributo type può essere: text/css per indicare un documento CSS oppure text/xsl per indicare un documento xsl, mentre l’attributo href riporta l’URL di tale documento di stile. Il file CSS catalogo.css utilizzato per la presentazione del documento XML del nostro esempio ha il seguente contenuto: nuoviarticoli {background-color: #ffffff; width: 100 % ;} Articolo {display: block; margin-bottom: 3Opt; margin-left: 0;} codice {color: #FF0000; font-size: 2Opt;} descrizione {color: #0000FF; font-size: 2Opt; } prezzo,quantita {display: block;color: #000000;margin-left: 2Opt;} catalogo.css Sintassi CSS La sintassi di CSS è composta da tre parti: •Un selettore (tipicamente il tag XML da formattare) •Una proprietà (un attributo da cambiare) •Un Valore (valore ammissibile per la proprietà) selector {property: value} La proprietà e il valore sono divise da i “due punti” e dentro le parentesi graffe. body {color: black} Se il valore è un parola con spazi va messo tra virgolette. p {font-family: "sans serif"} XSL(T) L’utilizzo diretto del linguaggio HTML è certamente un modo efficace per formattare , ma esiste un’alternativa. Il consorzio W3C ha creato infatti il linguaggio XSL (eXtensible Stylesheet Language) ossia un linguaggio che consente di scandire un documento XML e trasformarlo in un altro documento con un diverso formato. Per esempio, è possibile partire da un documento XML per ottenerne uno di Microsoft Word, uno in formato PDF, oppure un documento HTML e via dicendo. Il nome attribuito a XSL deriva dal fatto che tale linguaggio si basa su un meccanismo di fogli di stile. I fogli di stile vengono generalmente usati per applicare in modo coerente stili o formattazione ai documenti. Il tipo di foglio di stile più utilizzato sul Web è basato sulla specifica dei fogli di stile CSS. Tramite CSS è possibile definire classi di stile che possono essere applicate al documento XML concentrandosi sul suo aspetto grafico. L’XSL, per contro, offre un livello di formattazione e di flessibilità superiore rispetto ai fogli di stile CSS; gode poi di molte altre caratteristiche, in quanto sfrutta una metodologia diversa rispetto al CSS. L’XSL, infatti, si basa su modelli (template), che sono per alcuni aspetti analoghi alle regole dei fogli di stile; con essi si dispone di un meccanismo per l’applicazione di informazioni di formattazione ai dati che rispondono, appunto, a un particolare modello. Il linguaggio XSL è costituito da tre componenti: 1)XSLT (XML Transformations), un linguaggio per trasformare un documento XML in un altro documento XML; 2) XPath (XML Path Language), un linguaggio per espressioni usato da XSLT per accedere o riferirsi a parti di un documento; 3) XSLFO (XML Formatting Object), un linguaggio di formattazione per aspetti tipica-mente tipografici. Noi ci occuperemo solo di XSLT e XPath, tralasciando il linguaggio XSLFO perché ciò esula dagli scopi di questo corso. XSLT XSLT converte un documento XML da una struttura semantica a una struttura di visualizzazione ciò che accade per esempio nella conversione di un documento XML in documento HTML, oppure in uno di Microsoft Word ecc. XSLT può inoltre trasformare un documento XML in un altro documento XML, dimostrando una notevole flessibilità nella creazione di nuovi formati per uno stesso documento. Funzionamento di XSLT XSLT scandisce un documento XML vedendolo come una struttura ad albero, ossia una struttura di tipo ricorsivo, composta da sottoalberi che sono a loro volta degli alberi. La struttura ad albero di un documento XML viene analizzata livello per livello sfruttando proprio tale natura ricorsiva. XSLT permette di definire un insieme di regole che devono essere applicate a un insieme di nodi: nessuno, uno o più di un nodo. Funzionamento di XSLT (segue) Quando XSLT analizza il nodo corrente dell’albero, verifica se esiste una regola riferita a un insieme di nodi che può essere applicata al nodo corrente. L’abbinamento regolanodo corrente prende il nome di matching. Se XSLT trova un matching, applica la regola al nodo corrente e ai suoi figli. La regola incorpora la trasformazione che deve essere eseguita, indica cioè in cosa deve essere trasformato il nodo corrente e come bisogna elaborarne i figli. Consideriamo ora la struttura ad albero relativa al nostro esempio, catalogo.xml (vedi figura seguente). catalogo.xml Applicare trasformazioni ai nodi Le regole che si applicano per effettuare la trasformazione sui nodi di un documento XML sono contenute in un foglio di stile. Un foglio di stile è un documento XML come molti altri ma, a differenza dei documenti XML “normali” che contengono le informazioni da visualizzare, contiene un vero e proprio programma scritto in XSLT, che indica come trasformare il documento XML cui si riferisce. Applicare trasformazioni ai nodi (segue) In effetti, l’espressione “foglio di stile” impiegata in XSLT è leggermente diversa da quella utilizzata per CSS. Un foglio di stile per XSLT crea un output che potrebbe o meno contenere informazioni di formattazione. L’output potrebbe infatti contenere solo un sottoinsieme dei dati presenti nel documento XML, dati che potrebbero essere ristrutturati, riordinati ecc. Pertanto, un foglio di stile per XSLT è un documento che trasforma un documento XML in un altro documento XML, che può anche essere un documento HTML o testo. I PROCESSORI XSLT Abbiamo detto che XSLT trasforma un documento XML in un altro documento XML. Questa trasformazione non è necessariamente legata al browser, nel senso che occorre semplicemente un processore XSLT, cioè un software che interpreti il documento XSLT e sappia come applicare le regole di trasformazione al documento XML avuto in input per generarne un altro. I PROCESSORI XSLT (segue) Esistono varie tipologie di processori: un processore può essere un’applicazione eseguibile, un plug-in, un ambiente di sviluppo ecc. In ogni caso, esso viene costruito con un parser XML capace di caricare documenti XML e XSLT per mezzo di strutture quali DOM e SAX. Alcuni noti processori XSLT sono: . Saxon, sviluppato da Michael Kay; . Xalan, facente parte del progetto Apache; . MSXML, sviluppato da Microsoft. Tali processori sono incorporati nei browser recenti; ad esempio, com’è ovvio, Mi- crosoft Internet Explorer utilizza il processore MSXML. I FOGLI DI STILE Un foglio di stile è contenuto tra il tag di apertura <xsl:stylesheet> e quello di chiusura, </xsl:stylesheet>; al suo interno contiene dichiarazioni XSLT: <xsl: stylesheet xmlns :xsl= ” http://wwww3.org/1999/XSL/Trasform” version= ” 1 .0”> DichiarazioniXSLT </xsl: stylesheet> I FOGLI DI STILE (SEGUE) xmlns :xsl= ” http://wwww3.org/1999/XSL/Trasform : serve per definire lo spazio dei nomi. La definizione spazio dei nomi è utilizzata dal programmatore tradizionale per indicare un gruppo di nomi in cui non esistono duplicati. Poiché la natura del linguaggio XML consente di definire set di tag personalizzati, che potrebbero dar luogo a nomi duplicati nei documenti XML, nel linguaggio XML gli spazi dei nomi offrono una metodologia per la creazione di nomi univoci in un documento XML. Nel linguaggio XML uno spazio dei nomi è pertanto una raccolta di nomi identificata da un URL. version= ”1 .0” : indica invece il numero di versione che serve a distinguere un foglio di stile che usa un determinato standard da eventuali revisioni future. Template(sagoma) •Il processore scorre i nodi di cui è composto il documento XML •Quando un albero (nodo o insieme di nodi) combacia (match) con il modello (pattern) di una regola di template (sagoma) viene applicata la trasformazione specificata <xsl:template match=“modello"> … trasformazione … </xsl:template> sagoma = modello trasformazione L’ELEMENTO TEMPLATE Per definire regole di comportamento all’interno di un foglio dì stile utilizziamo l’elemento template. Nella terminologia informatica spesso i termini Pattern e Template si confondono e vengono tradotti con l’italiano “Modello” Nel seguito useremo i termini modelli e template come sinonimi. Un elemento template è caratterizzato dalla seguente sintassi: <xsl:template Attributi> Contenuto </xsl:template> Un template opera mettendo in corrispondenza l’elemento o attributo corrente che il processore trova analizzando il sorgente XML con la regola corrispondente del modello XSLT. Se una regola del modello XSLT corrisponde all’elemento corrente XML, l’elemento sarà trasformato in base a al contenuto del template. <xsl:template Attributi> Contenuto </xsl:template> La corrispondenza tra elementi XML e regole XSLT è definita tramite l’attributo match. Si dice anche che l’attributo match specifica il pattern che indica il sottoalbero cui va applicata la regola. L’attributo match può selezionare sia un solo elemento, sia più elementi. Facciamo un semplice esempio: <?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/xsl" href="catalogo.xsl"?> <database nome="Negozio" server="http://www.mioserver.it"> <articoli descrizione="articoli venduti" numero="20"/> <clienti descrizione="nuovilienti" numero="3"/> <nuoviarticoli> <articolo> <codice>C099</codice> <codcat tipo="C" /> <descrizione>CPUDoppiaVentola</descrizione> <prezzo>200</prezzo> <quantita>12</quantita> </articolo> <articolo> <codice>BO1 1</codice> <codcat tipo="S" /> <descrizione>ScheaVideo4500plus</descrizione> <prezzo> 150</prezzo> <quantita>9</quantita> </articolo> </nuoviarticoli> </database> catalogo1.xml Come possiamo notare, la seconda dichiarazione, analoga a quella vista per i fogli di stile CSS, indica il nome del file esterno che contiene il foglio di stile XSL da applicare a questo documento XML. I due elementi XML articoli e clienti contengono informazioni sulle vendite che vogliamo estrapolare e visualizzare in HTML. Vediamo ora il file catalogo1.xsl contenente il foglio di stile. <?xml version= “1.0”?> <xsl: stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” version=”l.0”> <xsl: output method=”text” encoding=”UTF-8”/> <xsl: template match=”articoli”> Visualizzazione degli <xsl: value-of select=”@descrizione”/> - numero <xsl: value-of select=”@numero”/> </xsl:template> <xsl: template match=”clienti”> Visualizzazione dei <xsl: value-of select=”@descrizione”/> - numero <xsl: value-of select=”@numero”/> </xsl:template> </xsl: stylesheet> catalogo1.xsl Dal codice del file catalogo.xsl possiamo fare le seguenti osservazioni. •Anche questo è un documento XML, lo si capisce dalla prima dichiarazione che è un elemento XML prologo: <?xml version= “1.0”?> •All’interno dell’elemento XSL slylesheet abbiamo due template che selezionano i nodi elemento, articoli e clienti: <xsl:template match=“articoli”> pattern <xsl:template match=“clienti”> La prima di queste due regole viene applicata quando si incontra il nodo articoli, la seconda successivamente, quando si incontra il nodo clienti. •Il contenuto di un template può essere composto da testo e altri elementi xsl. Il primo elemento xsl del nostro semplice esempio è xsl:output e specifica, tramite il suo attributo method, di che tipo deve essere l’output per la visualizzazione. Il valore di method con la seguente dichiarazione: <xsl: output method=”html”/> Ci permette di utilizzare nel documento XSLT anche elementi propri di HTML, come l’elemento <BR>, che va però scritto come <BR/> Il secondo e il terzo elemento XSL è xsl:value-of, che serve a produrre un output calcolato. Nel caso dell’esempio, il valore da produrre in output è quello specificato tramite l’attributo select. Tale attributo indica di prelevare le informazioni relative agli attributi XML “descrizione” e “numero”. Per selezionare tali attributi, si utilizzano le espressioni XPath (@descrizione e @numero) come valori di select Un valore spesso utilizzato all’interno della select è “.“, che significa valore del nodo corrente. Il valore del nodo corrente è uguale al testo del nodo se il nodo è di tipo testo, è uguale alla concatenazione dei valori dei nodi contenuti se il nodo è di tipo tag (cioè senza testo interno). Elaborazione iterativa: l’elemento xsl:for-each Il costrutto per l’elaborazione iterativa è implementato attraverso l’elemento xsl:foreach. Tale elemento serve per applicare lo stesso template nel quale è contenuto agli elementi selezionati tramite l’attributo select. Applichiamo al nostro catalogo il seguente foglio XSL: <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html"/> <xsl:template match="articoli"> Visualizzazione degli <xsl:value-of select="@descrizione" /> -numero <xsl:value-of select="@numero" /> <BR/> </xsl:template> <xsl:template match="clienti"> Visualizzazione dei <xsl:value-of select="@descrizione" /> -numero <xsl:value-of select="@numero"/> <BR/> </xsl:template> segue <xsl:template match="nuoviarticoli"> <HTML> <BODY> Visualizzazione dei nuovi articoli <BR/> <TABLE BORDER="2"> <TR> <TD>Codice</TD> <TD>Descrizione</TD><TD>Prezzo</TD><TD>Quantita</TD> </TR> <xsl:for-each select="articolo"> <TR> <TD><xsl:value-of select="codice"/></TD> <TD><xsl:value-of select="descrizione"/></TD> <TD><xsl:value-of select="prezzo" /></TD> <TD><xsl:value-of select="quantita" /></TD> </TR> </xsl:for-each> </TABLE> </BODY> </HTML> </xsl:template> </xsl:stylesheet> cataogo2.xml Eseguire Calcoli E’ possibile anche eseguire calcoli inserendo vere e proprie espressioni come valori di una select <?xml version="1.0" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="html" encoding="UTF-8"/> <xsl:template match="nuoviarticoli"> <xsl:for-each select="articolo"><br/> <xsl:value-of select="prezzo*quantita"/> </xsl:for-each> </xsl:template> </xsl:stylesheet> catalogo3.xml Elaborazione dichiarativa XSLT è un linguaggio di dichiarazioni basato su regole. Questo modo di procedere rende XSL un linguaggio di dichiarazioni, in contrapposizione ai linguaggi basati sulle procedure. I linguaggi di programmazione dichiarativi (come Prolog o SQL) 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 cioè cosa si vuole che avvenga.