Prefazione. Piersalvo Ortu 1
|
|
|
- Saverio Berardi
- 10 anni fa
- Visualizzazioni
Transcript
1 Prefazione Questa tesi ha come obiettivo principale descrivere in che modo i documenti XML possano essere utilizzati per essere visualizzati su diversi apparati, dai browser Web ai dispositivi cellulari, che verranno presi in considerazione nei capitoli 6 e 7. Il primo capitolo tratta il linguaggio XML in generale, e può essere considerato come diviso in due parti. Nella prima parte viene fatta una breve introduzione al linguaggio XML cercando di capire i motivi che hanno portato alla creazione di questo nuovo linguaggio. Vengono esaminate le caratteristiche principali e le differenze tra il linguaggio XML e il suo progenitore SGML, e inoltre viene fatto anche un confronto con il ben noto linguaggio Web, HTML, evidenziando i pregi e i difetti di quest ultimo e le differenze con XML. Nella seconda parte del primo capitolo si tratta il linguaggio XML vero e proprio, facendo riferimento alle caratteristiche proprie del linguaggio e agli elementi della sintassi di cui esso è costituito (ad esempio: tag, namespace, elementi e attributi ecc). Nel secondo capitolo vengono trattate le DTD, cercando di evidenziare le caratteristiche principali e i vari tipi di DTD, attraverso degli esempi. Nel terzo capitolo vengono esaminate le caratteristiche salienti degli Schemi attraverso sempre degli esempi, sia per quanto riguarda la loro struttura e la sintassi. Viene fatto inoltre un confronto tra questi ultimi e le DTD, evidenziandone le principali differenze. Nel quarto capitolo vengono presi in considerazione i fogli di stile, spiegando che cosa sono e la loro principale funzione. Vengono esaminati i due tipi di fogli di stile più usati, i CSS e quelli XSL, spiegandone le differenze principali. Infine vengono trattate le trasformazioni XSLT, che consentono di convertire un documento XML in un altro tipo di documento, ad esempio in HTML. All interno della parte che tratta le trasformazioni, viene preso in esame il linguaggio XPath a cui il linguaggio XSL si appoggia, e grazie al quale è possibile, all interno del foglio di stile, recuperare le parti del documento XML che interessano. Alla fine del capitolo, viene presentata una tabella che elenca gli elementi della sintassi più utilizzati nel linguaggio XSL, viene spiegato come collegare un foglio di stile ad un documento XML e infine vengono trattati i modelli utilizzati nei fogli di stile definiti dagli elementi xsl:template. Piersalvo Ortu 1
2 PREFAZIONE Nel quinto capitolo viene fatta una panoramica dei software attualmente utilizzati in ambito XML, per quanto riguarda la progettazione e la convalida dei documenti. Per primi vengono trattati i tool di editing utilizzati per creare i vari tipi di documenti, da quelli XML, alle DTD, agli Schemi e ai fogli di stile. In particolare viene esaminato il tool di editing XML Spy, che verrà utilizzato per costruire gli esempi presentati nei vari capitoli. Successivamente si parla di analizzatori convalidanti e non convalidanti, esaminando le differenze di entrambi e le funzioni che essi svolgono. Vengono poi trattati gli elaboratori XSLT, con particolare riguardo all elaboratore MSXML della Microsoft e alla sua utility MSXSL, che consente di effettuare le trasformazioni da XML ad HTML, tramite linea di comando. Gli ultimi due capitoli, il sesto e il settimo, sono i più interessanti. Nel sesto vengono messi in pratica i concetti enunciati nei capitoli precedenti, con lo sviluppo di un applicazione XML reale, che consiste nella progettazione di un libretto universitario virtuale, al quale ciascun studente può accedervi per controllare i propri esami. Il progetto inizia con la creazione del documento XML, che viene effettuata in modo automatico a partire dai dati degli studenti contenuti in un database. Vengono presentate anche le DTD e gli Schemi corrispondenti, così da mostrarne le differenze e infine arriva la parte più interessante, che riguarda l applicazione dei fogli di stile ai documenti XML e le trasformazioni XSLT Lato-Server, che consentono di trasformare il documento XML in HTML, in maniera tale da poter visualizzare le informazioni su Internet Explorer 5-6 o Netscape 7. Nel settimo capitolo, invece, viene progettata ed analizzata la stessa applicazione, per poterla rendere disponibile dai dispositivi cellulari che utilizzano la tecnologia WAP (Wireless Application Protocol). Viene innanzitutto fatta una breve panoramica sul linguaggio WML (Wireless Markup Language) e su come funziona il protocollo WAP, spiegando le differenze di comunicazione client-server in un applicazione Web e in un applicazione Wireless. Vengono poi elencati alcuni dei tool più utilizzati per le applicazioni Wireless e infine arriva la parte più importante nella quale è descritta l applicazione del libretto WAP, e nella quale vengono trattate anche le trasformazioni da XML a WML. Piersalvo Ortu 2
3 CAPITOLO 1 IL LINGUAGGIO XML 1.1CENNI SU XML XML è oggi considerato come il linguaggio del futuro nelle applicazioni web e non solo, in quanto può essere utilizzato per definire documenti di qualsiasi tipo e formato. Il linguaggio per eccellenza, che è considerato la base dell World Wide Web è HTML (Hypertext Markup Language), il quale consente di creare pagine di informazione formattate in grado di raggiungere tramite internet un numero di utenti in continuo aumento. Lo scopo principale per cui è stato realizzato HTML è la visualizzazione contenuti testuali e grafici e per questo motivo esso prende in considerazione soprattutto il modo in cui le informazioni vengono presentate agli utenti sulla rete e non il tipo e la struttura di tali informazioni. Proprio per questo motivo è stato sviluppato, da parte di un gruppo di lavoro coordinato dal W3C, (Web Consortium), il linguaggio XML, (Extensible Markup Language). XML è un linguaggio di markup aperto e basato su testo, che fornisce informazioni di tipo strutturale (o sintattico) e semantico relative ai dati veri e propri. È un metalinguaggio, che permette a gruppi di persone o ad organizzazioni di creare dei linguaggi personalizzati di markup specifici per i tipi di informazione che devono trattare. Per molte applicazioni infatti gli esperti hanno già creato linguaggi di markup specifici come ad esempio il Channel Definition Format, (CDF), il Mathematical Markup Language, (MML), utilizzato per definire espressioni matematiche, il Chemical Markup Language, (CML), usato per definire formule chimiche, e molti altri. XML nasce dall esigenza di portare nel Web lo Standard Generalized Markup Language (SGML), il linguaggio internazionale per la descrizione della struttura e del contenuto dei documenti elettronici di qualsiasi tipo, non contiene però tutte le funzioni complesse che SGML possiede. Per questo XML si caratterizza per la semplicità con cui è possibile scrivere documenti. L utilizzo di XML permette di superare il grosso limite attuale del Web che risiede nelle limitazioni del linguaggio HTML, cioè la dipendenza da un tipo di documento HTML, singolo e non estensibile, quindi dipendente dal tipo di visualizzatore utilizzato. Infatti se ci poniamo il problema di visualizzare i vari tipi di documenti esistenti per il Web, ci accorgiamo che ne esistono numerosissimi dai formati più svariati, ad esempio i documenti Word o quelli HTML, dei quali inoltre ne esistono varie versioni. Piersalvo Ortu 3
4 CAPITOLO 1- IL LINGUAGGIO XML Pensare di tradurre tutti questi possibili formati che chiamiamo (di origine) in tutti i possibili formati di destinazione è impensabile. La strada da percorrere è di avere un unico formato di origine, al quale applicare dei metodi standard semplici ed efficaci per la traduzione nei corrispondenti formati di destinazione. Come primo approccio si potrebbe pensare di usare come formato standard HTML, ma non va bene, in quanto se pur ricco di funzioni non ha attualmente la caratteristica di un formato universale; per esempio non è in grado di esprimere la complessità dei documenti Word e non prevede molte possibilità, tra le quali per esempio la scrittura di spartiti musicali o le formule chimiche. È inoltre uno standard di tipo proprietario infatti la sua sintassi contiene tag predefiniti e non è possibile quindi descrivere tag personalizzati. Come secondo approccio si può pensare di usare come formato per esprimere i nostri documenti origine SGML, che in realtà è nato come formato standard e neutrale per esprimere vari tipi di documento, ma neppure quest ultimo ha avuto grande successo. Nei prossimi due paragrafi verranno spiegate le ragioni per le quali sia HTML che SGML non possono essere utilizzati come linguaggi universali di markup, i loro limiti, i pregi e i difetti e le relazioni con XML. 1.2 RELAZIONE TRA SGML E XML SGML è quindi un meta-formato, ovvero un formato utilizzato per definire altri linguaggi, con il quale si può anche descrivere un formato per le formule chimiche, per le partiture musicali o per ipertesti. Il difetto di questo linguaggio, per il quale non ha suscitato particolare interesse tra gli sviluppatori Web è di essere un linguaggio abbastanza complesso e di difficile utilizzo. Come anticipato precedentemente XML contiene una piccola parte delle funzioni complesse di SGML, le caratteristiche opzionali che appesantivano il linguaggio sono state eliminate. Caratteristica ereditata da SGML è la capacità di definire con estrema facilità nuovi marcatori, detti anche (tag), permettendo così di creare linguaggi di markup personalizzati e quindi non proprietari. Tra i pregi di SGML vi è la flessibilità, in quanto è un linguaggio che può essere applicato ad ogni tipo di dato, è espandibile e fortemente strutturato come il linguaggio XML, caratteristica ereditata proprio da SGML. Inoltre è non-proprietario, in quanto chiunque può crearsi un proprio linguaggio di markup, al contrario di HTML, ed è indipendente dalla piattaforma. Piersalvo Ortu 4
5 CAPITOLO 1- IL LINGUAGGIO XML Tra i limiti di SGML, abbiamo una struttura molto pesante, comprensiva di un gran numero di opzioni che lo rendono poco maneggevole da un eventuale software di manipolazione dei dati, quindi può rappresentare un grosso scoglio per i programmatori che lavorano sul Web. Comunque sia, il problema più importante è che SGML richiede una DTD, (Document Type Definition), del quale si tratterà più avanti, per l'identificazione di tutte le relazioni tra le entità che compongono il documento SGML, e di uno Stylesheet cioè un foglio di stile che stabilisce il modo di rappresentare e/o visualizzare i dati e le strutture definite nella DTD. Inoltre ogni documento SGML deve necessariamente essere validato e quindi oltre ad un controllo sintattico viene controllata anche la semantica delle strutture di dati presenti nel documento, (ad esempio non potrà succedere che un titolo di capitolo venga dopo il relativo sottotitolo). Si capisce quindi che in mancanza di uno di questi elementi, o in caso di corruzione dei dati, le istanze SGML saranno visualizzate come codice incomprensibile per l'utente finale. Il risultato di queste considerazioni è che per le applicazioni sul World Wide Web (WWW) le istanze SGML non sono praticamente portabili data la loro intrinseca pesantezza e non robustezza. 1.3 RELAZIONE TRA HTML E XML XML è spesso considerato una sostituzione di HTML. Sebbene questo possa essere in parte vero, in realtà i due linguaggi sono complementari e operano su livelli differenti: infatti nei casi in cui XML viene utilizzato per strutturare e descrivere i dati sul Web, HTML è usato per formattare i dati. La semplicità è una delle caratteristiche salienti di HTML. I documenti HTML non devono essere convalidati ma è sufficiente che siano ben formati, ovvero sintatticamente corretti. Il modo in cui viene visualizzato il documento dipende dallo Style Sheet del browser stesso. I limiti di HTML discendono proprio dai suoi pregi. Dal momento che non è richiesta una struttura semanticamente corretta delle informazioni, HTML diventa molto povero per le applicazioni di elaborazione dei dati, quindi il problema viene demandato agli applicativi scritti in Java, Java script ecc. La sua struttura non è estensibile e questo lo rende praticamente inutilizzabile per le industrie che si sono viste costrette a crearsi standard differenti per ogni diversa applicazione, ed ancora una volta è compito del software elaborare i dati per il trasferimento delle informazioni sul Web. Un altro problema da non sottovalutare si può verificare dalla parte del client, qualora non abbia un dispositivo video del tipo previsto dal server, (per esempio dispositivi per il braille o monitor non grafici). Inoltre HTML non offre i meccanismi per mantenere il controllo della formattazione. Piersalvo Ortu 5
6 CAPITOLO 1- IL LINGUAGGIO XML Infatti non si possono specificare le dimensioni video di un documento o controllare le dimensioni della finestra di un browser. Per superare questo problema sono stati inseriti nuovi tag e i fogli di stile; i nuovi tag forniscono istruzioni di formattazione come ad esempio il tag <FONT> per specificare il tipo di carattere; inoltre questi tag sono di formattazione e non di descrizione (come dovrebbero essere, essendo HTML un linguaggio di descrizione del documento). Tutto questo fa sì che uno sviluppatore di pagine Web non sappia mai con certezza cosa un client visualizzerà sullo schermo del computer. Il W3C (ente guida per lo sviluppo del Web) si rese conto che la creazione di un numero di tag diversi per ogni tipo di formattazione era irrealistica, per cui vennero introdotti i CSS (Cascading Style Sheet), che permettono attraverso delle regole di stile di definire come determinati elementi di un documento devono apparire. Anche i CSS però contengono una serie di proprietà predefinite. Il risultato di tutto questo è che allo stato attuale molte pagine Web, che contengono tag predefiniti e specifici per determinati browser, sono spesso illeggibili. Gradualmente HTML sta passando da un linguaggio di descrizione ad un linguaggio di presentazione. A differenza di quest ultimo, XML fornisce già una soluzione in quanto fornisce un layout a chiunque e indipendentemente dal browser che si utilizza, attraverso l uso di XSL, (Extensible Style Language), che determina il modo in cui il documento dovrà essere presentato all utente. Quindi possiamo dire che XML si differenzia da HTML per tre maggiori aspetti: Possono essere definiti nuovi tag e attributi. La struttura di un documento può essere vista in modo gerarchico annidando i tag a qualsiasi livello di complessità. Ogni documento XML può contenere una opzionale descrizione della sua grammatica, in modo che possa essere utilizzata da applicazioni che richiedono una validazione della struttura del documento. 1.4 OBIETTIVI PROGETTUALI DI XML La progettazione di XML venne eseguita esaminando i punti di forza e di debolezza di SGML. Da ciò ne derivano le caratteristiche intrinseche di XML: 1. XML deve essere utilizzabile in modo semplice su Internet: in primo luogo, XML deve operare in maniera efficiente su Internet e soddisfare le esigenze delle applicazioni eseguite in un ambiente di rete distribuito. Piersalvo Ortu 6
7 CAPITOLO 1- IL LINGUAGGIO XML 2. XML deve supportare un gran numero di applicazioni: deve essere possibile utilizzare XML con un ampia gamma di applicazioni, tra cui strumenti di creazione, motori per la visualizzazione di contenuti, strumenti di traduzione e applicazioni di database. 3. XML deve essere compatibile con SGML: questo obiettivo è stato definito sulla base del presupposto che un documento XML valido debba anche essere un documento SGML valido, in modo tale che gli strumenti SGML esistenti possano essere utilizzati con XML e siano in grado di analizzare il codice XML. 4. Deve essere facile lo sviluppo di programmi che elaborino documenti XML: l adozione del linguaggio dipende dalla disponibilità di strumenti e la proliferazione di questi è la dimostrazione che questo obiettivo è stato raggiunto. 5. Il numero di caratteristiche opzionali deve essere mantenuto al minimo possibile: al contrario di SGML, XML elimina le opzioni, in tal modo qualsiasi elaboratore potrà pertanto analizzare qualunque documento XML, indipendentemente dai dati e dalla struttura contenuti nel documento. 6. I documenti XML dovrebbero essere leggibili da un utente e ragionevolmente chiari: poiché utilizza il testo normale per descrivere i dati e le relazioni tra i dati, XML è più semplice da utilizzare e da leggere del formato binario che esegue la stessa operazione; quindi è necessario che XML sia facilmente leggibile da parte sia degli utenti che dei computer. 7. La progettazione di XML dovrebbe essere rapida: XML è stato sviluppato per soddisfare l esigenza di un linguaggio estensibile per il Web. Questo obiettivo è stato definito dopo aver considerato l eventualità che se XML non fosse stato reso disponibile rapidamente come metodo per estendere HTML, altre organizzazioni avrebbero potuto provvedere a fornire una soluzione proprietaria, binaria o entrambe. 8. La progettazione di XML deve essere formale e concisa: questo obiettivo deriva dall esigenza di rendere il linguaggio il più possibile conciso, formalizzando la formulazione della specifica. 9. I documenti XML devono essere facili da creare: i documenti XML possono essere creati facendo ricorso a strumenti di semplice utilizzo, quali editor di testo normale. 10. Non è di nessuna importanza l economicità nel markup XML: in SGML e in HTML la presenza di un tag di apertura è sufficiente per segnalare che l elemento precedente deve essere chiuso. Benché così sia possibile ridurre il lavoro degli autori, questa soluzione potrebbe essere fonte di confusione per i lettori, in XML la chiarezza ha in ogni caso la precedenza sulla concisione. Piersalvo Ortu 7
8 CAPITOLO 1- IL LINGUAGGIO XML 1.5 PROPRIETÀ DI XML XML è importante in due classi di applicazioni Web: la creazione di documenti e lo scambio dei dati; inoltre i server Web attualmente utilizzati richiedono, per essere in grado di servire documenti XML, minime modifiche di configurazione. La sintassi di XML è molto simile a quella di HTML, ma molto più rigida; anche se questo fatto può sembrare a primo avviso un aspetto negativo, (soprattutto per chi deve scrivere documenti XML), è stata volutamente introdotta dal gruppo di lavoro del W3C, per facilitare lo sviluppo di applicazioni basate su XML e aumentarne le prestazioni. Inoltre una sintassi chiara e pulita aumenta la leggibilità del documento, che unita alla possibilità di creare un proprio set di markup, contribuirà a rendere un file XML più leggibile quanto un file di solo testo. XML non è limitato a un insieme fisso di elementi, ma permette di definire e utilizzare elementi e attributi personalizzati; per far questo viene fornita una sintassi, con cui è possibile specificare elementi e attributi che possono essere utilizzati all interno dei documenti. In altre parole è possibile definire un modello, chiamato Document Type Definition (DTD), che descrive la struttura e il contenuto di una classe di documenti. Lo stesso XML ha una DTD, in cui vengono specificate le regole della specifica stessa del linguaggio, come mostra la figura 1.1. Figura 1.1 Un documento XML può fare riferimento alla DTD di XML o a una DTD personale XML permette di creare dei tag personalizzati; inoltre uno stesso documento XML può essere utilizzato per scopi diversi da applicazioni diverse. Come fa un applicazione a riconoscere il markup designato per lei e ad evitare di confonderlo con il markup designato per altre applicazioni? Ad esempio una applicazione potrebbe utilizzare un elemento chiamato "address" per identificare il domicilio di una persona; un altra applicazione invece potrebbe utilizzare lo stesso elemento per identificare l indirizzo elettronico di una persona. Per risolvere questo tipo di problemi, il gruppo di lavoro del W3C ha pensato ad un metodo per individuare le convenzioni che governano l utilizzo di un particolare set di elementi; l idea è quella di utilizzare un namespace, (vb capitolo 1.9), cioè un documento in cui viene definito l utilizzo di un particolare set di elementi. Un documento XML può far riferimento ad un namespace attraverso un indirizzo Web(o URL). Il documento di riferimento è il WD- Piersalvo Ortu 8
9 CAPITOLO 1- IL LINGUAGGIO XML xml-names XML può essere inoltre utilizzato come piattaforma per lo scambio di dati tra le applicazioni, come mostrato in figura; ciò è possibile perché è orientato alla descrizione dei dati. Figura 1.2 Scambio di dati tra applicazioni Altro aspetto importante di XML è che, a differenza delle pagine HTML, che hanno come unico scopo la visualizzazione su un proprio browser e proprio per questo è molto difficile l elaborazione successiva delle informazioni, i documenti basati su XML non fanno supposizioni su come verranno visualizzati dai client. Infatti XML è un linguaggio orientato alla struttura e al contenuto di un documento e non al modo in cui quest ultimo deve essere visualizzato. Questo dipende dal linguaggio XSL, (Extensible StyleSheet Language), che definisce il modo e l aspetto con cui verranno presentati i documenti XML. XSL è un sottoinsieme del Document Style Semantic Specification Language(o DSSSL), il linguaggio di stile utilizzato in ambiente SGML; gode delle proprietà di essere estensibile e allo stesso tempo di facile utilizzo. Con XSL è possibile creare fogli di stile che permettono la visualizzazione di un documento XML, in un qualsiasi formato (Audio,Video, Braille, etc), come mostra la figura 1.3. Figura 1.3 Applicazione di fogli di stile ai documenti XML 1.6 STRUTTURA E SINTASSI DI UN DOCUMENTO XML Una delle caratteristiche principali di XML è la possibilità di fornire una struttura ad un documento. Ogni documento comprende sia una struttura logica, che una fisica. La struttura logica è simile a un modello che indica quali elementi includere nel documento e in quale ordine, mentre la struttura fisica contiene i dati effettivi utilizzati in un documento, quali il testo memorizzato nella memoria del computer, un immagine, un video e così via. Piersalvo Ortu 9
10 CAPITOLO 1- IL LINGUAGGIO XML Parte Fisica Parte logica : DOCUMENTO PROLOGO Logica : elemento Document Parte fisica 1 Logica : elemento1 Parte fisica 2 Logica : elemento2 Figura 1.4 Struttura di un documento XML STRUTTURA LOGICA La struttura logica fa riferimento all organizzazione delle parti di un documento; in altre parole indica il modo in cui viene creato un documento in contrapposizione al contenuto del documento stesso. Un documento XML è costituito da dichiarazioni, elementi, istruzioni di elaborazione e commenti. Alcune componenti sono essenziali altre sono opzionali IL PROLOGO Il primo elemento strutturale di un documento XML è un prologo iniziale, costituito da due componenti principali anch esse opzionali: la dichiarazione XML e la dichiarazione del tipo di documento DICHIARAZIONE XML La dichiarazione XML identifica la versione delle specifiche XML a cui è conforme il documento. Sebbene la dichiarazione XML sia un elemento opzionale, deve sempre essere inserita in documento XML. Il documento inizia con una dichiarazione XML di base: <?xml version="1.0"?> L indicazione 1.0 specifica la versione dello standard XML alla quale è conforme il documento XML stesso. Una dichiarazione XML può inoltre contenere una dichiarazione di codifica (encoding) e una dichiarazione di documento autonomo (standalone), nel seguente. modo: <?xml version="1.0" encoding="utf-8" standalone="yes or No"?>. La dichiarazione di codifica identifica lo schema di codifica dei caratteri, ad esempio UTF-8 o EUC-JP. Schemi di codifica diversi assegnano formati di caratteri o linguaggi diversi. Piersalvo Ortu 10
11 CAPITOLO 1- IL LINGUAGGIO XML La dichiarazione di documento autonomo, specifica se il documento XML contiene al suo interno una DTD (standalone="yes"), o se la DTD è un documento esterno (standalone="no"), al quale ci si riferisce attraverso la dichiarazione del tipo di documento che analizzeremo di seguito DICHIARAZIONE DEL TIPO DI DOCUMENTO La dichiarazione del tipo di documento è costituita da codice di markup che indica le regole grammaticali o la definizione del tipo di documento DTD per una particolare classe di documenti. Questa dichiarazione può anche essere diretta a un file esterno che contiene tutta o parte della DTD e deve essere visualizzata dopo la dichiarazione XML e prima dell elemento Document. Le seguenti stringhe di codice aggiungono una dichiarazione del tipo di documento alle righe di codice precedenti: <?xml version="1.0"?> <!DOCTYPE Tipo_di_documento SYSTEM "nome_file_dtd.dtd"> Vediamo che oltre alla parola chiave!doctype, bisogna specificare il tipo di documento, che non è altro che un identificatore. La parola chiave SYSTEM permette al sistema di andare a recuperare il file DTD esterno il cui nome è stato specificato tra i doppi apici L ELEMENTO DOCUMENT L elemento Document (detto anche tag radice), contiene tutti i dati di un documento XML, inclusi tutti i sottoelementi annidati e le entità esterne. È paragonabile al tag <html> del linguaggio HTML. Può essere considerato simile anche all unità C: del computer. Tutti i dati del computer sono memorizzati in questa singola unità, in cui le cartelle e le sottocartelle, contengono le singole parti di dati in una struttura logica e di semplice gestione. Nel seguente esempio scriviamo delle stringhe di codice che aggiungono all esempio precedente un elemento Document, in questo caso l elemento Student, e il nome del file DTD nella dichiarazione del tipo di documento (ad esempio studente.dtd) : <?xml version="1.0"?> <!DOCTYPE Student SYSTEM "studente.dtd"> <Student> <!-- elemento document o elemento radice(root)--> <name>marco</name> <surname>rossi</surname> Piersalvo Ortu 11
12 CAPITOLO 1- IL LINGUAGGIO XML </Student> <!--chiusura dell elemento radice --> Caratteristica molto importante in un documento XML è l annidamento, cioè il processo che consente di incorporare un oggetto o un costrutto all interno di un altro come nell esempio precedente. Un documento XML può ad esempio contenere elementi annidati e altri documenti. Ogni elemento secondario, cioè un elemento diverso dall elemento Document risiede interamente all interno del relativo elemento principale, così : <DOCUMENT> <PARENT1> <CHILD1></CHILD1> <CHILD2></CHILD2> </PARENT1> </DOCUMENT> XML segue regole di struttura rigide: ogni volta che un tag viene aperto (es: <PARENT1> ) deve venir chiuso (</PARENT1>), dopo che tutti i tag aperti successivamente siano stati a loro volta chiusi. Inoltre come abbiamo detto più volte, XML non ha marcatori predefiniti, perciò non è possibile distinguere a priori tra tag singoli e tag accoppiati. Per esempio in HTML abbiamo marcatori come <hl> che sono sempre accoppiati, ma ne esistono altri, come <img> che non hanno bisogno di essere accoppiati. Per questo motivo, in XML tutti i tag devono essere accoppiati. Il linguaggio XML supporta anche un collegamento per elementi vuoti, il tag di elemento vuoto. Questo tag unisce i tag di apertura e di chiusura per un elemento senza alcun contenuto. Viene utilizzato un formato speciale: <NOMETAG/>. In questo caso la barra segue il nome del tag, il che non è possibile nel linguaggio HTML STRUTTURA FISICA DEL LINGUAGGIO XML La struttura fisica di un documento XML è costituita da tutto il contenuto del documento stesso. Le unità di memorizzazione definite entità, possono essere parte integrante del documento o possono essere esterne. Ogni entità è identificata da un nome univoco e da un contenuto specifico che può essere costituito da un singolo carattere all interno del documento o da un file esterno di grandi dimensioni. In termini di struttura logica di un documento XML, le entità vengono dichiarate nel prologo e viene loro fatto riferimento nell elemento Document. Dopo aver dichiarato la DTD, l entità può essere utilizzata in un punto qualsiasi del documento. Un riferimento di entità indica all elaboratore di recuperare il contenuto di un entità, come stabilito dalla dichiarazione di entità, e di utilizzarla all interno del documento. Piersalvo Ortu 12
13 CAPITOLO 1- IL LINGUAGGIO XML 1.7 SINTASSI XML Un documento XML è costituito, oltre che dagli elementi visti precedentemente, da elementi, attributi, entità e commenti GLI ELEMENTI Gli elementi sono indicati nel documento XML come i tag di HTML, tra parentesi angolari < > e a differenza di HTML, possono essere personalizzati, attribuendogli nomi qualsiasi. Ogni tag aperto deve essere chiuso con le parentesi angolari e la barra ( / ), seguita dal nome dell elemento. La sintassi per definire un elemento è la seguente: <nome_elemento> testo(opzionale) </nome_elemento> Per esempio definiamo un elemento di tipo studente: <studente> dati_studente </studente> XML è molto più rigoroso di HTML, infatti mentre in quest ultimo è possibile omettere i tag di chiusura per alcuni elementi (per esempio <br>, <hr>, <p>), in XML ciò provocherebbe un errore da parte dell analizzatore del documento. Come si può notare dall esempio precedente all interno dei due tag è possibile inserire del testo, il cui tipo dipende dalla definizione del tipo di contenuto. Quest ultimo può essere di due tipi: PCDATA, Parsed Character Data, ossia dati carattere che possono essere analizzati dall analizzatore sintattico, e CDATA, Character Data, cioè dati considerati come testo. La definizione del tipo di contenuto si trova nella dichiarazione del tipo ELEMENT della DTD. Nel caso in cui tra i due tag non vi sia alcun testo, (ecco perché la scritta testo(opzionale) tra i due tag), l elemento viene detto vuoto o empty. Oltre al normale testo gli elementi possono contenere riferimenti a dati binari o a character data, (cdata). I dati binari assumono la forma di file esterni, quali immagini e altre applicazioni. Di contro i file di testo possono contenere character data, che possono essere costituiti da riferimenti ad entità esterne o caratteri di testo standard. Le sezioni di testo identificate come CDATA sono elaborate dall analizzatore XML come informazioni di caratteri di semplice testo, e non come markup. Ciò consente di visualizzare del testo di markup di esempio all interno del testo visibile del documento. Una sezione CDATA viene identificata con i tag <![CDATA[ e ]]>. Tali elementi di markup devono essere inseriti prima e dopo i character data visualizzati, in modo che tutti i caratteri vengano ignorati dall analizzatore. Il segmento di codice seguente è un esempio di sezione CDATA: <![CDATA[ Piersalvo Ortu 13
14 CAPITOLO 1- IL LINGUAGGIO XML <?xml version="1.0"?> <progetto> </progetto> ]]> Nella creazione degli elementi inoltre, bisogna tenere presenti le varie regole di assegnazione dei nomi agli elementi. Il nome di un elemento può essere costituito da qualsiasi combinazione di lettere, numeri, punti, trattini e caratteri di sottolineatura. Essi possono iniziare con un qualsiasi di questi elementi, ma non è possibile inserire spazi nel nome dell elemento, in quanto lo spazio viene utilizzato come separatore per identificare la transizione da un elemento ad un attributo. Un esempio di elementi sintatticamente corretti è il seguente: <elemento1> <Elemento1> <_elemento> invece il seguente elemento è sintatticamente errato: <elemento 1>, perché vi è uno spazio tra l elemento e il numero GLI ATTRIBUTI Gli attributi consentono di associare valori a un elemento, senza che siano considerati parte del contenuto dell elemento stesso. Ad esempio osserviamo un comune elemento HTML e l utilizzo di un attributo: <A HREF=" Home Page</A> In questo caso l elemento Anchor indicato dal tag <A> contiene un attributo denominato HREF. Il valore dell attributo è Mentre il valore non viene mai visualizzato dall utente, l attributo contiene importanti informazioni relative all elemento e fornisce la destinazione dell ancora. Questo formato del nome e del valore mostra il modo in cui sono utilizzati gli attributi nel linguaggio XML. La sintassi per definire un attributo è la seguente: <nome_elemento nome_attributo="valore"> <! > </nome_elemento> Riprendendo l esempio dello studente aggiungiamo l attributo MATRICOLA all elemento student: <?xml version="1.0"?> Piersalvo Ortu 14
15 CAPITOLO 1- IL LINGUAGGIO XML <!DOCTYPE Student SYSTEM "studente.dtd"> <Student Matricola="50123"> <!--elemento document o elemento radice(root)--> <name>marco</name> <surname>rossi</surname> <indirizzo> via dei Mille </indirizzo> </Student> <!--chiusura dell elemento radice--> Un elemento può avere anche più di un attributo. Questi devono essere definiti tutti all interno del tag dell elemento a cui si riferiscono uno dopo l altro, come nel prossimo esempio: <?xml version="1.0"?> <!DOCTYPE Student SYSTEM "studente.dtd"> <Student Matricola="50123" Corso="ing-inf"> <!-- elemento document o elemento radice(root)--> <name>marco</name> <surname>rossi</surname> <indirizzo>via dei Mille</indirizzo> </Student> <!--chiusura dell elemento radice--> Nell assegnazione dei nomi agli attributi bisogna tener conto di alcune restrizioni, affinché l impiego degli attributi sia coerente con le caratteristiche di un documento formalmente corretto. Gli attributi che contengono errori e che non rispettano tali regole provocano un interruzione dell elaborazione del documento XML. Quindi per gli attributi occorre rispettare le seguenti regole: I nomi degli attributi possono contenere qualsiasi lettera o numero, il punto o il carattere di sottolineatura, (è possibile usare i due punti ma essi sono riservati ai namespace). I valori degli attributi devono essere racchiusi sempre tra le virgolette(" "), a differenza di quanto accade in HTML nel quale vengono omesse. Non sono ammessi più attributi con lo stesso nome in un unico elemento. Come si può notare le regole non sono moltissime. Un altro aspetto importante è che uno stesso attributo può essere utilizzato in un numero illimitato di elementi ad esempio: <studenti> <name1 matricola="20152"> </name1> <name2 matricola="20132"> </name2> </studenti> Piersalvo Ortu 15
16 CAPITOLO 1- IL LINGUAGGIO XML Affinché gli attributi possano essere definiti devono essere dichiarati nella DTD, tramite una dichiarazione di tipo <!ATTLIST di cui tratteremo nel capitolo 2 sulle DTD. La mancanza di tale dichiarazione comporta un errore da parte del processore XML LE ENTITÀ Come ho già accennato precedentemente nel paragrafo 1.6.6, la parte fisica di un documento XML è costituita da entità di memorizzazione definite entità, le quali possono essere interne o esterne. La sintassi per definire un riferimento di entità all interno del documento XML è la seguente : & nome_dell entità; Il contenuto di un entità viene aggiunto al documento ogni volta che viene fatto riferimento a quella particolare entità. Il riferimento ha la funzione di segnaposto e l elaboratore XML colloca il contenuto effettivo proprio nei punti di riferimento. Aggiungiamo ora al nostro esempio un altro elemento, che chiamiamo (cod_fisc), contenente un entità, (codice_fisc), che rappresenta il codice fiscale dello studente: <?xml version="1.0"?> <!DOCTYPE Student SYSTEM "studente.dtd"> <Student Matricola="50123" Corso="ing-inf"> <!--elemento document (o elemento radice( root )--> <!-- questo è un commento--> <name>marco</name> <surname>rossi</surname> <cod_fisc>&codice_fisc</cod_fisc> <!--&codice_fisc è un riferimento di entità--> </Student> <!--chiusura dell elemento radice--> Il motivo principale per cui si utilizzano le entità all interno di un documento XML, è l abbreviazione di sequenze lunghe di caratteri, grazie alla quale il codice del documento risulta più leggibile e compatto. Per questo uso occorre però utilizzare la DTD, nella quale vengono definite le sequenze di sostituzione per ogni entità richiamata all interno del documento XML, tramite una dichiarazione del tipo entità (!ENTITY), di cui tratteremo nel capitolo I COMMENTI I commenti rappresentano una delle parti generiche di un documento XML. Anche se i commenti non sono necessari, vengono ampiamente utilizzati per migliorare la leggibilità di Piersalvo Ortu 16
17 CAPITOLO 1- IL LINGUAGGIO XML un documento, anche da parte di chi non ha sviluppato direttamente il documento XML. È possibile aggiungere commenti per spiegare lo scopo di una determinata sezione del documento, per indicare il significato dei riferimenti e per altri obiettivi. Dato che i commenti sono a vantaggio esclusivo del lettore, qualsiasi elaboratore XML ne ignorerà la presenza. I commenti vengono visualizzati tra tag di commento, (<!-- -->), proprio come accade in HTML e possono includere qualsiasi combinazione di testo, markup e simboli, ad eccezione di combinazioni di simboli che costituiscono i tag di commento. Non è lecito inserire dei commenti prima della dichiarazione XML, che deve essere la prima istruzione di qualunque documento XML. Per esempio il seguente esempio è inaccettabile: <!--Questo è un commento--> <?xml version="1.0"?> inoltre i commenti non devono separare tra loro tag di elementi XML. Per esempio non è ammesso includere in un commento il tag di apertura di un elemento, senza includere anche l elemento finale come mostrato nel seguente esempio: <?xml version="1.0" standalone="yes"?> <!--commento <elemento> chiusura commento--> <!--errato--> </elemento> 1.8 DOCUMENTI XML VALIDI E WELL FORMED Il linguaggio XML possiede due caratteristiche fondamentali, la capacità di fornire una struttura ai documenti e di rendere i dati autodescrittivi. Queste caratteristiche non sarebbero di alcuna utilità se non si potessero far rispettare le regole strutturali e grammaticali. La definizione del tipo di documento, DTD, specificata nel prologo delinea tutte le regole relative a un documento DOCUMENTI VALIDI Un documento XML è considerato valido se segue tutte le regole, sia strutturali che grammaticali. Un documento valido è conforme quindi anche a tutti i limiti di validità relativi ad XML. L elaboratore dovrà comprendere i limiti di validità delle specifiche XML e verificare possibili violazioni all interno del documento. Se l elaboratore trova un errore, deve comunicarlo all applicazione XML. Dovrà inoltre leggere la DTD, convalidare il documento e riportare qualsiasi violazione all applicazione XML. Dato che questi controlli possono richiedere tempo e occupare larghezza di banda e poiché la convalida non sempre è Piersalvo Ortu 17
18 CAPITOLO 1- IL LINGUAGGIO XML necessaria, il linguaggio XML supporta la nozione di documento ben formato o Well Formed DOCUMENTI BEN-FORMATI, (WELL FORMED) Anche se ben formato significa che è necessario seguire alcune regole, non è richiesto la stessa rigidità dei limiti di validità. Il concetto di documento ben formato è relativamente nuovo in XML. Un documento XML ben formato è più facile da leggere per un programma ed è pronto per la distribuzione in rete. Più specificatamente, i documenti ben formati hanno queste caratteristiche: Tutti i tag di apertura e di chiusura corrispondono. I tag vuoti utilizzano una sintassi XML speciale. Tutti i valori degli attributi sono racchiusi tra virgolette. Tutte le entità sono dichiarate. Quindi, un documento XML valido rispetta i tag e le norme di annidamento impostate nella DTD del documento, mentre un documento XML ben formato viene strutturato in modo appropriato per l utilizzo da parte di un computer. 1.9 SPAZIO DEI NOMI XML (XML NAMESPACE) Come sappiamo XML è un linguaggio per definire linguaggi, cioè insiemi di marcatori personalizzati e le loro sintassi di utilizzo. Questa operazione avviene attraverso le DTD che definiscono gli insiemi di marcatori che saranno utilizzati nei documenti e le regole di annidamento di questi ultimi. I marcatori XML che saranno definiti nelle DTD adottate sui siti Web possono anche non essere inventati dai Webmaster, ma possono appartenere a repertori standard per i vari domini applicativi, (i cosiddetti XML namespace), garantendo l uniformità sintattica delle pagine Web. I Namespace permettono la creazione e l uso di marcatori ambigui, ovvero con lo stesso nome, ma in riferimento a significati e ambienti diversi, utilizzando costrutti con nomi non equivoci. Pensiamo per esempio a documenti di una rivista in cui la parola "titolo" a secondo del contesto può referenziare il titolo di una rivista, ma anche il ruolo di un giornalista all interno della struttura aziendale. I dati, ovvero il contenuto di un documento XML, vengono recuperati analizzando i singoli nodi all interno del documento, meccanismo consentito dal fatto che la struttura gerarchica dei documenti XML e le regole di validità e di ben formato che gestiscono la creazione dei documenti XML garantiscono che ogni nodo presente in un documento è unico. Questo Piersalvo Ortu 18
19 CAPITOLO 1- IL LINGUAGGIO XML garantisce a sua volta che esista un solo riferimento per ciascun nodo. L utilizzo di documenti XML in un ambiente di collaborazione potrebbe tuttavia dare luogo a potenziali problemi. Ad esempio, due o più documenti potrebbero contenere elementi con gli stessi nomi, ma con semantica differente. I documenti possono essere strutturati nello stesso modo. Qualora fosse necessario utilizzare entrambi i documenti in un unico ambiente, la sovrapposizione di elementi sarebbe causa di confusione. Consideriamo ad esempio: <student> <matricola>10188</matricola> </student> <teacher> <matricola>50188</matricola> </teacher> Gli elementi student e teacher contengono un elemento (matricola) ciascuno, ma tale matricola assume significato differente nei due casi. Se questi elementi provenienti da fonti diverse sono stati combinati in un solo documento, gli elementi matricola perdono il significato originale. Questo problema, tutt altro che trascurabile, potrebbe aggravarsi parallelamente alla diffusione dell utilizzo del linguaggio XML sul Web e nelle organizzazioni. La soluzione è offerta dagli spazi dei nomi, che consentono di creare nomi univoci indipendentemente dalla posizione in cui gli elementi vengono utilizzati, garantendo l uniformità sintattica delle pagine Web CREAZIONE DI NOMI UNIVOCI TRAMITE GLI SPAZI DEI NOMI XML La definizione spazio dei nomi è utilizzata dal programmatore 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 caratteristiche aggiuntive. Costituiscono infatti una metodologia per la creazione di nomi universalmente univoci in un documento XML identificando i nomi degli elementi con una risorsa esterna univoca. Nel linguaggio XML uno spazio dei nomi è pertanto una raccolta di nomi identificata da un URI e può essere qualificato o non qualificato NOMI QUALIFICATI In XML un nome qualificato si compone in due parti: il nome dello spazio dei nomi e la parte locale. Il nome dello spazio dei nomi, ovvero un URI, definisce lo spazio dei nomi, Piersalvo Ortu 19
20 CAPITOLO 1- IL LINGUAGGIO XML mentre la parte locale corrisponde al nome dell elemento o dell attributo del documento locale. Poiché l URI è sempre univoco, il nome dello spazio dei nomi crea insieme alla parte locale un nome di elemento universalmente univoco. Per poter utilizzare uno spazio dei nomi in un documento XML, è necessario includere una dichiarazione dello spazio dei nomi nel prologo del documento. È inoltre possibile includere nella dichiarazione un prefisso dello spazio dei nomi. Utilizzando i due punti (:), il prefisso può essere aggiunto alla parte locale in modo da associarla al nome dello spazio dei nomi. Nel documento riportato nell esempio che segue, i due spazi dei nomi vengono dichiarati con prefissi, quindi utilizzati nel documento. <?xml version="1.0"?> <?xml:namespace ns=" prefix="stu"?> <?xml:namespace ns=" prefix="tea"?> <student> <stu:name>mark</stu:name> <stu:esame>math</stu:esame> <tea:name>frank</tea:name> </student> In questo esempio di codice, i prefissi vengono utilizzati per identificare elementi appartenenti allo spazio dei nomi selezionato. Si otterranno in questo modo nomi univoci, ma anche la conservazione del valore semantico dei nomi. Gli elementi stu:esame e tea:name contengono nomi completamente qualificati che risulteranno univoci indipendentemente dalla posizione in cui sono stati utilizzati. Il prefisso è parte del nome dell elemento e deve essere sempre incluso in modo tale da indicare che l elemento appartiene allo spazio dei nomi NOMI NON QUALIFICATI Un nome non qualificato non dispone di un prefisso associato al nome dello spazio dei nomi. I nomi di elementi XML che non sono qualificati, cioè non hanno alcun prefisso associato all elemento, non fanno riferimento ad un namespace AREA DI VALIDITÀ DELLO SPAZIO DEI NOMI Il prologo non è l unica opzione disponibile per la posizione della dichiarazione dello spazio dei nomi. È infatti possibile includere tale dichiarazione direttamente all interno di un elemento appartenente allo spazio dei nomi. A questo scopo, è sufficiente includere la Piersalvo Ortu 20
21 CAPITOLO 1- IL LINGUAGGIO XML dichiarazione, la prima volta che si utilizza l elemento, come mostrato nell esempio che segue: <student> <stu:name>mark</stu:name> <stu:esame>math</stu:esame> <tea:name xmlns:tea="urn:schemas-teachers-com:xml-names"> Frank </tea:name> <date>6/1/00</date> </student> Lo spazio dei nomi risulta quindi disponibile nel contesto dell elemento specifico, (<tea:name>), ovvero tale elemento e tutti i relativi elementi secondari possono utilizzare lo spazio dei nomi. Se dichiarato nell elemento radice del documento, lo spazio dei nomi può essere utilizzato nell intero documento SPAZIO DEI NOMI PREDEFININTI È possibile impostare come predefinito uno spazio dei nomi dichiarandolo senza l assegnazione di un prefisso. In questo caso, lo spazio dei nomi viene considerato all interno del contesto dell elemento in cui è stato dichiarato, come mostrato nel seguente esempio di codice: <student xmlns:stu="urn:shemas-students-com"> <name>mark</name> <esame>math</esame> <date>6/1/00</date> </student> L elemento Student contiene la dichiarazione di uno spazio dei nomi senza prefisso associato. In quanto tale, lo spazio dei nomi viene utilizzato per l elemento Student e tutti i relativi elementi secondari, ma per nessun altro elemento oltre Student, nel caso ce ne fossero. I namespace predefiniti non si applicano agli attributi. Tutti gli attributi devono essere definiti esplicitamente mediante un prefisso di namespace DICHIARAZIONE DELLO SPAZIO DEI NOMI COME URL O URN In quanto univoci, gli URL possono essere utilizzati per rendere univoci i nomi degli spazi dei nomi. Se uno spazio dei nomi è collegato ad un URL, tale spazio dei nomi risulterà univoco nell intero contesto in cui viene utilizzato. Un altra situazione tipica è rappresentata dall esistenza di uno schema dello spazio dei nomi che identifica tutti i nomi contenuti nello spazio dei nomi e il modo in cui sono strutturati. Il nome dello spazio dei nomi XML non fornisce alcun meccanismo per il recupero di tale Piersalvo Ortu 21
22 CAPITOLO 1- IL LINGUAGGIO XML schema, meccanismo che tuttavia può essere reso disponibile utilizzando gli URN (Uniform Resource Names). Un URN consente di individuare e recuperare un file di schema che definisce un determinato spazio dei nomi. Sebbene funzionalità simili possano essere fornite da un comune URL, a questo scopo l URN è più efficiente e facile da gestire poiché può essere riferito a più URL. Il codice seguente mostra l utilizzo di un URN nel contesto di uno spazio dei nomi XML: <tea:teacher xmlns:tea="urn:schemas-teachers-com"> <tea:name>frank</tea:name> <tea:surname>lupo</tea:surname> </tea:teacher> Lo schema relativo allo spazio dei nomi è disponibile nella posizione identificata dall URN e l applicazione di elaborazione è in grado di recuperare tale schema, facendo riferimento all URN stesso. Lo schema contiene informazioni dettagliate relative agli elementi dello spazio dei nomi utilizzabili nel documento SPAZIO DEI NOMI DEGLI ATTRIBUTI Gli spazi dei nomi sono applicabili così come agli elementi, anche agli attributi. Ad esempio: <tea:teacher Materia="informatic" xmlns:tea="urn:teachers:schemas:teacher"> <tea:name>frank</tea:name> <tea:surname>lupo</tea:surname> </tea:teacher> In questo esempio sia all elemento (tea:teacher) che all attributo (Materia="informatic") sono associate dichiarazioni degli spazi dei nomi. Lo spazio dei nomi degli attributi viene utilizzato in modo simile allo spazio dei nomi degli elementi. L importanza degli spazi dei nomi aumenta parallelamente allo sviluppo di nuovi vocabolari e di nuove tecnologie basate sul linguaggio XML. Ci sono comunque già tecnologie che utilizzano gli spazi dei nomi, tra cui XML-Data, i tipi di dati XML e il linguaggio SMIL (Synchronized Multimedia Integration Language). Piersalvo Ortu 22
23 CAPITOLO 2 DTD 2.1 LE DTD E LA CONVALIDA XML è un linguaggio di markup utilizzato per creare altri linguaggi personalizzati a seconda delle varie necessità. Oltre alla creazione del documento XML vero e proprio, bisogna fornire una documentazione e una descrizione del linguaggio o del documento creato. Ciò avviene mediante la DTD (Document Type Definition), che fornisce una lista di istruzioni che l analizzatore convalidante (parser) utilizzerà come regole per verificare gli elementi, gli attributi, le entità del documento XML e quindi per controllare che sia formalmente corretto e che nessuno degli elementi contenuti sia stato utilizzato al di fuori dei vincoli imposti dalla DTD. Quindi le DTD sono essenziali per convalidare un documento XML. Se l analizzatore non rivela incongruenze tra il documento XML e la DTD il documento è formalmente corretto e può essere visualizzato. Il punto forte delle DTD è la flessibilità: infatti la sintassi usata nelle DTD è abbastanza facile e flessibile in quanto consente di creare delle regole e dei vincoli che gestiscano determinate situazioni da applicare poi al documento. 2.2 STRUTTURA DELLE DTD Vi sono due modi per aggiungere una DTD ad un documento XML: il primo tramite un collegamento esterno e l altro incorporando la DTD all interno del documento. Qualsiasi sia il tipo di collegamento scelto, sarà necessaria una dichiarazione del tipo di documento del tipo: <!DOCTYPE elemento-radice..> questa è l istruzione di base per la dichiarazione del tipo di documento. La parola chiave!doctype informa l analizzatore che è stata fornita una DTD per il documento che si sta costruendo, e che deve leggerla durante l elaborazione del documento. La parte elementoradice nella dichiarazione identifica il nome dell elemento radice per cui viene fornita la DTD. Il collegamento ad una DTD esterna è un operazione semplice quanto un collegamento in HTML. In questo caso la dichiarazione del tipo di documento è contenuta su un unica linea di codice. Essa specifica il file da utilizzare quando un particolare documento XML viene convalidato. La dichiarazione si presenta così: Piersalvo Ortu 23
24 CAPITOLO 2- DTD <!DOCTYPE elemento-radice SYSTEM "nome-del-file-dtd.dtd"> Si può notare che oltre all istruzione DOCTYPE e all elemento radice vi è l istruzione SYSTEM che identifica la DTD come un file locale e non pubblico. Il riferimento ad una DTD può essere effettuato definendo il tipo di documento come SYSTEM o come PUBLIC e di cui parleremo più avanti. Il secondo tipo di collegamento di cui abbiamo accennato prima è quello interno che consiste nell incorporare la DTD all interno del documento XML, come nel seguente esempio: <?xml version="1.0" standalone="yes"?> <!DOCTYPE studente[ <!ELEMENT studente ANY> <!ELEMENT name (#PCDATA)> ]> <studente> <name> </name> </studente> Quando si incorpora il codice della DTD all interno del documento XML, occorre racchiudere il testo della definizione tra le parentesi quadre come nell esempio. Tali parentesi consentono all analizzatore di identificare l inizio e la fine della dichiarazione della DTD, discriminandola dal resto del codice XML DTD DI TIPO SYSTEM Le DTD esterne possono essere a loro volta di due tipi: private e pubbliche. Per quanto riguarda il primo tipo, esse sono identificate dall identificatore SYSTEM e in genere si trovano nella stessa posizione del documento, o sulla stessa rete locale. Se si specifica la parola SYSTEM come tipo di DTD, l attributo da specificare successivamente sarà il nome del file della DTD cui si fa riferimento, racchiuso tra doppi apici: <!DOCTYPE nome-elemento-radice SYSTEM "nome file-dtd.dtd"> Il file a cui si fa riferimento può essere un indirizzo relativo, che non specifica la posizione effettiva su un particolare computer, o un indirizzo assoluto, nel quale si utilizza il riferimento URI(UNIFORM RESOURCE IDENTIFIER) completo per il file, come nel seguente esempio: SYSTEM " DTD DI TIPO PUBLIC Nel caso di una DTD di tipo PUBLIC, dopo l istruzione PUBLIC viene inserita la stringa dell identificatore pubblico. La sintassi generale è: Piersalvo Ortu 24
25 CAPITOLO 2- DTD <!DOCTYPE nome-elemento-radice PUBLIC "nome_dtd" "locazione-della-dtd"> dove (locazione-della-dtd) indica un indirizzo URL relativo o assoluto e (nome_dtd) segue la sintassi: "prefix//owner_of_the_dtd//description_of_the_dtd//iso639_language_identifier" ad esempio: "-//W3C//DTD HTML 4.0//EN". La prima parte rappresenta l identificatore del proprietario. Se quest ultimo non è registrato questo campo conterrà un trattino. La seconda parte contiene l identificatore del testo, in questo caso DTD seguita dalla descrizione pubblica del testo. La terza parte contiene il codice della lingua utilizzata nel documento, in questo caso EN (lingua inglese). I (prefix) possono essere di tre tipi: ISO LA DTD É UNO STANDARD ISO. TUTTI GLI STANDARD ISO SONO RICONOSCIUTI. + LA DTD È RICONOSCIUTO COME UNO STANDARD NON ISO - LA DTD É UNO STANDARD NON ISO E NON APPROVATO Esempio: <!DOCTYPE nome-elemento-radice PUBLIC "-//W3C//DTD HTML 4.0//EN" " USO COMBINATO DI DTD INTERNI ED ESTERNI Un documento XML può utilizzare sia una DTD interna che una esterna. La DTD interna è specificata tra le parentesi quadre della dichiarazione del tipo di documento. La dichiarazione per la DTD esterna viene posta prima delle parentesi quadre immediatamente dopo la parola chiave SYSTEM come nel seguente tratto di codice: <!DOCTYPE radice SYSTEM "nomefiledtd.dtd"[ <!--inizio del dtd interno. Qui è possibile dichiarare elementi attributi del dtd interno-- > <!ELEMENT > <!ATTLIST..> ]> <!-- chiusura dtd interno--> 2.3 DICHIARAZIONE DEI TIPI ELEMENTO La dichiarazione di tipo ELEMENT serve a descrivere la struttura di un documento XML e in particolare come i vari elementi si compongono tra di loro. La dichiarazione ha la seguente sintassi : Piersalvo Ortu 25
26 CAPITOLO 2- DTD <!ELEMENT nome_elemento tipo_di _contenuto> Esempio: <!ELEMENT immagine (#PCDATA)> Tutti i tipi Elemento usati in un documento XML, che debba essere convalidato, devono essere dichiarati nella DTD utilizzando la dichiarazione del tipo elemento vista sopra, oppure utilizzando un XML-Schema, che ha una sintassi completamente diversa e che tratteremo nel capitolo 3. Tutti gli esempi fatti di seguito si riferiscono alle DTD. Proseguendo il discorso sugli elementi, questi ultimi non possono essere dichiarati più di una volta. Poiché inoltre in XML le parole chiave sono Case-Sensitive, l elemento ELEMENT è obbligatorio scriverlo maiuscolo. Come indicato nella dichiarazione del tipo elemento, oltre al nome, dobbiamo specificare il tipo di contenuto, che può essere EMPTY (vuoto), ANY, MIXED o CHILDREN ELEMENT come mostrato nella seguente tabella: Tipo di Contenuto EMPTY ANY children elements Definizione: Si riferisce ai tag che sono vuoti. Per esempio il tag vuoto <img> di html può essere rappresentato nei seguenti modi: <img src= studente.gif /> oppure <img src= studente.gif ></img>. Viene usato quando non si sa che tipo di contenuto conterrà il tag.quindi il contenuto può essere di qualsiasi tipo (caratteri o cifre). I children elements (o elementi figli) si riferiscono ad elementi che si trovano all interno di altri elementi. L elemento che contiene tutti i sottoelementi è detto Parent element (o elemento padre). Mixed content Si riferisce ad una combinazione di children element e #PCDATA. PCDATA sta per parsed character data (ovvero caratteri analizzabili), cioè dati di caratteri di markup, che contengono tag di markup. Tabella 2.1 Tipi di contenuto degli elementi ELEMENTI FIGLI (CHILDREN ELEMENTS) La sintassi per la dichiarazione di children elements è la seguente: <!ELEMENT parent_name (child_name)> <!ELEMENT child_name tipo_di_contenuto> Esempio: <?xml version="1.0"?> <!DOCTYPE student [ <!--la DTD in questo caso è di tipo interno--> <!--L elemento student contiene un elemento figlio di tipo id--> <!ELEMENT student (id)> <!ELEMENT id (#PCDATA)> ]> Piersalvo Ortu 26
27 CAPITOLO 2- DTD <student> <id> </id> </student> Una precisazione importante a questo punto è il fatto che se gli elementi figli (child element), sono usati all interno del documento XML, essi devono essere dichiarati in una dichiarazione di tipo element separata come nell esempio. Associati agli elementi che descrivono il contenuto di un tag, si possono trovare dei caratteri speciali (detti Modificatori), che indicano il rapporto che deve stabilirsi tra gli elementi stessi. Il primo elemento è la virgola (,) che indica una concatenazione di elementi, per cui, nell esempio che segue, child1_name viene prima di child2_name. <!ELEMENT parent_name (child1_name,child2_name)> <!ELEMENT child1_name tipo_di_contenuto> <!ELEMENT child2_name tipo_di_contenuto > Esempio: <?xml version="1.0"?> <!DOCTYPE student[ <!--L elemento 'student' contiene due child elements separati da virgole--> <!ELEMENT student (id,surname)> <!--gli element indicati sotto possono contenere testo non di markup--> <!ELEMENT id (#PCDATA)> <!ELEMENT surname (#PCDATA)> ]> <student> <id> </id> <surname>smith</surname> </student> Il secondo elemento modificatore è la barra( ), che si chiama alternatore, il quale stabilisce che tra due elementi o più uno solo deve essere considerato in alternativa agli altri. <!ELEMENT parent_name (child1_name child2_name)> <!ELEMENT child1_name tipo_di_contenuto> <!ELEMENT child2_name tipo_di_contenuto > Esempio: <?xml version="1.0"?> <!DOCTYPE student [ <!ELEMENT student (id surname)> <!--gli elementi indicati sotto possono contenere testo non di markup--> <!ELEMENT id (#PCDATA)> <!ELEMENT surname (#PCDATA)> ]> <student> <id> </id> </student> Piersalvo Ortu 27
28 CAPITOLO 2- DTD Gli altri modificatori sono i caratteri?, *, e il +. Il punto interrogativo indica che il marcatore o gruppi di marcatori che lo precede sono opzionali, ovvero hanno una cardinalità (0,1). <!ELEMENT parent_name (child_name?)> Esempio: <?xml version="1.0"?> <!DOCTYPE student [ <!ELEMENT student (datanascita?)> <!ELEMENT datanascita (#PCDATA)> ]> <student> <id>2154</id> </student> Il più (+) indica che l elemento che lo precede può comparire una o più volte. <!ELEMENT parent_name (child_name+)> <!ELEMENT child_name tipo_di_contenuto> Esempio: <?xml version="1.0"?> <!DOCTYPE student [ <!ELEMENT student (subject+)> <!ELEMENT subject (#PCDATA)> ]> <student> <subject>mathematics</subject> </student> L asterisco (*), è simile al +, con la differenza che l elemento oltre a comparire più volte può anche non comparire affatto. <!ELEMENT parent_name (child_name*)> <!ELEMENT child_name tipo_di_contenuto > Esempio: <?xml version="1.0"?> <!DOCTYPE student [ <!ELEMENT student (subject*)> <!ELEMENT subject (#PCDATA)> ]> <student> <subject>mathematics</subject> <subject>physics</subject> <subject>chemistry</subject> </student> ELEMENTI ANNIDATI Gli elementi di un documento XML possono essere annidati gli uni dentro gli altri, come nel seguente esempio: Piersalvo Ortu 28
29 CAPITOLO 2- DTD <?xml version="1.0"?> <!DOCTYPE student [ <!ELEMENT student (surname,firstname)> <!ELEMENT firstname (fullname,nickname)> <!ELEMENT surname (#PCDATA)> <!ELEMENT fullname (#PCDATA)> <!ELEMENT nickname (#PCDATA)> ]> <student> <surname>smith</surname> <firstname> <fullname>joseph</fullname> <nickname>jo</nickname> </firstname> </student> ELEMENTI DI TIPO MISTO (MIXED) Per quanto riguarda i vari tipi contenuto, nella dichiarazione dell elemento troviamo quello di tipo MIXED, che contiene un insieme di children elements e testo (PCDATA). Esempio: <!ELEMENT parent_name (#PCDATA child1_name)*> Esempio: <?xml version="1.0"?> <!DOCTYPE student [ <!ELEMENT student (#PCDATA id)*> <!ELEMENT id (#PCDATA)> ]> <student> <!--riga di testo qualsiasi misto a children elements.--> <id> </id> <!--Il testo può essere messo dovunque, prima o dopo i child element.--> </student> 2.4 DICHIARAZIONE DEI TIPI ATTRIBUTO Nel linguaggio XML gli attributi vengono dichiarati nella DTD utilizzando la sintassi seguente: <!ATTLIST NomeElemento NomeAttributo Tipo "Valore-di-Default"> In questo caso <!ATTLIST> rappresenta il tag che identifica una dichiarazione di attributo. La voce Nome-Elemento rappresenta il nome dell elemento a cui vengono applicati gli attributi. La voce Nome-Attributo rappresenta il nome dell attributo. La voce Tipo identifica il tipo di attributo dichiarato. La voce Valore-di-Default specifica le impostazioni predefinite relative all attributo. Ecco elencati i tipi di valori degli attributi disponibili per il linguaggio XML: Piersalvo Ortu 29
30 CAPITOLO 2- DTD CDATA ENTITY ENTITIES ID IDREF IDREFS NMTOKEN NMTOKENS NOTATION Enumerated In questo attributo possono essere utilizzati solo dati in formato carattere. Il valore dell attributo deve fare riferimento a un entità binaria esterna dichiarata nella DTD. È equivalente all attributo ENTITY, ma consente l utilizzo di più valori separati da spazi. Il valore dell attributo deve essere un identificatore univoco. Se un documento contiene attributi ID con lo stesso valore, l elaboratore produrrà un errore. Il valore deve essere un riferimento a un ID dichiarato in un altro punto del documento. Se l attributo non corrisponde al valore dell ID specificato, l elaboratore produrrà un errore. È equivalente all attributo IDREF, ma consente l utilizzo di più valori separati da spazi. Gli attributi NMTOKEN vengono utilizzati per imporre limiti ai valori degli attributi e sono stringhe di testo, costituite da lettere, numeri, punti trattini, due punti o caratteri di sottolineatura. È equivalente all attributo NMTOKEN, ma consente l utilizzo di più valori separati da spazi. Il valore dell attributo deve fare un riferimento a un annotazione dichiarata in un altro punto della DTD. La dichiarazione può anche essere costituita da un elenco di annotazioni. Il valore deve corrispondere a una delle annotazioni dell elenco. Ogni annotazione deve avere la relativa dichiarazione nella DTD. Il valore dell attributo deve corrispondere a uno dei valori inclusi. Ad esempio: <!ATTLIST My Attribute (content1 content2)>. La parte finale della dichiarazione di attributo è l impostazione predefinita per il valore dell attributo. Le impostazioni predefinite sono di quattro tipi: #REQUIRED #IMPLIED #FIXED fixedvalue Default Ogni elemento contenente questo attributo deve specificarne un valore. Un valore mancante può causare un errore. Questo attributo è opzionale. L elaboratore può ignorare questo attributo se non viene rilevato alcun valore. Questo attributo deve avere il valore fixedvalue. Se l attributo non è incluso nell elemento, viene stabilito il valore fixedvalue. Identifica un valore predefinito per un attributo. Se l elemento non include l attributo, viene stabilito il valore default. Vediamo un esempio di documento XML con una dichiarazione di attributo: <?xml version="1.0"?> <!DOCTYPE student [ <!ELEMENT student (nome,cognome,corso)> <!ATTLIST student matricola CDATA #REQUIRED> ]> Piersalvo Ortu 30
31 CAPITOLO 2- DTD <student matricola="50124"> <nome></nome> <cognome> </cognome> <corso> </corso></student> Nell esempio l elemento radice student possiede un attributo (matricola). Come si può osservare il valore degli attributi in XML deve essere sempre racchiuso tra le doppie virgolette. 2.5 DICHIARAZIONE DI ENTITÀ Le entità possono essere di tipo interno ed esterno. Nel primo caso si tratta di un entità in cui non esistono unità di memorizzazione fisica separate e il cui contenuto viene fornito nella dichiarazione corrispondente, che si trova all interno della DTD (interna o esterna), a cui si riferisce il documento XML. La dichiarazione di entità interna è la seguente: <!ENTITY Nome-entità "valore"> Esempio: <!ENTITY codice_fisc "PRQ32A3245RTG45G">. Un entità esterna invece fa riferimento a un unità di memorizzazione nella dichiarazione mediante un identificatore pubblico o di sistema. Ci sono quindi due tipi di entità esterne: quelle private, identificate dalla parola chiave SYSTEM e quelle pubbliche identificate dalla chiave PUBLIC. Per quanto riguarda le entità esterne private l identificatore di sistema fornisce un collegamento alla posizione in cui si trova il contenuto dell entità, ad esempio un URI (Uniform Resource Identifier). La sintassi è la seguente: <!ENTITY nome_entità SYSTEM "URI"> dove (URI) non è altro che un URL dove l entità esterna può essere recuperata. Vediamo un esempio: <!ENTITY foto_studente SYSTEM " Oltre all identificatore di sistema, l entità può includere un identificatore pubblico (public_id) che fornisce un metodo opzionale e alternativo per il recupero del contenuto di un entità da parte dell elaboratore di XML. Questo identificatore può essere ad esempio utilizzato se l applicazione è collegata ad una DTD del documento disponibile pubblicamente ad esempio su internet (vb esempio successivo). Se l elaboratore non è in grado di generare una posizione appropriata per l identificatore pubblico, è necessario che venga controllato l URI specificato dall identificatore di sistema. La sintassi è la seguente: <!ENTITY nome_entità PUBLIC "public_id" "URI"> Piersalvo Ortu 31
32 CAPITOLO 2- DTD Per esempio: <!ENTITY foto_studente PUBLIC "public_id" " Le entità possono anche essere ANALIZZABILI E NON ANALIZZABILI. Per entità analizzabile si intende un entità in grado di essere letta dall elaboratore XML che ne consente l estrazione. Al termine dell estrazione, questo tipo di entità viene visualizzata come parte del testo del documento nella posizione di riferimento dell entità stessa. Ad esempio, facendo riferimento all entità (codice_fisc), dell esempio precedente, una dichiarazione del tipo analizzabile potrebbe essere questa: <!ENTITY codice_fisc "PRQ32A3245RTG45G"> Il tipo di entità parsed (analizzabile) generalmente tratta dati di testo. La definizione esatta è che esse si riferiscono a dati che il processore XML può analizzare sintatticamente. Le entità esterne sono utili come riferimento comune tra molteplici documenti. Questo fa si che qualsiasi cambiamento sull entità esterna automaticamente aggiornerà tutti i documenti a cui l entità è collegata. Per entità non analizzabile si intende un entità che non può essere direttamente interpretata dall elaboratore XML e viene talvolta indicata come entità binaria in quanto il contenuto è spesso costituito da un file binario, ad esempio un immagine. Quindi un entità non analizzabile richiede informazioni diverse da quelle incluse in un entità analizzabile. Viene richiesta una notazione (NDATA nome-notazione) che identifica il tipo di risorsa per cui l entità viene dichiarata e ha la seguente sintassi: <!ENTITY name SYSTEM "URI" NDATA nome-notazione> <!ENTITY name PUBLIC "public_id" "URI" NDATA nome-notazione> Vediamo un esempio: <!ENTITY foto-studente SYSTEM "image.jpg" NDATA JPG> Questa dichiarazione significa che l entità (foto_studente) è un file binario nella notazione JPG. Perché queste dichiarazione di entità siano valide, anche la notazione deve essere dichiarata. La dichiarazione di notazione consente all applicazione di XML di gestire i file binari esterni ed ha la seguenti sintassi: <!NOTATION name SYSTEM "URI"> <!NOTATION name PUBLIC "public_id"> <!NOTATION name PUBLIC "public_id" "URI"> dove URI non è altro che un indirizzo URL dove la notazione esterna può essere trovata, mentre (public_id), può essere usato dal processore XML per generare un URI alternativo Piersalvo Ortu 32
33 CAPITOLO 2- DTD dove la notazione esterna può essere recuperata. Nel caso della notazione JPG utilizzata nell esempio, può essere impiegata la dichiarazione di notazione seguente: <!NOTATION jpg SYSTEM "Windows/Utils/Imaging.exe"> Questa stringa di codice indica all elaboratore XML di utilizzare Imaging.exe per elaborare l entità di tipo JPG ogni volta che viene rilevata. Dopo essere stata dichiarata, la dichiarazione di notazione può essere utilizzata all interno del documento. Oltre a utilizzare dichiarazioni di entità e di notazioni per incorporare le entità non analizzate nel documento, è necessario utilizzare il riferimento all entità come parte di una dichiarazione di attributo e non come un semplice riferimento con la notazione (&nome-entità;). Ad esempio tale sintassi non è valida: <?xml version="1.0"?> <!DOCTYPE student [ <!ELEMENT student EMPTY> <!NOTATION JPG SYSTEM "Imaging.exe"> <!ENTITY foto-studente SYSTEM "photo.jpg" NDATA JPG> ]> <student>&foto-studente;</student> <!--Non è possibile far riferimento all entità fotostudente con la sintassi &foto-studente; --> Affinché l entità non analizzabile possa essere recuperata è necessario creare un elemento(in questo caso foto, di tipo vuoto[empty]), contenente un attributo(image), che possa servire da contenitore per l entità, nel seguente modo: <!DOCTYPE student [ <!ELEMENT student ANY> <!ELEMENT foto EMPTY> <!ATTLIST foto image ENTITY #REQUIRED> <!NOTATION JPG SYSTEM "Imaging.exe"> <!ENTITY foto-studente SYSTEM "photo.jpg" NDATA JPG> ]> <student> <foto image="foto-studente"/> </student> Oltre ai riferimenti di entità di cui abbiamo parlato precedentemente, ne esistono anche altri detti RIFERIMENTI DI ENTITÀ DI PARAMETRO. Questo tipo di riferimento si differenzia dagli altri perché utilizza un modulo (%), invece di una e-commerciale(&) e viene utilizzato per dichiarare entità che esistono solo all interno della DTD. Anche questo tipo di entità può essere interna o esterna. Per quanto riguarda il primo tipo la dichiarazione di un entità parametro ha la seguente forma: <!ENTITY % nome "valore_entità"> Vediamo la parte di codice della DTD: Piersalvo Ortu 33
34 CAPITOLO 2- DTD <!ELEMENT student (#PCDATA)> <!ENTITY %js "Jo Smith"> <!ENTITY name "nome= %js;"> <!--In questo caso l entità (name) fa riferimento all entità parametro (js) contenuta sempre all interno della stessa DTD nella quale si trova l entità (name). La dichiarazione di tipo esterno è molto simile agli altri tipi di notazione esterna visti precedentemente e si presenta così : <!ENTITY %nome SYSTEM "URI"> <!ENTITY %nome PUBLIC "public_id" "URI"> % nome; Esempio : <!ENTITY %esami SYSTEM " %esami; Per terminare il discorso sulle entità, esistono oltre alle entità diciamo personalizzate cioè definite dall utente, LE ENTITÀ PREDEFINITE. Poiché nel linguaggio XML alcuni caratteri, sono utilizzati per contrassegnare il documento in modo specifico, quali le parentesi angolari(< >) e la barra (/) che sono interpretati come codice di markup, questi non possono essere utilizzati come contenuto del documento XML. Vediamo un esempio pratico: <name> <mark> </name> <!--sintassi errata--> Le parentesi angolari che racchiudono il nome mark non sono consentite. Affinché questi caratteri siano visualizzati come dati, è necessario utilizzare determinati codici che indicano all elaboratore XML di considerarli come semplici caratteri: Entità predefinite: Come dichiarare queste entità nella dtd < <!ENTITY lt "<"> parentesi angolare di apertura < > <!ENTITY gt ">"> parentesi angolare di chiusura > & <!ENTITY amp "&"> e_commerciale ' <!ENTITY apos "'"> apostrofo " <!ENTITY quot """> doppi apici Piersalvo Ortu 34
35 CAPITOLO 3 XML SCHEMA 3.1 COSA SONO GLI SCHEMI Gli schemi XML forniscono un mezzo per definire la struttura, il contenuto e la semantica dei documenti XML che possono essere condivisi tra diversi computer e documenti. Gli schemi XML si basano sul linguaggio XML, a differenza dei DTD che hanno una loro specifica sintassi. La specifica XML Schema si basa sulla raccomandazione XML 1.0, la quale definiva un modo per descrivere il contenuto di un documento XML con le definizioni del tipo di documento (DTD). Le DTD rappresentano il modo per convalidare un documento XML, e l intera definizione di un documento si basa sulla sua conformità a una DTD specificata. Con lo sviluppo dei linguaggi derivati da XML, quali il linguaggio SMIL (Synchronized Multimedial Integration Language) e il CML (Chemical Markup Language) è divenuto sempre più ovvio che la forma della DTD per la specifica dei vincoli del contenuto dei documenti XML non era un sistema abbastanza flessibile per lavorare con l ampia gamma di applicazioni cui XML veniva applicato. Da questo punto di vista gli Schemi rappresentavano la risoluzione al problema, anche grazie all introduzione dei Namespace. XML-Schema è un linguaggio di definizione dei documenti estremamente potente e flessibile, in grado non solo di offrire il controllo sull esistenza di elementi e attributi, sul contenuto e sull ordine, ma anche sui tipi di dati specifici, su quando possono essere usati gli elementi, sul modo in cui è possibile utilizzare gli attributi e sul contenuto degli attributi stessi. Gli Schemi sono utilizzati per verificare le informazioni contenute in un documento dopo che esso è stato analizzato, dopo che i riferimenti alle varie entità sono stati inclusi e dopo che sono stati caricati i valori predefiniti degli attributi. 3.2 DTD E SCHEMI A CONFRONTO Gli XML-Schema sono stati creati per eliminare alcuni limiti delle DTD. Ecco i principali obiettivi degli XML- Schema. 1. Gestione dei documenti dello schema senza necessità di utilizzo di strumenti speciali. Le DTD vengono scritte utilizzando una sintassi specifica. Per questo motivo, la funzionalità di XML per l utilizzo delle DTD richiede non solo autori esperti del linguaggio DTD, ma anche strumenti speciali in grado di leggere e scrivere nelle DTD. Piersalvo Ortu 35
36 CAPITOLO 3- XML SCHEMA Il primo obiettivo di XML-Schema è quindi l eliminazione dell utilizzo di strumenti speciali, obiettivo raggiunto mediante il semplice utilizzo della sintassi XML per il linguaggio degli schemi. 2. Flessibilità degli schemi. Gli schemi devono essere sufficientemente flessibili per consentirne l adattamento a un applicazione specifica, eliminando i relativi vincoli. In altre parole, non è necessaria la flessibilità dell applicazione per lo schema. Questa flessibilità è ottenuta mediante una sintassi di definizione aperta dello schema, con la quale uno schema può essere reso specifico aggiungendo elementi o attributi. 3. Semplicità del linguaggio al fine di consentirne l implementazione in tutti gli elaboratori XML. Questo obiettivo garantisce che il linguaggio XML-Schema non sia complesso e possa quindi essere implementato da tutti gli sviluppatori di elaboratori XML. Questo obiettivo può essere raggiunto utilizzando la sintassi XML per definire il linguaggio dello schema. In questo modo, l implementazione viene semplificata e non è più necessario disporre di un particolare elaboratore per analizzare lo schema. 4. XML-Schema deve soddisfare i requisiti delle applicazioni Web (ad esempio le applicazioni per scambi commerciali) che riguardano la convalida dei dati aggiuntivi e di quelli espressi dalla DTD corrente. La DTD definisce la struttura e le regole del documento, ma presenta dei limiti nella definizione dei tipi di dati e nella convalida dei dati. Il linguaggio XML-Schema definisce i tipi di dati primitivi e permette di determinare intervalli di valori di dati, ad esempio, consentendo all autore di determinare i valori massimi e minimi. Questo tipo di caratteristiche sono tipiche dei linguaggi di database relazionali, come SQL (Structured Query Language), e dei linguaggi di programmazione più recenti. 5. Il linguaggio dello schema deve supportare la funzionalità che consente ai singoli documenti di comprendere parti definite in fonti di dati diverse. I documenti XML, come sappiamo, possono comprendere altri documenti o parti di altri documenti mediante l inserimento di puntatori all interno della DTD. Questo obiettivo stabilisce che XML-Schema fornirà una funzionalità simile, ottenuta mediante l utilizzo dello spazio dei nomi, (namespace), negli schemi XML. 6. XML-Schema deve essere totalmente compatibile con XML 1.0. Lo scopo di questo obiettivo è minimizzare i problemi relativi al superamento delle tecnologie dovuto a nuove versioni o a aggiornamenti della tecnologia stessa. Lo scopo è Piersalvo Ortu 36
37 CAPITOLO 3- XML SCHEMA diffondere l utilizzo di XML-Schema, grazie anche al fatto che utilizza la sintassi XML. Questo obiettivo ne amplia il campo di azione poiché prevede che XML-Schema sia compatibile con XML STRUTTURA DEL DOCUMENTO DELLO SCHEMA Un documento XML di base è composto da un prologo e da un elemento Document. Anche il documento dello schema è composto da questi componenti. Esiste tuttavia una differenza tra i due, in quanto un documento dello schema non contiene alcuna DTD. La struttura del documento è infatti definita all interno di un elemento Schema (xsd:schema), che costituisce l elemento Document, o Root (radice), in una definizione di schema. Questo elemento documento può essere utilizzato nel seguente modo: <?xml version="1.0"?> <xsd:schema xmlns:xsd=" <!-- Qui vi sono le dichiarazioni --> <xsd:element name= student > </xsd:schema> L elemento schema deve essere derivato dallo spazio dei nomi ( Ogni elemento dello schema deve iniziare col prefisso xsd: in modo tale da identificare l origine stessa degli elementi dello schema. Uno schema può avere due tipi differenti di struttura. La prima consiste in uno schema di tipo gerarchico, l altro in uno schema detto piatto. Il tipo gerarchico consiste nello scrivere lo schema nello stesso ordine in cui il documento stesso è stato visualizzato. In questo sistema, è l elemento xsd:schema ad aprire lo schema detenendo il nome dell elemento radice del documento XML. Questo elemento schema potrebbe anche definire il namespace di destinazione e diverse opzioni predefinite per l intero schema. Vediamo un esempio di schema gerarchico: <?xml version="1.0"?> <xsd:schema xmlns:xsd=" <xsd:element name="student"> <!--elemento radice del documento XML--> <xsd:complextype> <xsd:sequence> <xsd:element name="nome" type="xsd:string"/> <!--elementi figli --> <xsd:element name="cognome" type="xsd:string"/> <xsd:element name="codice_fiscale" type="xsd:string"/> <xsd:element name="corso" type="xsd:string"/> <xsd:element name="indirizzo"> <xsd:complextype> <xsd:sequence> Piersalvo Ortu 37
38 CAPITOLO 3- XML SCHEMA <xsd:element name="via" type="xsd:string"/> <xsd:element name="cap" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="provincia" type="xsd:string"/> <xsd:element name=" " type="xsd:string"/> </xsd:sequence> </xsd:complextype> </xsd:element> </xsd:sequence> <xsd:attribute name="matricola" type="xsd:string"/> </xsd:complextype> </xsd:element> </xsd:schema> Come si può notare tutti gli elementi dichiarati nello schema sono ordinati nello stesso modo in cui si presentano nel documento XML presentato più avanti. Lo schema di tipo piatto consente invece di descrivere ciascuno degli elementi del documento e tutti i loro elementi figli e attributi, in raggruppamenti di più facile comprensione. Per raggruppare elementi e attributi in questa maniera occorre utilizzare dei riferimenti (ref="nome elemento"), per puntare al punto in cui si trovano gli elementi figli e gli attributi. Vediamo ora lo stesso esempio di prima ma con una struttura piatta: <?xml version="1.0"?> <xsd:schema xmlns:xsd=" <xsd:element name="nome" type="xsd:string"/> <xsd:element name="cognome" type="xsd:string"/> <xsd:element name="codice_fiscale" type="xsd:string"/> <xsd:element name="corso" type="xsd:string"/> <xsd:element name="via" type="xsd:string"/> <xsd:element name="cap" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="provincia" type="xsd:string"/> <xsd:element name=" " type="xsd:string"/> <xsd:attribute name="matricola" type="xsd:string"/> <xsd:element name="indirizzo"> <xsd:complextype> <xsd:sequence> <xsd:element ref="via"/> <xsd:element ref="cap"/> <xsd:element ref="city"/> <xsd:element ref="provincia"/> <xsd:element ref=" "/> </xsd:sequence> </xsd:complextype> </xsd:element> <xsd:element name="student"> <xsd:complextype> <xsd:sequence> Piersalvo Ortu 38
39 CAPITOLO 3- XML SCHEMA <xsd:element ref="nome"/> <xsd:element ref="cognome"/> <xsd:element ref="codice_fiscale"/> <xsd:element ref="corso"/> <xsd:element ref="indirizzo"/> <xsd:element ref="recapiti"/> <xsd:element ref="esami_sostenuti"/> </xsd:sequence> </xsd:complextype> </xsd:element> </xsd:schema> Come si può notare in questo caso sono stati dichiarati prima tutti gli elementi semplici e poi quelli complessi (ad esempio l elemento indirizzo), all interno dei quali si fa riferimento ai tipi semplici attraverso l attributo ref. I due schemi precedenti fanno riferimento al seguente frammento di documento XML, che verrà trattato più in dettaglio nel capitolo 6: <?xml version="1.0" standalone="no"?> <?xml:stylesheet type="text/xsl" href="librettofstyle.xsl"?> <student Matricola="20546" > <nome>marco</nome> <cognome>rossi</cognome> <codice_fiscale>454dasda65e</codice_fiscale> <corso>ing-informatica</corso> <indirizzo> <via>via dei Mille 22a</via> <cap>080125</cap> <city>torino</city> <provincia>(to)</provincia> < >[email protected]</ > </indirizzo> </student> 3.4 DICHIARAZIONE DI ELEMENTI DELLO SCHEMA Gli schemi XML utilizzano un insieme predefinito di elementi per descrivere le regole che governano la struttura di un documento XML. Tutti gli elementi dello schema iniziano con il prefisso (xsd:), associato con il namespace xml:xsd=" Sono 36 gli elementi XML-Schema che forniscono la struttura dei propri documenti di schema: all annotation Key keyref AppInfo attribute any length documentation any attribute list attributegroup unique union simplecontent simpletype schema selector sequence choice complextype complexcontent Tabella 3.1 Elementi degli Schemi element enumeration extention field group import include mininclusive maxinclusive maxlenght minlenght pattern redefine restriction Piersalvo Ortu 39
40 CAPITOLO 3- XML SCHEMA TIPI DI ELEMENTI Gli elementi di uno schema possono essere di due tipi: complessi e semplici. La differenza fra i due tipi è che i primi possono contenere altri elementi (elementi figli), come parte del loro contenuto, e possono anche avere attributi, mentre quelli semplici non possono avere nè gli uni nè gli altri. La creazione di tipi complessi avviene con la dichiarazione dell elemento <complextype>, indicato nella tabella precedente, che può contenere anche informazioni per il riferimento e la dichiarazione di elementi e attributi. A sua volta la dichiarazione <complextype> è contenuta all interno della dichiarazione dell elemento element (xsd:element.), che denomina l elemento complesso, come nel seguente codice: <xsd:element name="student"> <!--elemento radice del documento XML--> <xsd:complextype> <xsd:element name="nome" type="xsd:string"/> <!--elemento figlio--> </xsd:complextype> </xsd:element> Un tipo di elemento semplice è quello dell esempio precedente: <xsd:element name="nome" type="xsd:string"/>, in quanto come si può notare non contiene altri elementi figli. Oltre ad utilizzare i tipi semplici predefiniti, è possibile definire dei tipi semplici personalizzati in base ai tipi esistenti, tramite la dichiarazione dell elemento <simpletype>. È possibile inoltre tramite l uso dell elemento <restriction> specificare su quali dei tipi semplici esistenti si sta basando il nuovo tipo. Ad esempio: <xsd:simpletype name="vototype"> <xsd:restriction base="xsd:integer"> <xsd:mininclusive value="18"/> <xsd:maxinclusive value="30"/> </xsd:restriction> </xsd:simpletype> L esempio precedente definisce un tipo semplice chiamato vototype (vedere capitolo 6 per maggiori dettagli). L elemento restriction usa l attributo base per identificare il tipo di dato dello schema, xsd:integer, per il nuovo tipo semplice. Per limitare ulteriormente il nuovo tipo, vengono applicati gli elementi mininclusive e maxinclusive con i nuovi valori per l intervallo di interi consentito. È anche possibile utilizzare al posto degli elementi mininclusive e maxinclusive, l elemento <pattern> per limitare i valori del nuovo tipo. Ad esempio per descrivere un indirizzo di posta elettronica, il quale deve essere formattato in modo corretto con un numero indefinito di caratteri che precedono e seguono il si può procedere nel seguente modo: Piersalvo Ortu 40
41 CAPITOLO 3- XML SCHEMA <xsd:simpletype name=" "> <xsd:restriction base="xsd:string"> <xsd:pattern "/> </xsd:restriction> </xsd:simpletype> Infine è possibile fare un enumerazione all interno dell elemento <restriction> tramite la dichiarazione dell elemento <enumeration>, per forzare la limitazione dei tipi semplici a un elenco specifico di valori. Ad esempio: <xsd:simpletype name="prefissi"> <xsd:restriction base="xsd:string"> <xsd:enumeration value="338"/> <xsd:enumeration value="339"/> <xsd:enumeration value="333"/> </xsd:restriction> </xsd:simpletype> TIPO DI CONTENUTO Gli schemi devono poter definire gli elementi con contenuto di elementi e contenuto di testo, e definire gli attributi senza alcun contenuto o con contenuto misto (cioè attributi, elementi figli e testo). Quindi in uno schema è possibile trovare elementi con soli elementi figli o solo testo o entrambi. In quest ultimo caso si parla di contenuto misto come nel seguente esempio: <student> Marco <matricola></matricola> <corso> </corso> </student> Lo schema seguente definisce l elemento student che come contenuto ha delle stringhe di caratteri e due elementi figli, <matricola> e <corso>: <xsd:element name="student"> <xsd:complextype mixed="true"> <xsd:sequence> <xsd:element name="matricola" type="xsd:string"/> <xsd:element name="corso" type="xsd:string"/> </xsd:sequence> </xsd:complextype> </xsd:element> Si noti l attributo mixed con valore true all interno della dichiarazione dell elemento <complextype>, che indica un contenuto misto. Oltre al contenuto misto per un elemento abbiamo anche il contenuto vuoto che serve a definire elementi che non possono avere contenuto di testo ma solo attributi, ad esempio: <student nome="mark" Piersalvo Ortu 41
42 CAPITOLO 3- XML SCHEMA matricola="50123" corso="ing-inf"/> Per definire elementi dal contenuto vuoto nello schema si deve seguire la seguente procedura: <xsd:element name="student"> <xsd:complextype> <xsd:attribute name="nome" type="xsd:string"/> <xsd:attribute name="matricola" type="xsd:string"/> <xsd:attribute name="corso" type= xsd:string"/> </xsd:complextype> </xsd:element> ossia dichiarare solo attributi e nessun elemento figlio GRUPPI DI ELEMENTI Proprio come è possibile creare tipi semplici e complessi, è anche possibile definire gruppi di elementi, che possono essere utilizzati per raggruppare in categorie elementi e attributi, per una più facile interpretazione, oppure per fornire una notazione abbreviata per i gruppi di elementi. Questi gruppi possono, una volta definiti nello schema, essere richiamati all interno del documento XML, senza bisogno di riscrivere ogni volta gli stessi elementi o attributi, rendendo così il codice del documento più leggibile. Ad esempio definiamo un gruppo di nome indirizzo che contiene tutti i dati relativi all indirizzo di uno studente: <xsd:group name="tipoindirizzo"> <xsd:complextype> <xsd:sequence> <xsd:element name="via" type="xsd:string"/> <xsd:element name="cap" type="xsd:string"/> <xsd:element name="city" type="xsd:string"/> <xsd:element name="provincia" type="xsd:string"/> <xsd:element name=" " type="xsd:string"/> </xsd:sequence> </xsd:complextype> </xsd:element> Tale gruppo di elementi può essere utilizzato nel seguente modo: <xsd:element name="indirizzo"> <xsd:complextype> <xsd:sequence> <xsd:group ref="tipoindirizzo"> </xsd:sequence> </xsd:complextype> </xsd:element> Piersalvo Ortu 42
43 CAPITOLO 3- XML SCHEMA VINCOLI SUGLI ELEMENTI Nella creazione di elementi <complextype>, è possibile aggiungere una serie di vincoli alle proprie istruzioni. Così come nelle DTD avevamo i modificatori, ad esempio la virgola (, ) che indicava una sequenza di elementi o la barra ( ) che indicava una scelta fra più elementi, ecc, negli schemi abbiamo i vincoli: <choice>, <sequence> e <all>. Il compositore <choice> descrive una scelta tra diversi possibili elementi o gruppi di elementi che possono apparire nel documento XML, proprio come la barra ( ) delle DTD. La struttura base del compositore choice è: <xsd:choice> <xsd:element name="nome elemento" type="xsd:string"/> <xsd:element name="nome elemento" /> <xsd:element name="nome elemento" /> </xsd:choice> Il compositore <sequence>, impone un ordine agli elementi, e per precisione l ordine delle dichiarazioni degli elementi nello schema diventa quello in cui essi devono apparire nel documento XML, come nell esempio dell indirizzo fatto in precedenza. Infine il compositore <all> definisce un insieme di elementi non ordinato. Tutti gli elementi di un gruppo infatti possono apparire una volta o non apparire per affatto, e possono apparire in un ordine qualsiasi. L uso di <all> ha alcune limitazioni: la prima è che il suo uso è limitato al livello superiore di qualunque modello di contenuto, mentre la seconda impone che gli elementi figli devono essere tutti elementi singoli e possono apparire solo una volta nel modello di contenuto, come nel seguente codice di esempio: <xsd:element name="student"> <xsd:complextype> <xsd:all> <xsd:element name="nome" type="xsd:string"/> <!--dichiarazioni di elementi--> <xsd:element name="cognome" type="xsd:string"/> </xsd:all> </xsd:complextype> </xsd:element> Per quanto riguarda gli altri modificatori (? + *), utilizzati nelle DTD, questi corrispondono nella sintassi degli schemi agli attributi MinOccur e MaxOccurr. Il primo indica il numero minimo di volte che un elemento può apparire, mentre il secondo il numero massimo. Ad nell esempio che segue viene definito un elemento nome di tipo stringa che ha una cardinalità minima e massima uguale ad uno, cioè può apparire una sola volta <xsd:element name="nome" type="xsd:string" minoccurs="1" maxoccurs="1"/> Piersalvo Ortu 43
44 CAPITOLO 3- XML SCHEMA 3.5 DICHIARAZIONE DI ATTRIBUTI Proprio come i documenti XML dipendono dagli attributi per definire ulteriormente gli elementi del documento XML, gli schemi li utilizzano per fornire informazioni specifiche sugli elementi. L assegnazione di un attributo ad un elemento e del suo relativo valore è abbastanza semplice. Ad esempio consideriamo l attributo matricola per l elemento student, definito in un documento XML: <student matricola="50123"> <nome>mark</nome> <cognome>red</cognome> </student> Per definire questo attributo nello schema bisogna utilizzare la seguente sintassi di base: <xsd:attribute name="nome-attributo" type="xsd:tipo-di-contenuto"/> È necessario prima definire l elemento student con la seguente dichiarazione: <xsd:element name="student" type="xsd:string"/> e poi espandere questo elemento con una dichiarazione <complextype>, (in quanto l elemento student contiene sottoelementi), come segue: <xsd:element name="student"> <xsd:complextype> <xsd:sequence> <xsd:element name="nome" type="xsd:string"/> <xsd:element name="cognome" type="xsd:string"/> </xsd:sequence> </xsd:complextype> <xsd:attribute name="matricola" type="xsd:string"/> </xsd:element> È inoltre possibile definire gruppi di attributi da usare all interno degli elementi. Raggruppando gli attributi, proprio come si raggruppano gli elementi, è possibile applicare un gruppo di attributi a tutti gli elementi che si desiderano, in modo che non sia necessario ridefinire continuamente l attributo usato nel documento XML. Per definire un gruppo di attributi si utilizza l elemento <attributegroup> nel seguente modo: <xsd:attributegroup name="studente"> <xsd:attribute name="matricola" type="xsd:string"/> <xsd:attribute name="corso" type="xsd:string"/> </xsd:attributegroup> Per richiamare il gruppo di attributi all interno dello stesso schema si fa uso dell attributo ref. Inoltre le dichiarazioni di attributi singoli e i riferimenti a gruppi di elementi devono apparire alla fine delle definizioni dei tipi complessi(<complextype>) come nel seguente esempio: <xsd:element name="student"> Piersalvo Ortu 44
45 CAPITOLO 3- XML SCHEMA <xsd:complextype> <xsd:sequence> <xsd:element name="nome" type="xsd:string"/> <xsd:element name="cognome" type="xsd:string"/> </xsd:sequence> <xsd:attributegroup ref="studente"/> </xsd:complextype> </xsd:element> Possiamo aggiungere infine che oltre agli attributi definiti dall utente con le modalità viste precedentemente, vi sono degli attributi predefiniti del linguaggio XML-Schema che usano un insieme preconfigurato di valori, o dei valori che rientrano in un intervallo specifico, per descrivere ciascun elemento o attributo del documento XML che lo schema XML sta descrivendo. Ogni attributo dello schema ha un ruolo specifico nella dichiarazione degli elementi XML. Tra gli attributi degli schemi troviamo i seguenti: abstract attributeformdefault base block blockdefault elementformdefault final finaldefault namespace nonamespaceshemalocation xsi:null nullable processcontents ref schemalocation xsi:schemalocation fixed form itemtype memberstypes maxoccurs minoccurs mixed name substitutiongroup targetnamespace type xsi:type use value xpath Tabella 3.2 Attributi utilizzati negli Schemi Un attributo utilizzato molto spesso negli esempi di questo capitolo è type, che viene utilizzato per definire il tipo di contenuto degli elementi o degli attributi definiti dall utente. Ad esempio l elemento nome definito di seguito deve avere un contenuto di tipo string: <xsd:element name="nome" type="xsd:string"/> Di seguito viene presentata una tabella con alcuni tipi di contenuto previsti per gli Schemi. Tipo Binary Boolean Esempio #FFF Rappresenta i dati binari in notazione esadecimale o Base 64 true o false Byte -128, 127, 5 CDATA stringa Date Decimal -10, -1.5, 0.5, 30.5 Double float -INF -0.0, 12.78E-2, -1E4, -0.0, 12.78E-2 int da a Piersalvo Ortu 45
46 CAPITOLO 3- XML SCHEMA Integre da a Language En-GB, fr Name Qualunque stringa di caratteri Negativeinteger Da a NOTATION Stringa di caratteri compatibile con XML PositiveInteger Da 1 a RecurringDate RecurringDay -31 recurringduration T13:20:00 Short da a String Stringa di caratteri Time 13:20: , 13:20: :00 UnsignedInt da 0 a UnsignedShort da 0 a Tabella 3.3 Alcuni valori previsti per l attributo type 3.6 DICHIARAZIONE DI ENTITÀ Gli schemi non offrono la stessa sintassi per la descrizione delle entità nel modo in cui sono fornite dalle DTD. La sintassi per richiamare il contenuto di un entità all interno di un documento XML si presenta nel seguente modo: <nome-entità/> Ad esempio definiamo un entità chiamata "caratt" che contiene il carattere puntointerrogativo(?): <?xml version="1.0"?> <elemento> <caratt/> <!-- riferimento all entità caratt--> </elemento> La corrispondente dichiarazione di tale entità nello schema ha la seguente forma: <xsd:element name="caratt" type="xsd:token" fixed="?"/> dove l attributo fixed impedisce che il contenuto dell entità sia fissato al valore racchiuso tra i doppi apici e non venga modificato, mentre l attributo type contiene la definizione del tipo token, che indica stringhe di caratteri(cdata), che a loro volta non contengono i caratteri di avanzamento riga, di tabulazione, spazi iniziali o finali. Piersalvo Ortu 46
47 CAPITOLO 4 FOGLI DI STILE 4.1 COSA SONO I FOGLI DI STILE XML permette di definire semanticamente un documento, fornendo la struttura e il contesto per i dati che contiene. Non è tuttavia indicato quale dovrebbe essere l aspetto dei dati visualizzati. Per manipolare l aspetto dei dati è stato creato XSL (Extensible Stylesheet Language), ossia un linguaggio creato appositamente per XML. XSL è un applicazione di XML, quindi la sua struttura e la sua sintassi sono identiche a quelle di XML. Un foglio di stile è un documento che consente di modificare in modo globale l aspetto di ciascun componente di un documento o di una serie di documenti XML. Con i fogli di stile è possibile controllare la dimensione e il colore del carattere, lo sfondo del documento o degli oggetti, i bordi delle tabelle, i comandi di un sintetizzatore vocale, tramite i cosiddetti fogli di stile acustici, e molti altri effetti sia visivi che audio. I tipi di fogli di stile più comunemente utilizzati con XML sono due: Cascading Style Sheet (CSS) e Extensible Stylesheet Language(XSL). Essi differiscono per il fatto che CSS è un linguaggio per fogli di stile studiato per consentire agli sviluppatori di controllare la presentazione dei documenti XML e HTML, mentre XSL è un linguaggio che definisce fogli di stile per trasformare i documenti XML in altri formati, ad esempio in HTML, e per dare uno stile ai documenti XML stessi. I fogli di stile CSS consentono di formattare l aspetto delle informazioni utilizzando svariate proprietà che possono essere interpretate dai browser e da altre applicazioni, e definiscono una serie di regole gerarchiche (regole di cascading), che consentono di individuare tramite l uso di particolari valori applicati alle proprietà, quali componenti di un documento HTML devono essere visualizzati e in che modo. Tutti i principali browser web (tra cui Microsoft Internet Explorer 4-5 e Netscape Navigator 4.5-6), supportano i fogli di stile CSS. I CSS consentono di separare gli elementi della presentazione di un documento dal contenuto del documento stesso, facilitandone la manutenzione e rendendo più efficiente il lavoro degli sviluppatori HTML. XSL è più flessibile e ricco di funzionalità rispetto ai CSS. XSL si articola in due parti: un linguaggio di trasformazione XSLT (Extensible Stylesheet Language Transformations), e una specifica (vocabolario) di formattazione XSL FO (XSL Formatting Objects). Piersalvo Ortu 47
48 CAPITOLO 4- FOGLI DI STILE XSLT consente di convertire le informazioni del documento XML in un formato qualsiasi, in modo tale che possa essere letto agevolmente dal browser a cui è destinato, ad esempio HTML + CSS. Quindi il processo di trasformazione attuato da XSLT consente di convertire la struttura di un documento in un altra struttura di documento, e in particolare si può dire che si passa da una struttura di tipo semantica ad una struttura di visualizzazione, quale la conversione di un documento XML in documento HTML. Inoltre il processo di trasformazione è indipendente dal risultato finale, il che consente una grande flessibilità per il futuro, nel caso si debba trasformare un documento in nuove strutture. Gli oggetti di formattazione invece possono essere utilizzati in modo simile ai fogli di stile CSS per formattare le informazioni contenute nel documento XML SCELTA TRA XSL E CSS Ci si potrebbe porre ora la domanda: Quali sono i motivi che hanno portato alla definizione del nuovo linguaggio per fogli di stile, XSL?. Dopo tutto ci sono i CSS. Cosa offre XSL in più?. Il primo motivo riguarda la sintassi: quella CSS non è compatibile con XML. I due linguaggi non differiscono solo per aspetti riguardanti la sintassi, ragione per cui essi richiedono sviluppatori con specializzazioni diverse, ma c è anche il fatto che i CSS devono essere supportati da un software diverso. Quindi se fosse possibile costruire i fogli di stile utilizzando le stesse regole di XML si potrebbe usare lo stesso software per più scopi. Un altro motivo importante riguarda il tipo di struttura. La struttura dei CSS è costituita da un flusso di regole che specificano come effettuare la visualizzazione di un elemento piuttosto che di un altro. Al contrario il foglio di stile XSL ha una struttura paragonabile ad un albero che contiene relazioni tra gli elementi, gli attributi, i commenti e le istruzioni di elaborazione. Grazie a questo tipo di struttura è possibile, trovato un determinato dato, individuarne qualsiasi altro esaminando semplicemente tali relazioni. Infine vi sono molte altre proprietà di cui i CSS non dispongono e dalle quali XSL trae vantaggio: CSS non consente di modificare l ordine di apparizione di un contenuto all interno di un documento. Il contenuto di un documento XML può apparire nell output (cioè nel browser), solo nell ordine in cui appare nel documento stesso e solo per lo stesso numero di volte. CSS non consente di visualizzare valori di attributi, anche se è possibile utilizzare questi come selettori nelle regole CSS. Analogamente i commenti e le istruzioni di elaborazione sono inaccessibili. Piersalvo Ortu 48
49 CAPITOLO 4- FOGLI DI STILE CSS non consente la formattazione dei documenti in stampa nonostante venga utilizzato per il rendering di contenuti su un browser web. Al contrario XSL consente la formattazione dei documenti in stampa grazie all uso di XSL FO VANTAGGI DI XSL In XSL è possibile aggiungere del contenuto, convertire i contenuti in HTML e persino ordinare le informazioni in modo che il visualizzatore mostri solo ciò che vogliamo. XSL incorpora un sistema avanzato di impaginazione e scorrimento che consente di creare sia documenti a scorrimento, sia documenti a pagine, con controllo sulla formattazione e sull allineamento. Vi sono inoltre dei comandi di formattazione che supportano determinati pattern di selettori per l identificazione degli elementi del documento XML e per l applicazione di opzioni di formattazione a tali selettori. Inoltre XSL supporta anche dei controlli per identificare le esatte dimensioni di una pagina e fornisce un supporto aggiuntivo per le lingue in cui si scrive dall alto verso il basso come alcune lingue orientali. Infine XSL fornisce controlli specifici per la formattazione dei collegamenti ipertestuali grazie all utilizzo del linguaggio XLink. A differenza dei CSS, XSL non costituisce una standard completamente accettato ed è ancora considerato una bozza dal W3C in quanto il documento che ne contiene tutte le specifiche viene continuamente modificato e aggiornato. 4.2 CONCETTI ALLA BASE DI XSLT Perché un documento XML non sia solo un insieme di contenuti senza alcuna particolare formattazione è necessario trasformarlo in un altra forma per essere utilizzabile. Lo standard più diffuso per effettuare questo tipo di trasformazioni è il linguaggio XSLT, il quale si appoggia ad un altro linguaggio, XPath, che consente di individuare parti specifiche di un documento XML, consentendo inoltre di rimodellare il contenuto dei documenti per adattarlo a quasi tutti gli ambienti di destinazione. Il concetto più importante di XSLT è quello della trasformazione di una struttura in un altra, ciascuna delle quali viene detta albero. Gli alberi definiti in XSLT sono due: l albero del sorgente e quello del risultato. Una trasformazione XSLT non fa altro che trasformare un albero del sorgente (il documento XML), in un albero del risultato (ad esempio in una pagina HTML). Una cosa importante da notare è che l albero del sorgente non viene modificato durante una trasformazione ma viene soltanto ristrutturato. Per effettuare una trasformazione è Piersalvo Ortu 49
50 CAPITOLO 4- FOGLI DI STILE necessario sapere quali parti dell albero del sorgente devono essere recuperate in modo tale che appaiano nell albero del risultato e quindi identificarle nel foglio di stile. Le parti dell albero del sorgente sono dette nodi e devono essere individuate tramite dei costrutti definiti dal linguaggio XPath. XSLT identifica i seguenti tipi di nodi: nodo radice, nodi di elemento, di attributo, di testo, di istruzioni di elaborazione (o PI, PROCESSING INSTRUCTION ), e infine nodi di commento e di namespace CENNI SU XPATH Come già affermato precedentemente i nodi vengono individuati tramite espressioni definite dal linguaggio XPath. Un espressione XPath non è altro che un percorso di posizione (location path), costituito da più passaggi di posizione (location step), i quali sono separati da barre trasversali ( / ). Queste espressioni possono essere paragonate ai percorsi utilizzati ad esempio nel prompt del dos per passare da una directory ad un altra. Un tipico percorso che fa riferimento ai dati dello studente contenuti in un documento XML può essere il seguente: /student/indirizzo/via dove la barra iniziale orienta la ricerca verso il nodo radice student per poi scendere al nodo figlio indirizzo che a sua volta contiene l elemento figlio via. Ogni passaggio di posizione viene considerato il contesto di quello/i che lo precedono, per cui /student considera l elemento student nel contesto del nodo radice del documento ( / ). Il nodo che definisce il contesto viene detto nodo di contesto. Il tipo di percorso visto prima è ideale per recuperare contenuti dal documento XML quando la struttura stessa del documento è semplice. Nel caso di strutture più complesse sono necessari espressioni più compatte e quindi sofisticate. In questi casi un passaggio di posizione può essere costituito dalle tre seguenti componenti: un asse, un test di nodo e un predicato, cioè : asse::testnodo[predicato] Queste tre componenti servono a selezionare un nodo (o un insieme di nodi). L asse indica all elaboratore la direzione in cui guardare a partire dal nodo di contesto. Gli assi definiti in XSLT sono in tutto 13 e sono: self oppure un singolo punto (. ) che è la forma abbreviata, individua la posizione del nodo di contesto. attribute oppure il doppio simbolo at (@@), individua la posizione di un attributo del nodo di contesto. child, individua la posizione di un nodo che discende immediatamente dal nodo di contesto. Piersalvo Ortu 50
51 CAPITOLO 4- FOGLI DI STILE parent oppure due punti in successone (.. ) individua il genitore del nodo di contesto descendant, individua tutti i nodi che discendono dal nodo di contesto a qualsiasi livello della gerarchia. Poiché solo il nodo radice e i nodi di elemento possono avere nodi figli, solo essi possono avere discendenti. descendant-or-self oppure due barre in successione ( // ), individua la posizione di tutti i nodi che discendono dal nodo di contesto, e il nodo di contesto stesso. ancestor, individua tutti gli elementi (e il nodo radice), presenti in una linea diretta al di sopra del nodo di contesto. In altri termini individua il genitore del nodo di contesto, il genitore del genitore e così via. ancestor-or-self, individua tutti i progenitori del nodo di contesto e il nodo di contesto stesso. preceding, individua la posizione di tutti i nodi che appaiono prima del nodo di contesto e nell ordine del documento, nonché tutti gli elementi che discendono da questi nodi. preceding-sibling, individua la posizione di tutti i nodi precedenti che hanno lo stesso genitore del nodo di contesto. following, individua la posizione di tutti i nodi che appaiono dopo il nodo di contesto, nell ordine del documento. following-sibling, individua la posizione di tutti i nodi che hanno lo stesso genitore del nodo di contesto. namespace, individua la posizione di tutti i nodi di namespace attivi per il nodo di contesto. La componente testnodo limita la visione di tutti i nodi lungo un determinato asse a un solo sottoinsieme di essi. Il test di nodo può essere: una verifica del tipo di nodo, al quale viene fatta tramite l impiego delle parole chiave: node(), per individuare la posizione di tutti i nodi lungo un asse specificato. text(), per individuare la posizione di tutti i nodi di testo. comment(), per individuare la posizione di tutti i nodi di commento. processing-instruction(), per individuare la posizione di tutti i nodi di istruzioni di elaborazione (PI). verifica del nome del nodo, individua la posizione del nodo di cui è stato specificato il nome ad esempio (child::nome-elemento individua l elemento indicato da nomeelemento lungo l asse figlio (child::). verifica della presenza di una PI (istruzione di elaborazione). La parte opzionale del predicato di un espressione XPath consente di valutare l insieme dei nodi definito dall asse e dal test di nodo. Tutto ciò che è compreso tra le parentesi quadre del predicato costituisce un test logico che fornisce un valore true o false, ed ha la seguente forma: nodo operatore valore Piersalvo Ortu 51
52 CAPITOLO 4- FOGLI DI STILE dove nodo è un espressione XPath, l operatore è un operatore logico (=, >=, <=, <, >,!=), il valore è un valore che deve essere confrontato con quello del nodo. Ad esempio facendo riferimento al solito documento sui dati di uno studente, si vuole sapere il nome dello studente che ha il numero di matricola : //student[@matricola="501232"]/nome dove // è la forma abbreviata dell asse descendant-or-self che individua la posizione di tutti gli elementi figli del nodo di contesto (elemento student), nonché quest ultimo. L espressione tra le parentesi quadre permette di fare il confronto tra l attributo matricola e il valore messo tra virgolette; se il confronto è vero, viene restituito il nome dello studente. Ritornando al nostro discorso, sebbene le espressione XPath siano efficaci per individuare la posizione dei contenuti all interno dei documenti XML, sono state anche sviluppate una vasta gamma di funzioni per manipolare i contenuti in svariati modi. Una funzione assume la seguente forma: nome-funzione (lista-arg) dove lista-arg è una lista di argomenti separati da virgole. Una funzione restituisce un valore al passaggio di posizione XPath che fa riferimento alla funzione stessa. Le funzioni vengono classificate in base al tipo di dati che esse restituiscono e/o su cui operano, e sono: funzioni operanti su un insieme di nodi last() restituisce un valore numerico che rappresenta il numero di nodi presenti nel contesto corrente. position() - restituisce un valore numerico che rappresenta la posizione relativa del nodo corrente all interno di un insieme di nodi. count(insieme di nodi) - restituisce un valore numerico che rappresenta il numero di nodi nell argomento (insieme di nodi). id(oggetto) restituisce l elemento il cui attributo ID-Type ha il valore stringa dell oggetto. local-name(insieme di nodi) restituisce come stringa la parte locale del nome espanso del primo nodo dell insieme di nodi passato alla funzione. namespace-uri(set di nodi) - restituisce come stringa l URI associato al namespace del primo nodo dell insieme dei nodi passati. Se non si specifica l insieme di nodi, la funzione opera sul nodo di contesto. name(insieme di nodi) - restituisce una stringa che rappresenta il nome completamente espanso, comprendente l URI del namespace associato e il nome locale, del primo nodo dell insieme di nodi passato alla funzione. funzioni per stringhe string(oggetto) restituisce il valore dell oggetto convertito in una stringa. concat(stringa1,stringa2.) concatena le stringhe indicate come parametri della funzione. start-with(stringa1,stringa2) restituisce il valore booleano true se la stringa1 inizia con stringa2, altrimenti restituisce false. contains (stringa1,stringa2) - restituisce il valore booleano true se la stringa1 contiene stringa2, altrimenti restituisce false. substring-before(stringa1,stringa2) - restituisce un valore stringa, ovvero la parte di stringa1 che appare prima del valore stringa2. Piersalvo Ortu 52
53 CAPITOLO 4- FOGLI DI STILE substring-after(stringa1,stringa2) - restituisce un valore stringa, ovvero la parte di stringa1 che appare dopo del valore stringa2. substring(stringa,numero1,numero2) - restituisce un valore stringa, ovvero la parte di stringa che inizia con la posizione del carattere numero1 e, se numero2 è incluso come argomento, contiene il numero di caratteri espresso in numero2. string-lenght(stringa) restituisce un valore numerico che rappresenta la lunghezza in caratteri di stringa. normalize-space(stringa) restituisce un valore stringa equivalente a stringa salvo che sono stati eliminati tutti gli spazi iniziali e finali e ogni combinazione di spazi all interno della stringa è stata sostituita da un unico spazio. translate(stringa1,stringa2, stringa3) - restituisce un valore stringa, che è il risultato della sostituzione di ogni carattere di stringa2 che appare in stringa1, con il carattere corrispondente a stringa3. Questa funzione è utile per convertire i caratteri miuscoli in minuscoli e viceversa. funzioni booleane boolean(oggetto) converte l argomento oggetto nel valore true o false in relazione al tipo di dato. funzioni numeriche number(oggetto) converte l argomento oggetto nel suo valore numerico, che verrà utilizzato per effettuare operazioni aritmetiche o in altri contesti in cui occorre un numero. sum(insieme di nodi) restituisce la somma dei valori stringa di tutti in nodi presenti nell argomento insieme di nodi floor(numero) restituisce il più grande numero intero minore o uguale all argomento numero. ceiling(numero) - restituisce il più piccolo numero intero maggiore o uguale all argomento numero. round(numero) - restituisce il numero intero il cui valore è il più vicino all argomento numero. 4.3 STRUTTURA DEI FOGLI DI STILE Così come i documenti e gli schemi anche i fogli di stile contengono come prima istruzione la dichiarazione XML (<?xml version="1.0"?>), di cui si era già parlato nel capitolo 1. Un tipico foglio di stile XSLT contiene un elemento radice che è identificato dalla seguente sintassi: <xsl:stylesheet version="1.0" xmlns:xsl=" <!--namespace predefinito--> [altre dichiarazioni di namespace] id="id" extension-element-prefixes="tokenizedprefixes" exclude-result- prefixes="tokenizedprefixes"> dove: version, indica la versione della specifica XML a cui il foglio di stile è conforme. altre dichiarazioni di namespace, rappresenta la possibilità di aggiungere dei namespace, oltre a quello predefinito indicato nella seconda riga della sintassi precedente. Piersalvo Ortu 53
54 CAPITOLO 4- FOGLI DI STILE Questi namespace devono tener conto dei requisiti dell elaboratore XSLT ed eventualmente dell elaboratore che deve produrre l output. Alcuni dei namespace più utilizzati sono: xmlns=" il quale indica che gli elementi del foglio di stile deve essere conformi ad HTML versione 4.0 xmlns=" questo namespace è utilizzato per indicare che il foglio di stile è conforme alla specifica XHTML 1.0. xmlns:wml=" viene utilizzato per trasformare XML nel linguaggio WML (WIRELESS APPLICATION PROTOCOL), il linguaggio utilizzato nella telefonia cellulare. id, viene utilizzato per richiamare il foglio di stile quando questo è contenuto all interno del documento che deve essere trasformato. Il valore dell attributo è unico e viene utilizzato come valore dell attributo href come nel seguente esempio: <xsl:stylesheet type="text/xsl" href="foglio.xsl"> <elemento radice> [etc] <xsl:stylesheet id="foglio" version="1.0" xmlns:xsl=" [ecc] </xsl:stylesheet> [etc] </elemento radice> È anche possibile utilizzare la forma <xsl:transform> al posto di xsl:stylesheet. All interno dei tag <xsl:stylesheet> saranno presenti tutti gli elementi necessari per effettuare la trasformazione del documento XML nella struttura voluta. Molti elementi XSL possono essere utilizzati per recuperare dati dal documento XML come per esempio l elemento (xsl:value-of ). Gli elementi XSL combinati con gli attributi XSL forniscono altre prestazioni per il corretto recupero dei dati necessari dal documento XML. Gli elementi XSL si comportano come comandi e indicano all elaboratore XSL come gestire i dati. Nella tabella seguente vi è un elenco completo degli elementi XSL supportati: Elemento XSL xsl:applytemplates xsl:attribute xsl:cdata xsl:choose Descrizione Indica all elaboratore XSL di cercare il modello corretto da applicare, in base al pattern specificato. Genera un nodo di attributo e lo applica all elemento di output. Genera una sezione CDATA nell output. Consente di eseguire test condizionali. Questo elemento viene utilizzato in combinazione con gli elementi xsl:otherwise e xsl:when. Piersalvo Ortu 54
55 CAPITOLO 4- FOGLI DI STILE xsl:comment xsl:copy xsl:definetemplate-set xsl:element xsl:entity-ref xsl:eval xsl:for-each xsl:if xsl:node-name xsl:otherwise xsl:pi xsl:script xsl:stylesheet xsl:template xsl:value-of xsl:when Crea un commento nella struttura di output. Crea una copia del nodo di destinazione dalla fonte da includere nell output. Definisce un insieme di modelli a un specifico livello di validità. Genera un elemento nell output con il nome specificato. Genera un riferimento all entità nell output con il nome specificato. Valuta una stringa di testo, solitamente codice script. Applica lo stesso modello a più nodi del documento. Consente test condizionali in un modello. Inserisce il nome del nodo corrente nell output come stringa di testo. Fornisce test condizionali. Questo elemento viene utilizzato incombinazione con gli elementi xsl:choose e xsl:when. Genera un istruzione di elaborazione nell output. Definisce dichiarazioni e funzioni di variabili globali. Definisce l insieme di modelli che vengono applicati alla struttura del documento di origine per generare il documento di output. Definisce un modello per l output basato su un pattern specifico. Valuta un pattern XSL specificato nell attributo select e restituisce il valore del nodo identificato come testo, che verrà poi inserito nel modello. Fornisce test condizionali. Questo elemento viene utilizzato in combinazione con gli elementi xsl:choose e xsl:otherwise COLLEGAMENTO DI UN FOGLIO DI STILE AD UN DOCUMENTO XML Come si è visto nei capitoli precedenti circa l associazione di una DTD o di uno schema ad un documento XML, anche i fogli di stile devono essere richiamati all interno di un documento. Per associare un foglio di stile XSLT ad un documento XML è necessario utilizzare la seguente istruzione di elaborazione: <xml:stylesheet type="text/xsl" href="uri"?> dove URI è l Uniform Resource Identifier, (ad esempio un indirizzo Web), che specifica la posizione del foglio di stile. Ad esempio: <?xml version="1.0" standalone="no"?> <?xml:stylesheet type="text/xsl" href="librettofstyle.xsl"?> Piersalvo Ortu 55
56 CAPITOLO 4- FOGLI DI STILE <student Matricola="20546"> <nome>marco</nome> </student> dove l attributo href ha come valore il nome del foglio di stile che deve essere recuperato mentre l attributo type rappresenta il tipo di foglio di stile che si sta utilizzando UTILIZZO DI MODELLI Il foglio di stile definisce una serie di regole di modello, delle quali la più comune è quella definita dall elemento <xsl:template>. Ciascuna regola è costituita da: Un pattern di corrispondenza, che indica quali parti del documento XML saranno elaborate da questa regola di modello. Un modello, da creare nell output quando il contenuto corrispondente viene individuato nel documento XML. La condizione di corrispondenza è specificata dall attributo match dell elemento xsl:template, e oltre a questo possono essere specificati anche altri attributi che sono considerati facoltativi. Il tag di apertura dell elemento xsl:template contiene la seguente sintassi: <xsl:template match="espressione Xpath" name="nome" priorità="priorità" mode="modalità"> L attributo più importante è match che contiene come valore un espressione XPath, la quale specifica mediante un espressione di percorso dove è possibile recuperare i dati contenuti in documento XML. Le regole di modello possono essere di due tipi: regole di modello incorporate ed esplicite. Le prime sono dette incorporate in quanto sono contenute all interno di qualsiasi elaboratore XSLT conforme, cioè sono regole predefinite per un documento XML. Ogni nodo (elemento, attributo ecc), di un documento XML, ha la propria regola incorporata, ognuna delle quali ha l unico compito di trasferire i nodi di testo rilevati nel documento all albero del risultato. Le regole di modello predefinite sono: Quella per l elemento radice e tutti i nodi elemento definita dal seguente modello: <xsl:template match="* /" <xsl:apply-templates/> </xsl:template> Piersalvo Ortu 56
57 CAPITOLO 4- FOGLI DI STILE dove il valore dell attributo match specifica che la regola si applica a tutti i nodi di elemento (specificato dall asterisco), o ( ), al nodo radice (specificato dalla barra). Quella per i nodi di testo e per gli attributi definita nel seguente modo: <xsl:template <xsl:value-of select="."/> </xsl:template> Questa regola di modello afferma che può essere applicata a qualsiasi nodo di un documento XML, che sia un nodo di testo (indicato dall espressione XPath text()), o un nodo di attributo (rappresentato dal carattere pipe ( ) ) avente un qualsiasi nome (indicato tramite la ). Pertanto un foglio di stile contenente regole predefinite ha l aspetto seguente: <xsl:stylesheet version="1.0" xmlns:xsl=" xmlns:xsl=" <xsl:template match="* /" <xsl:apply-templates/> </xsl:template> <xsl:template <xsl:value-of select="."/> </xsl:template> </xsl:stylesheet> Nella seconda regola, la non permette la lettura dei valori degli attributi dal documento XML in quanto gli attributi di un elemento sono invisibili quando si effettua la scansione dell asse figlio. Pertanto bisogno utilizzare una regola esplicita che scavalchi quella predefinita che ha le seguenti caratteristiche: <xsl:template match="* /" <xsl:apply-templates select="* </xsl:template> Tale regola specifica che occorre elaborare tutti gli elementi figli, indipendentemente dal loro nome (indicato dall (*) nell attributo select), da tutti i nodi di testo (text()), e da tutti i nodi visibili lungo l asse di attributo. Le regole incorporate possono essere, tutte o in parte ignorate, codificando una regola di modello esplicita che interessi gli stessi nodi che sono interessati dalle regole predefinite. È possibile quindi specificare un numero qualsiasi di regole esplicite, in base alle proprie esigenze e a quello che si vuole ottenere in output. Ad esempio dato il seguente frammento di documento XML contenente i dati relativi agli esami sostenuti da uno studente: <?xml version="1.0" standalone="no"?> Piersalvo Ortu 57
58 CAPITOLO 4- FOGLI DI STILE <?xml:stylesheet type="text/xsl" href="fstyle.xsl"?> <!DOCTYPE student SYSTEM "librettodtd.dtd"> <student Matricola="205456"> <nome>marco</nome> <cognome>rossi</cognome> <corso>ingegneria INFORMATICA</corso> <esami_sostenuti> <materia>matematica</materia> <voto>25</voto> <data>12/08/2002</data> <docente>fabio Rossi</docente> </esami_sostenuti> </student> Affinché queste informazioni possano essere visualizzate in un certo modo, bisogna applicare al documento un foglio di stile, che in questo caso trasforma il documento XML in HTML, come il seguente: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl=" xmlns=" <xsl:template match="/"> <html> <body bgcolor="black" align="center"> <div style="margin-left=200px;font-weight:bold;font size:20"> <span style="font-weight:normal;color:red"> LIBRETTO VIRTUALE <br /> CORSO DI <xsl:value-of select="student/corso"/> </span> </div> <br /> <xsl:apply-templates select="student/esami_sostenuti"/> </body> </html> </xsl:template> <xsl:template match="esami_sostenuti"> <table align="center" bgcolor="white" border="5" cellpadding="10"> <tr> <td>materie</td> <td>voto</td> <td>data</td> <td>docente</td> </tr> <tr align="bottom"> <td> <xsl:value-of select="materia"/> </td> <td> Piersalvo Ortu 58
59 CAPITOLO 4- FOGLI DI STILE <xsl:value-of select="voto"/> </td> <td> <xsl:value-of select="data"/> </td> <td> <xsl:value-of select="docente"/> </td> </tr> </table> </xsl:template> </xsl:stylesheet> In questo foglio di stile è stata definita una regola di modello <xsl:template match="esami _sostenuti"> che si occupa di creare una tabella contenente delle celle (<TD>) con i dati (materia,voto ecc), relativi agli esami sostenuti. I dati vengono trovati nel documento XML tramite le espressioni <xsl:value-of select=" " />, oppure possono essere recuperati da un database come Access, per avere una maggiore efficienza, come si vedrà nel capitolo 6. Piersalvo Ortu 59
60 CAPITOLO 5 SOFTWARE PER XML 5.1 EDITOR XML Uno degli strumenti software di cui non si può far a meno per lavorare con il linguaggio XML è l editor che ci consente di creare un documento XML. È possibile utilizzare un semplice editor di testo, per esempio il Block Notes di Windows, però ciò rappresenta una restrizione in quanto non permette a chi scrive il documento di sapere se si sono commessi errori o meno. Per essere certi che il documento che si sta creando sia sintatticamente corretto è necessario utilizzare un software in grado di discriminare i tipi di dati sottoposti ad editing. Tra i vari software di edit attuali, troviamo: XML-Notepad, un tool freeware rilasciato da Microsoft con il quale è possibile creare gli schemi, i fogli di stile e i documenti XML. Amaya sviluppato dall World Wide Web Consortium, funziona sia da editor che da browser e supporta la maggioranza degli standard promossi dal W3C, compreso XML e molti altri linguaggi che ne derivano. L interfaccia di Amaya è dotata di numeri di linea che agevolano l individuazione di eventuali errori rilevati durante l analisi del documento. Amaya può essere prelevato nel sito del W3C all indirizzo Il Real Time Xml Editor sviluppato da Architag, con il quale è possibile creare documenti XML e avere un controllo in tempo reale se si stanno commettendo errori. Oltre ai tool di edit citati sopra, ve ne sono altri decisamente più sofisticati che incorporano una molteplicità di opzioni, tra cui la possibilità di creare fogli di stile, DTD/Schemi, file HTML, tutto con un unico software. I software a cui ho fatto maggior riferimento per questa tesi sono due: XMLWriter 2.0 della Wattle Software e XML Spy 5.0 della Icon Information System. Entrambi i software sono abbastanza completi in quanto permettono di creare tutti i tipi di file, dal documento XML, al foglio di stile, allo Schema/DTD, persino documenti CML (che trattano formule chimiche), ed MML (che trattano formule matematiche). XmlWriter 2.0 consente di creare, una volta definito un documento con il relativo SCHEMA/DTD e il foglio di stile, un file di output a partire dal foglio di stile. Ad esempio se il foglio di stile viene utilizzato per trasformare il documento XML in HTML il file di output sarà una pagina di puro HTML. È possibile anche visualizzare Piersalvo Ortu 60
61 CAPITOLO 5- SOFTWARE PER XML direttamente il risultato della trasformazione (ad esempio una pagina HTML), sul browser incorporato nell editor, oppure richiedere la visualizzazione ad un browser esterno il quale deve essere opportunamente selezionato a seconda della trasformazione che si è effettuata, in modo che i risultati di quest ultima possano essere adeguatamente visualizzati. XML Spy è un pacchetto di editing disponibile unicamente per le piattaforme Windows. Tra le caratteristiche principali di questo software vi è la possibilità di visualizzare i documenti in quattro modi differenti: una modalità Grid per l editing strutturato, una modalità Database/Table per la visualizzazione di elementi sotto forma di tabelle, una modalità Text usata anche nell editor XML Writer 2.0, con sintassi a colori per operazioni di basso livello e infine una modalità con browser integrato per documenti, che supporta i fogli di stile CSS e XSL. L interfaccia di XML Spy contiene una molteplicità di finestre e icone che permettono di facilitare la creazione di qualunque tipo di documento (Figura 5.1). Il documento XML, i fogli di stile, gli Schemi e così via appaiono nella finestra principale al centro della pagina. Nella parte sinistra dell interfaccia vi sono due finestre secondarie che visualizzano la struttura delle directory del progetto corrente, mentre a destra vi sono tre finestre: quella in alto mostra gli elenchi degli elementi figli disponibili, quella al centro gli attributi disponibili per l elemento in quel momento selezionato e, quella in basso le entità. Figura 5.1 Interfaccia di XML Spy Piersalvo Ortu 61
62 CAPITOLO 5- SOFTWARE PER XML Come già accennato precedentemente, con XML Spy è possibile creare tanti tipi di documenti tra i quali anche gli schemi. Esso supporta l editing e la convalida degli schemi dei seguenti documenti: Definizione del tipo di documento(dtd) Descrizione del contenuto del documento (DCD) XML DATA Reduced(XDR) BizTalk XML Schema Definition(XSD) Una delle caratteristiche che fa di questo software uno tra i più sofisticati è il fatto che è possibile utilizzando un documento XML già esistente, ottenere da questo la creazione della DTD o dello schema in automatico, risparmiando una grande quantità di tempo e di lavoro. Ovviamente questa DTD o schema non saranno perfetti nei minimi particolari se non vengono indicate le varie situazioni che possono essere usate per i diversi elementi e attributi. Infine possiamo aggiungere che è possibile, così come previsto per i documenti XML, visualizzare lo schema in modalità testo o ad albero, quest ultima visibile nella Figura 5.2. Figura 5.2 Modalità di visualizzazione ad albero per la creazione e la modifica immediata di Schemi con XML Spy. Piersalvo Ortu 62
63 CAPITOLO 5- SOFTWARE PER XML 5.2 ANALIZZATORI NON CONVALIDANTI Oltre agli editor usati per creare i documenti XML, un altro software che non può certo mancare quando si lavora con XML è l analizzatore (o parser), il quale ci permette di trovare qualsiasi possibile errore e incongruenza presente nei nostri documenti. Esistono due tipi diversi di analizzatori: quelli non convalidanti e quelli convalidanti. Gli analizzatori non convalidanti sono gli strumenti più semplici e comuni per controllare un documento XML. Essi si limitano a verificare che il documento XML in esame sia formalmente corretto (Well-Formedness, ben formato), secondo le regole sintattiche di XML. Essi non garantiscono che tutti i tag XML siano corretti, perché non sono in grado di verificare la correttezza. Si limitano soltanto a verificare che per ogni tag di apertura ve ne sia uno di chiusura o che il tag sia di tipo vuoto, e così via. Attualmente vi è una vasta gamma di analizzatori non convalidanti. Uno di quelli più conosciuti è l elaboratore MSXML fornito dalla Microsoft, che è tra l altro fornito col browser di Internet Explorer e le cui caratteristiche variano a seconda della versione del browser stesso. Questo elaboratore verifica che il documento sia formalmente corretto, senza convalidare il codice del documento XML, anche se è possibile, con delle modifiche, avere la versione convalidante dell analizzatore stesso. Anche la versione 6 del browser di Netscape Navigator è dotata di un analizzatore, detto expat. L incorporamento delle funzionalità dell analizzatore all interno di un browser è molto utile in quanto consente di verificare i propri documenti con un unico software, evitando in tal modo di utilizzare un software per controllare se il documento è corretto e un altro per visualizzarlo. Vi sono anche degli analizzatori che non sono incorporati nei browser. Questi visualizzano un messaggio che indica il tipo e la posizione degli errori se questi sono presenti nel documento, altrimenti, l analizzatore genererà un messaggio in cui si dice che il documento è formalmente corretto. Se invece l analizzatore è incorporato nel browser e il documento non contiene errori, il browser di solito mostrerà il contenuto del documento XML. Inoltre sono disponibili online degli analizzatori XML non convalidanti, i quali esaminano il documento sulla macchina locale verificando che sia formalmente corretto. Uno di questi è RUWF, raggiungibile all indirizzo il quale consente di digitare l indirizzo di un qualsiasi documento XML accessibile tramite internet e in seguito lo analizza. Piersalvo Ortu 63
64 CAPITOLO 5- SOFTWARE PER XML Un aspetto da tenere in considerazione è il fatto che analizzatori diversi possono produrre risultati diversi quando si visualizzano i documenti. Ciò è consentito dalla specifica XML ANALIZZATORI CONVALIDANTI Gli analizzatori convalidanti devono svolgere un compito supplementare rispetto a quelli non convalidanti. Infatti oltre a verificare che il documento sia formalmente corretto, essi controllano che il documento sia conforme ad una specifica DTD sia interna che esterna, o ad uno Schema. Gli analizzatori convalidanti analizzano ogni elemento del documento XML e lo confrontano con la DTD fornita insieme al documento. Nel caso vengano riscontrate delle incongruenze tra il documento e la DTD associata, l analizzatore produce un messaggio di errore contenente la descrizione dei problemi riscontrati nei documenti. Perciò si può dire che il requisito fondamentale affinché un documento possa essere convalidato è che esso sia associato ad una DTD che documenti la struttura stessa del documento XML. Per quanto riguarda i software utilizzati per la convalida dei documenti XML, si possono utilizzare entrambe i software citati prima, XML Spy e XML Editor 2.0, i quali possono anche essere utilizzati semplicemente come analizzatori non convalidanti, per verificare solo la correttezza formale dei documenti, oppure sfruttare entrambe le possibilità. Per la convalida inoltre, è possibile anche utilizzare degli analizzatori online, ad esempio LTG XML Well-Fomedness Checker and Validator presente nel sito Web dell università di Edimburgo ( Questo analizzatore è di tipo convalidante e si basa sull LT XML, un elaboratore sviluppato da tale università. 5.4 ELABORATORI XSLT Il software a cui si fa affidamento nelle trasformazioni XSLT è l elaboratore XSLT. Tra i vari elaboratori vi è quello fornito della Microsoft come parte accessoria del processore MSXML, a sua volta integrato nel browser Microsoft Internet Explorer. In questi ultimi anni sono state rilasciate molte versioni di tale elaboratore, ad esempio la versione MSXML 2.0 è parte integrante di Internet Explorer 5.0, mentre MSXML 2.5 è stato incorporato nella versione di Windows Successivamente era stata anche proposta una versione provvisoria, la 2.6, che includeva la maggior parte delle caratteristiche che poi sarebbero state incluse nella versione successiva, Piersalvo Ortu 64
65 CAPITOLO 5- SOFTWARE PER XML la 3.0, e di cui si parlerà più avanti. Attualmente è stata rilasciata anche la versione 4.0 di tale elaboratore. Per quanto riguarda la versione MSXML 3.0, essa prevede delle caratteristiche addizionali rispetto alle versioni precedenti, che includono un nuovo supporto sia per la specifica W3C XPATH 1.0, sia per la specifica XSLT 1.0, per Microsoft XML Schema, in particolare per gli schemi di tipo (XDR-XML Data Reduced), e infine viene fornito un supporto per SAX (Simple API for XML), il quale fornisce un interfaccia (API Application Programming Interface), che permette di interagire con il processo di analisi o (parsing) di un documento XML, all interno di script o altri linguaggi di programmazione. MSXML3 inoltre supporta la specifica DOM (Document Object Model), che definisce la struttura logica di un documento XML vista come una semplice gerarchia di nodi, e l interfaccia che deve essere resa disponibile alle applicazioni che ne devono fare uso. In particolare il compito del DOM è quello di rendere disponibili gli elementi di un documento, (elementi, attributi, entità ecc), cosicché questi possano essere manipolati individualmente attraverso linguaggi di script quali (JavaScript o Visual Basic Script), o altri linguaggi di programmazione come il C++ o il Visual Basic. Il compito principale di questo elaboratore è di leggere e analizzare il documento XML e il foglio di stile, e se non vengono rilevati errori si ottiene il risultato della trasformazione. Tale risultato può essere in forma di file o di documento virtuale. Nel primo caso si dice che l elaboratore è statico, perché l output viene memorizzato in un file statico sotto forma di testo, ad esempio codice HTML. Nel secondo caso invece si dice che l elaboratore è di tipo dinamico, in quanto il risultato della trasformazione viene direttamente visualizzato sul browser. La maggior parte degli elaboratori può essere installata ed eseguita tanto in modalità statica quanto in modalità dinamica, il che li rende idonei per applicazioni sia offline/batch sia online basate su server. MSXML rientra nel secondo caso, cioè può essere considerato come un elaboratore di tipo dinamico, in quanto esso è destinato ad essere utilizzato unicamente all interno di I.Explorer. Perciò i documenti prodotti dalle trasformazioni sono solo di tipo virtuale. Per quanto riguarda invece gli elaboratori statici, essi sono spesso programmi a linea di comando, scritti in Java o in un linguaggio di programmazione come il C++. Tale caratteristica ne fa degli strumenti molto efficienti, utilizzabili in un ambiente nel quale per esempio può capitare che si debbano trasformare centinaia di documenti XML nei loro Piersalvo Ortu 65
66 CAPITOLO 5- SOFTWARE PER XML omologhi HTML. Infine c è un aspetto importante riguardo MSXML, ed è il fatto che esso è dotato di un proprio foglio di stile, che è in realtà quello di default. Ciò significa che se un documento XML non è collegato ad uno specifico foglio di stile tramite l istruzione <?xsl:stylesheet >, verrà applicato al documento quello di default. Esso visualizzerà il documento XML come una struttura ad albero che può essere compressa o espansa, come quella di figura 5.3. Figura 5.3 Visualizzazione ad albero di un documento XML MSXSL.EXE Continuando il discorso sugli elaboratori XSLT, la Microsoft fornisce un utility, MSXSL eseguibile tramite linea di comando. Questa utility non funziona in modalità standalone, ma utilizza la DLL MSXML3.dll, presente nella directory System di Windows, per effettuare il processo di trasformazione. La linea di comando attraverso cui è possibile interagire con l elaboratore si presenta così: MSXSL source stylesheet [options] [param=value...] [xmlns:prefix=uri...] dove source rappresenta il documento XML che deve essere trasformato, stylesheet è il foglio di stile a cui è collegato il documento XML. Ad esempio per trasformare un Piersalvo Ortu 66
67 CAPITOLO 5- SOFTWARE PER XML documento XML definito doc.xml utilizzando un foglio di stile denominato foglio.xsl bisogna eseguire la seguente linea di comando: MSXSL doc.xml foglio.xsl -o out.xml In questo caso è stata aggiunta l opzione o out.html, che indica all elaboratore di creare un file di output (in questo caso out.xml), che può essere ad esempio un file HTML, il quale contiene i risultati della trasformazione effettuata. Se tale opzione viene omessa l elaboratore invia il risultato della trasformazione al browser. Nella seguente tabella vi è un elenco delle opzioni utilizzabili dalla linea di comando:? o filename m startmode xw xe v pi u version t Show this message Write output to named file Start the transform in this mode Strip non-significant whitespace from source and stylesheet Do not resolve external definitions during parse phase Validate documents during parse phase Get stylesheet URL from xml-stylesheet PI in source document Use a specific version of MSXML: '2.6', '3.0', '4.0' Show load and transformation timings Dash used as source argument loads XML from stdin Dash used as stylesheet argument loads XSL from stdin Tabella 5.1 Elenco opzioni Il campo [param=value...] della linea di comando, invece permette di passare dei parametri al foglio di stile. Tali parametri sono usati per modificare il comportamento del foglio di stile senza richiedere cambiamenti di codice nel foglio di stile. Infine il campo [xmlns:prefix=uri...], serve per dichiarare un namespace. Tale dichiarazione consente di associare un prefisso, (prefix), con un determinato URI (Uniform resource Identifier). Il prefisso, non è altro che un alias del namespace stesso. Per ulteriori informazioni sulle caratteristiche di tale elaboratore è possibile far riferimento alla libreria MSDN della Microsoft, all indirizzo SCELTA DEGLI EDITOR E DEI BROWSER Lo scopo principale di questa tesi non è quello di fare una guida del linguaggio XML, ma di spiegare in che modo i documenti XML possano essere visualizzati da tutta una serie di dispositivi diversi fra loro, grazie alle trasformazioni XSLT che permettono la conversione dal formato XML a un qualsiasi altro formato definito dal relativo foglio di stile collegato al Piersalvo Ortu 67
68 CAPITOLO 5- SOFTWARE PER XML documento XML. Per raggiungere tale obiettivo, bisogna prendere in prima considerazione i vari software che si dovranno utilizzare per creare i documenti XML, gli schemi e i fogli di stile, poi quelli per effettuare le trasformazioni XSLT e infine i browser per visualizzare i risultati delle trasformazioni effettuate. Si è già parlato nei paragrafi precedenti dei vari software disponibili nell ambiente XML alcuni più o meno sofisticati di altri. Per creare e verificare i documenti di cui si tratterà nel prossimo capitolo, si è utilizzato il tool di editing XML SPY, che offre la possibilità di creare, controllare la correttezza formale e convalidare un ampia gamma di tipi di documento, il tutto utilizzando un unico software, il che rende la vita più facile allo sviluppatore in termini di costi e di tempo. Inoltre è di grande aiuto durante la fase di progettazione dei fogli di stile in quanto consente di avere una visione immediata dei risultati della trasformazione effettuata attraverso il mini browser integrato. Per svolgere tale compito Spy si affida all elaboratore MSXML, di cui è possibile scegliere la versione 3 o 4, dal menù opzioni. Per quanto riguarda la scelta dei browser per la visualizzazione dei documenti, si è scelto di utilizzare Internet Explorer 5-6 e Netscape 6-7 per visualizzare i risultati delle trasformazioni da XML ad HTML. Tali trasformazioni possono essere eseguite sul server per poi inviare i risultati al client, oppure si può affidare tale compito direttamente al client, alleggerendo il carico al server. In questo secondo caso sia I.Explorer 5 che I.Explorer 6, possono effettuare loro stessi le trasformazioni, in quanto le ultime versioni di questo browser supportano XML e le trasformazioni. Per assicurarsi che si stia utilizzando XSLT e non la precedente specifica XSL, bisogna assicurarsi che sia presente, MSXML3.dll, in Windows/System. Per ulteriori informazioni su questo argomento fare riferimento alla libreria MSDN della Microsoft. Per le versioni precedenti alla 5, cioè I.Explorer 4-3, le trasformazioni dovranno essere effettuate sul server, il quale poi invierà i risultati al client, in formato HTML. Per quanto riguarda invece i browser Netscape 6-7, anch essi supportano XML, anche se bisogna dire che quest ultimi lavorano con i fogli di stile CSS per visualizzare le informazioni contenute nei documenti XML, nei browser, a differenza di IE che supporta entrambe. Piersalvo Ortu 68
69 CAPITOLO 6 PROGETTAZIONE 6.1 PROGETTO: LIBRETTO UNIVERSITARIO VIRTUALE - INTRODUZIONE L obiettivo principale di questo capitolo e, in effetti quello di tutta la tesi è di spiegare in che modo i documenti XML possano essere adattati alla visualizzazione su un ampia gamma di dispositivi dai browser internet, ai dispositivi di telefonia mobile, alla televisione e addirittura si è pensato ad applicazioni per i linguaggi dei disabili, quali il Braille o i testi acustici. In questo contesto si farà riferimento soprattutto ai browser internet come Explorer e Netscape e ai dispositivi di telefonia mobile (Browser Wap). Tutto ciò non sarebbe potuto avverarsi senza XML e linguaggi di stile applicati ai documenti, quali XSL-XSLT e CSS. Infatti ciò che permette di poter visualizzare un unico documento in vari dispositivi e con diverse forme sono proprio i fogli di stile che vengono applicati al documento. Senza di essi un documento XML sarebbe un semplice insieme di dati di testo senza alcun aspetto e tipo di formattazione. Il modo migliore per vedere in opera la potenza di questo linguaggio è creare un esempio e vedere in che modo è possibile raggiungere gli obiettivi prima enunciati. In questo capitolo verrà presa in esame la progettazione di un applicazione XML, che consiste in un prototipo di libretto universitario virtuale a cui ciascun studente può accedere per verificare i propri dati. Prima di procedere, sarebbe opportuno disporre di un server locale per poter accedere all applicazione direttamente dal browser. In questo caso è stato utilizzato Personal Web Server fornito con Windows 98. Una volta installato nel sistema, si deve memorizzare l applicazione sul server, in c:/inetpub/wwwroot. All interno della cartella wwwroot ho creato un altra directory chiamata libretto, che contiene tutti i file del progetto, che verranno trattati nel corso del capitolo. Iniziamo ad entrare nei dettagli dando un occhiata al modulo o Form chiamato accesso_al_libretto.html, che consente di accedere alle informazioni del libretto, di cui di seguito è presentato il codice HTML. La figura 6.1 mostra la pagina HTML visualizzata su I.Explorer, nella quale devono essere inseriti i dati Cognome e Matricola dello studente che vuole accedere alle proprie informazioni. <html> <head> <title></title> </head> <body bgcolor="cyan"> Piersalvo Ortu 69
70 CAPITOLO 6- PROGETTAZIONE <h1 align="center" >MODULO DI ACCESSO AL LIBRETTO VIRTUALE</h1> <form id="frmprenota" name="frmprenota" action="transform.asp" method="post"> <p align="left"> Inserire i seguenti dati: <br></br> Cognome: <input id="txtcognome" name="txtcognome" style="margin-left:0px" size="35"> <br /> Matricola: <input type="text" name="txtmatricola" style="margin-left:0px;" size="35"> <br /> </p> <center> <p> <input id="cmdsubmit" name="cmdsubmit" type="submit" value="invia"> <input id="cmdreset" name="cmdreset" type="reset" value="cancella"> </p> </center> </form> </body> </html> Analizzando brevemente il codice HTML, è possibile notare l elemento <form.> che viene utilizzato per creare il modulo, e i due elementi di input: uno per il Cognome e l altro per la Matricola. L elemento form inoltre possiede due attributi importanti: action e method. Il primo ha per valore un URI, in questo caso Transform.asp, che indica il programma che deve elaborare i dati raccolti nel Form, mentre Method indica il metodo utilizzato nella trasmissione dei dati al server. Nel nostro caso si è scelto il metodo POST, il quale specifica che il contenuto del modulo viene semplicemente spedito a un indirizzo specificato, ovvero tutti i campi del form vengono riuniti ed elaborati per formare uno o più messaggi . Figura 6.1 Modulo di accesso al libretto dello studente Piersalvo Ortu 70
71 CAPITOLO 6- PROGETTAZIONE Per avere accesso alla pagina principale del libretto, di figura 6.1, basta digitare nella barra degli indirizzi di I.Explorer l URL, Infine considerando l applicazione del libretto in un contesto più ampio, ad esempio rendendo accessibile le informazioni del libretto dal sito di un università, come quello del Politecnico, si potrebbe creare un LINK interno al sito che permette di accedere al modulo di figura FASI DEL PROGETTO In questo paragrafo verranno esaminate le varie fasi di progettazione del libretto. Il primo passo da compiere è la creazione del documento XML, della relativa DTD o dello Schema e infine dei vari fogli di stile da applicare al documento per ottenere varie visualizzazioni a seconda del browser utilizzato. Questo lavoro di editing può essere fatto utilizzando XML Spy, di cui si è parlato nel Capitolo 5, grazie al quale è possibile anche ottenere la DTD o lo Schema in automatico una volta creato il documento XML (salvo qualche piccola modifica), con un notevole risparmio di tempo ed energie. La seconda parte del progetto consiste nella progettazione Lato-Server e quindi nella stesura di uno o più script (in questo caso in linguaggio VBScript), che consentano di effettuare le trasformazioni Lato-Server nei vari formati a seconda del tipo di browser utilizzato per accedere al libretto virtuale. Ma iniziamo ad entrare nel dettaglio. Il primo documento da creare è il documento XML che contiene tutti i riferimenti ai dati generali di uno studente quali nome, cognome, matricola e così via dicendo. Pensare di creare un documento XML con queste informazioni per ciascun studente è alquanto laborioso e poco pratico. Infatti come si può certo immaginare gli studenti di un università sono numerosissimi, quindi si avrà una grande mole di dati da gestire. Per cui si può pensare di memorizzare tali informazioni su un database ad esempio MS-Access, oppure si potrebbe anche utilizzare SQL Server 2000, il quale prevede un supporto per i dati strutturati come quelli dei documenti XML. Il vantaggio che ne deriva dall utilizzo del database è la possibilità di generare in automatico e in tempo reale il documento XML. Infatti una volta recuperate le informazioni dal database è possibile convertire queste ultime, memorizzate sotto forma di tabelle, direttamente in un documento XML, per poi applicare a quest ultimo le trasformazioni XSLT e infine inviare i risultati al dispositivo client. Tutte queste operazioni naturalmente saranno eseguite Lato-Server. Piersalvo Ortu 71
72 CAPITOLO 6- PROGETTAZIONE In questo progetto verrà utilizzato il database di Access, che contiene una tabella principale Students, per i dati degli studenti, formata dai seguenti campi o colonne: Nome, Cognome, Matricola, Codice_fiscale, Corso, Indirizzo, , Cellulare, Telefono, Fotostudente, più un altra tabella denominata esami, nella quale verranno memorizzati gli esami registrati di tutti gli studenti, ciascuno identificato dalla proprio numero di Matricola, che costituisce la chiave primaria di ricerca, all interno della tabella esami. Tale tabella è formata dai seguenti campi: Materia, Voto, Data, Docente, più la colonna, Matricola come in figura 6.2a. Figura 6.2 Tabella dei dati degli Figura 6.2a Tabella degli esami studenti in Access Supponiamo di aver convertito le informazioni di uno studente nel rispettivo documento XML. In realtà i documenti che vengono creati sono due, di cui uno derivante dai dati della tabella Students con elemento radice <students> e l altro derivante dalla tabella esami, visibile nella figura 6.2a, che contiene i dati sugli esami registrati nel libretto. Questo secondo documento ha come elemento radice il marcatore <exams>. I documenti XML ottenuti avranno una struttura come quella descritta nel prossimo paragrafo. 6.3 DOCUMENTI XML Documento 1- (Students.xml) <students> <student> <nome>piersalvo</nome> <matricola>508018</matricola> <cognome>ortu</cognome> <codice_fiscale>454557df854f4sdf6</codice_fiscale> <corso>ingegneria_informatica</corso> <indirizzo>via MONTIFERRU 22</indirizzo> < >[email protected]</ > <cellulare> </cellulare> <telefono>0785/321156</telefono> </student> Piersalvo Ortu 72
73 CAPITOLO 6- PROGETTAZIONE </students> Documento 2 esami1.xml) <exams> <exam> <materia>matematica1</materia> <voto>25</voto> <data>11/12/03</data> <docente>fabio Rossi</docente> </exam> <exam> <materia>fisica1</materia> <voto>22</voto> <data>11/06/01</data> <docente>ted Tartaglia</docente> </exam> <exam> <materia>elettrotecnica1</materia> <voto>28</voto> <data>23/10/01</data> <docente>mark Ross</docente> </exam> </exams> I documenti XML riportati sopra, come ci si potrebbe aspettare, non contengono come prima riga di codice la dichiarazione XML a cui è conforme il documento, la quale deve essere sempre inclusa e nemmeno la dichiarazione della DTD a cui devono essere collegati i documenti, per essere convalidati. Per verificare che i documenti XML ottenuti dalla conversione siano validi, viene eseguita la funzione reportparseerror scritta in Jscript. Quest ultima fa parte di uno script più grande che verrà presentato a fine capitolo, quando verranno trattate le trasformazioni Lato-Server. <script language=javascript runat=server> // Parse error formatting function function reportparseerror(error) { var s = ""; for (var i=1; i<error.linepos; i++) { s += " "; } r = "<font face=verdana size=2><font size=4>xml Error loading '" + error.url + "'</font>" + "<P><B>" + error.reason + "</B></P></font>"; if (error.line > 0) r += "<font size=3><xmp>" + "at line " + error.line + ", character " + error.linepos + "\n" + error.srctext + "\n" + s + "^" + "</XMP></font>"; return r; } Piersalvo Ortu 73
74 CAPITOLO 6- PROGETTAZIONE // Runtime error formatting function function reportruntimeerror(exception) { return "<font face=verdana size=2><font size=4>xsl Runtime Error</font>" + "<P><B>" + exception.description + "</B></P></font>"; } </script> Dando uno sguardo al primo documento XML notiamo che all interno dell elemento students/student sono annidati gli elementi (<nome>, <cognome> <corso> <indirizzo> e così via), che sono quindi figli dell elemento radice student. I nomi di tali tag non sono altro che i nomi dei campi o delle colonne definite nella tabella Students del Database, mentre i valori contenuti all interno di essi sono i valori delle colonne-righe. Il secondo documento XML invece contiene le informazioni sugli esami registrati nel libretto. Dando uno sguardo più da vicino si può notare che vi è una molteplicità di elementi <exam> </exam> (dipendente dal numero degli esami registrati nel database), all interno dei quali sono presenti i sottoelementi <materia>, <voto>, <data> e <docente>. Dopo questa descrizione del documento XML esaminiamo in che modo è stato possibile ottenere quest ultimo a partire dalle tabelle del database. L approccio seguito può essere descritto con il seguente schema a livelli mostrato nella figura 6.3. Figura 6.3 Processo dei dati, dal database alla visualizzazione sul browser Questo schema può essere scisso in due parti ben distinte. La prima comprende i primi tre livelli, nei quali troviamo il database, nel nostro caso MS Access, nel quale sono registrate le informazioni di ciascun studente. Vengono poi utilizzate le componenti ADO (ActiveX Data Object) per aprire la connessione al database e recuperare un recordset da Piersalvo Ortu 74
75 CAPITOLO 6- PROGETTAZIONE quest ultimo. Una volta ottenuto il recordset, al secondo livello, viene chiamata la funzione RecordsToXML che converte tale recordset in un documento XML (livello 3). La seconda parte comprende gli ultimi due livelli, dove nel primo di questi vengono applicate le trasformazioni XSLT tramite la chiamata alla funzione transformxml, (nome da me definito), per convertire il documento ad esempio in HTML. Infine come ultima fase vengono inviati i risultati di tali trasformazioni al client. Questa seconda parte verrà trattata nel paragrafo 6.6 sulle trasformazioni Lato-Server, dove sarà analizzata anche la funzione transformxml. Iniziamo ora ad analizzare come vengono gestiti i primi tre livelli dello schema di figura 6.3 partendo dal database per arrivare al documento XML. Di seguito vengono presentate tre funzioni, tratte dallo script che verrà trattato nel capitolo 6.6, scritte utilizzando il linguaggio VBScript e alcuni oggetti ASP. Sono: 1) GetRecords: nella quale viene aperta la connessione col Database e vengono eseguite delle query che restituiscono dei recordset, di cui si parlerà più in dettaglio in seguito. <% Function GetRecords(numRec) Dim cnn Set objrs = CreateObject("ADODB.Recordset") Set cnn = CreateObject("ADODB.Connection") objcnn.open "DRIVER={Microsoft Access Driver (*.mdb)};" & "DBQ=" & server.mappath("/libretto") & "\" & "DatiStudenti.mdb" if (numrec=1) Then Set GetRecords = objcnn.execute("select * from Students" & " where COGNOME="&"'"&Request.Form("txtCognome")&"'"& " And " &" MATRICOLA="&"'"&Request.Form("txtMatricola")&"'"&";") *********************************************************************************************************************** else If (numrec=2) Then set objrs = objcnn.execute("select materia,voto,data,docente from esami" & " where MATRICOLA="&"'"&Request.Form("txtMatricola")&"'"&";") If (1=search(objRS)) Then objrs.movefirst Set GetRecords = objrs else If(0=search(objRS)) Then%> <html> <body bgcolor="black"> <h5 align="center"> <font style="bold" color="red"> <br></br> <% = Response.write("NESSUN ESAME REGISTRATO") %> </font> <h5> </body> </html> <% End If End If Piersalvo Ortu 75
76 CAPITOLO 6- PROGETTAZIONE End If End If End Function %> 2) RecordsToXML: consente di convertire il recordset in un documento XML. Function RecordsToXML( rs, NodeName ) Dim objnodecol, objnode, objxml, x set objxml = Server.CreateObject("Microsoft.XMLDOM") Set objnodecol = AddXMLNode( objxml, objxml, NodeName & "s", "" ) while rs.eof = False Set objnode = AddXMLNode( objxml, objnodecol, NodeName, "" ) for each x in rs.fields AddXMLNode objxml, objnode, x.name, Trim(x.Value) Next rs.movenext wend Set RecordsetToXMLDoc = objxml End Function 3) Search: controlla se nella tabella esami del database vi sono o meno esami registrati. <% Function Search (objrs) Dim intok Do while Not objrs.eof For each objfield in objrs.fields If IsNull(objField) Then intok = 0 else intok = 1 End If Next objrs.movenext Loop Search=intOK End Function %> Nella prima funzione, GetRecords(numRec), viene per prima creata un istanza dell oggetto di tipo Recordset (CreateObject("ADODB.Recordset"), e poi un altra istanza per l oggetto Connection tramite l espressione (CreateObject("ADODB.Connection")). Viene poi aperta la connessione con il database attraverso l utilizzo delle componenti ADO (ActiveX Data Objects). ADO fornisce molti oggetti che consentono ad un applicazione di comunicare con le fonti di dati, utilizzando connessioni OLE DB o ODBC (Open DataBase Connectivity). ADO mette a disposizione tre oggetti principali da utilizzare nell interazione con un database, l oggetto Connection, che consente ad un applicazione di connettersi al database, l oggetto Recordset, che viene utilizzato per inviare una query al database e restituire l elemento che contiene il risultato di tale query. Infine l oggetto Command, che è molto Piersalvo Ortu 76
77 CAPITOLO 6- PROGETTAZIONE simile al penultimo ma in più mette a disposizione un interfaccia che consente di eseguire procedure e funzioni memorizzate in un DBMS. Una volta aperta la connessione al database tramite il metodo Open dell oggetto Connection viene chiamato il metodo Execute che è anch esso un metodo dell oggetto Connection, il quale esegue la query contenuta fra le parentesi. Le query nel nostro caso sono due e vengono eseguite in base al verificarsi della condizione presente nella if. Quella che segue è la prima query,: if (numrec=1) Then Set GetRecords = objcnn.execute("select * from Students" & " where COGNOME="&"'"&Request.Form("txtCognome")&"'"&" And " &" MATRICOLA="&"'"&Request.Form("txtMatricola")&"'"&";") Essa restituisce tutti i campi o colonne (indicato dall asterisco ( * )) della tabella Students se vengono soddisfatte le due condizioni presenti all interno della clausola where, le quali controllano se nelle colonne o campi Cognome e Matricola presenti all interno del database nella tabella Students vi è un cognome e una matricola uguali a quelli inseriti nel Form di accesso al libretto, di cui si è parlato precedentemente (vb figura 6.1). Nel caso i dati inseriti siano presenti nel database, vengono restituiti due interi Recordset: il primo contiene i dati dello studente, restituito dalla query precedente, mentre il secondo contiene le informazioni sugli esami sostenuti e registrati, e viene restituito eseguendo la seconda query. Una volta convertito questo secondo Recordset in struttura XML si ottiene appunto il Documento 2, esami1.xml, di cui si è parlato precedentemente (vb paragrafo 6.3). Quest ultima query viene eseguita solo se numrec=2, dove 2 indica che si sta elaborando il Documento 2. Ecco la seconda query: If (numrec=2) Then ' SECONDA QUERY set objrs = objcnn.execute("select materia,voto,data,docente from esami" & " where MATRICOLA="&"'"&Request.Form("txtMatricola")&"'"&";") Questa query restituisce i valori delle colonne: Materia, Voto, Data, Docente, in base al verificarsi della condizione espressa dalla clausola where, che controlla la corrispondenza tra la matricola inserita nel modulo di figura 6.1 e quella presente nella tabella degli esami. La seconda query inoltre, non restituisce il Recordset direttamente alla funzione chiamante Piersalvo Ortu 77
78 CAPITOLO 6- PROGETTAZIONE come nella prima, ma lo memorizza nell oggetto objrs di tipo Recordset. In tal modo è possibile verificare se il Recordset restituito è vuoto o meno, mediante la chiamata alla funzione Search che controlla se il recordset restituito contiene almeno un esame oppure è vuoto. Nel caso in cui quest ultimo sia vuoto viene visualizzato un messaggio informativo, (vb figura 6.6). Infine la funzione più importante è RecordsToXML che come è stato già detto, converte le informazioni del Recordset in un documento XML. A tale funzione vengono passati due parametri: il primo indicato con rs rappresenta il Recordset, mentre il secondo NodeName, rappresenta l elemento radice del documento, all interno del quale vi sono tutti gli elementi figli. All interno della funzione viene scandito l intero Recordset passato, e per ogni componente colonna-valore (si intende con riferimento alla tabella del database), viene creato un nodo del tipo: <campo>valore</campo>. Questo compito viene svolto tramite la chiamata alla funzione AddXMLNode che a sua volta chiama AddXMLNodes, mostrate di seguito: <% function AddXMLNode( DOMXML, Parent, Name, Value ) Set AddXMLNode = AddXMLNodes( DOMXML, Parent, Name, Value, "" ) End Function function AddXMLNodes( DOMXML, Parent, Name, Value, Namespace ) dim objnode set objnode = DOMXML.createNode( 1, LCase(Name), Namespace) if Len(Value) <> 0 then objnode.text = Trim(Value) end if Parent.appendChild objnode set AddXMLNodes = objnode End Function %> A quest ultima vengono passati 4 parametri che sono: 1) DOMXML: è un oggetto DOM (Document Object Model). 2) Parent: è anch esso un oggetto DOM. 3) Name: rappresenta il nome di una delle colonne delle due tabelle del database, nome che verrà attribuito al nodo che deve essere aggiunto al documento XML. 4) Value: contiene il valore della colonna nel momento in cui quest ultima viene scandita. La parte su cui occorre spendere qualche parola in più è l oggetto DOM, creato nella funzione RecordsToXML. Quest ultimo consente di accedere alle proprietà e ai metodi che permettono di navigare, fare interrogazioni (query), e modificare il contenuto e la struttura dei documenti XML fornendo in tal modo, un interfaccia (API-Application Programming Interface) verso i documenti XML, ai linguaggi di script e non solo. In tal modo essi Piersalvo Ortu 78
79 CAPITOLO 6- PROGETTAZIONE possono interagire con i dati XML. Nella funzione AddXMLNodes vengono utilizzati due metodi forniti dall interfaccia DOM-API: 1) createnode(1, LCase(Name), Namespace): ha il compito di creare un nuovo nodo, in base ai tre parametri forniti che indicano, partendo da sinistra, il tipo, il nome del nodo che deriva da quello delle colonne o campi presenti nella tabella del database. Infine l ultimo, Namespace, serve per associare un determinato namespace al nome del nodo tramite un prefisso associato al nome stesso del nodo. Nel nostro caso tale parametro è stato impostato come una stringa vuota. 2) append.child: aggiunge il nodo creato alla fine della lista degli elementi figli già creati. Infine per concludere, prendiamo in esame la proprietà text, a cui si fa riferimento tramite l oggetto objnode, il cui compito è quello di restituire il l informazione all interno dell elemento o nodo creato. Tale informazione non è altro che il valore di una delle colonne della tabella del database, che in quel determinato momento viene elaborata. Il discorso sui metodi forniti dall interfaccia DOM verrà ripreso nel paragrafo 6.6 con riferimento al metodo transformnode, utilizzato nelle trasformazioni Lato-Server. Proseguendo con la progettazione del libretto, nel prossimo paragrafo vengono descritte le DTD e i relativi Schemi per entrambe i documenti XML, Students.xml ed esami1.xml. Sia le DTD che gli Schemi non sono utilizzati direttamente nell applicazione del libretto. 6.4 DOCUMENTO DELLA DTD E DELLO SCHEMA La DTD del documento XML denominato Students.xml, ha la seguente struttura: <?xml version="1.0" encoding="utf-8"?> <!--DTD generated by XMLSPY v5 ( <!ELEMENT students (student)> <!ELEMENT student (nome, matricola, cognome, codice_fiscale, corso, indirizzo, , esami, cellulare, telefono)> <!ELEMENT cellulare (#PCDATA)> <!ELEMENT codice_fiscale (#PCDATA)> <!ELEMENT cognome (#PCDATA)> <!ELEMENT corso (#PCDATA)> <!ELEMENT (#PCDATA)> <!ELEMENT esami (#PCDATA)> <!ELEMENT indirizzo (#PCDATA)> <!ELEMENT matricola (#PCDATA)> <!ELEMENT nome (#PCDATA)> <!ELEMENT telefono (#PCDATA)> La DTD inizia con la dichiarazione dell elemento radice students, che contiene l elemento student. Quest ultimo a sua volta ha come figli gli elementi: (nome, cognome, corso, codice_fiscale, ) che sono elementi semplici, cioè non contengono altri sottoelementi. Tutti gli elementi hanno un tipo di contenuto PCDATA, cioè testo che può cioè essere analizzato dall analizzatore sintattico. Piersalvo Ortu 79
80 CAPITOLO 6- PROGETTAZIONE La DTD che segue è quella relativa al secondo documento, cioè esami1.xml: <?xml version="1.0" encoding="utf-8"?> <!--DTD generated by XMLSPY v5 ( <!ELEMENT exams (exam+)> <!ELEMENT exam (materia, voto, data, docente)> <!ELEMENT data (#PCDATA)> <!ELEMENT docente (#PCDATA)> <!ELEMENT materia (#PCDATA)> <!ELEMENT voto (#PCDATA)> Anche questa DTD inizia con la dichiarazione dell elemento radice, in questo caso exams, il quale ha per figlio l elemento exam. Quest ultimo a sua volta è un elemento complesso in quanto ha per figli gli elementi <data>, <docente>, <materia> e <voto>. Dopo aver analizzato in breve le DTD dei relativi documenti XML, vediamo come sia possibile trasformare queste ultime in forma di Schemi. Come si può notare la sintassi dello schema è totalmente diversa da quella della DTD. Quello che segue è lo Schema relativo alla prima DTD analizzata: <?xml version="1.0" encoding="utf-8"?> <!--W3C Schema generated by XMLSPY v5 ( <xs:schema xmlns:xs=" elementformdefault="qualified"> <xs:element name="cellulare" type="xs:string"/> <xs:element name="codice_fiscale" type="xs:string"/> <xs:element name="cognome" type="xs:string"/> <xs:element name="corso" type="xs:string"/> <xs:element name=" " type="xs:string"/> <xs:element name="esami" type="xs:string"/> <xs:element name="indirizzo" type="xs:string"/> <xs:element name="matricola" type="xs:string"/> <xs:element name="nome" type="xs:string"/> <xs:element name="students"> <xs:complextype> <xs:sequence> <xs:element name="student" type="studenttype"/> </xs:sequence> </xs:complextype> </xs:element> <xs:element name="telefono" type="xs:string"/> <xs:complextype name="studenttype"> <xs:sequence> <xs:element ref="nome"/> <xs:element ref="matricola"/> <xs:element ref="cognome"/> <xs:element ref="codice_fiscale"/> <xs:element ref="corso"/> <xs:element ref="indirizzo"/> <xs:element ref=" "/> <xs:element ref="esami"/> <xs:element ref="cellulare"/> <xs:element ref="telefono"/> </xs:sequence> </xs:complextype> </xs:schema> Piersalvo Ortu 80
81 CAPITOLO 6- PROGETTAZIONE Analizzando questo Schema si può notare che tutti gli elementi sono racchiusi all interno di un elemento radice <xsd:schema>, che apre appunto lo schema. All interno di questo stesso elemento è stata aggiunta la definizione di un namespace xmlns:xs=" che viene impiegato in tutto lo schema per identificare gli elementi e gli attributi che ne fanno parte. Tutti gli elementi dello schema fanno riferimento a questo namespace attraverso il prefisso xsd: associato al namespace stesso. Riprendendo l esame dello schema, vediamo all inizio un elenco di elementi, che rappresentano gli elementi semplici contenuti nel documento XML. Segue poi l elemento radice students di tipo complesso che contiene l elemento complesso <student>, ridefinito come elemento di tipo StudentType, che a sua volta è costituito dalla sequenza dei sottoelementi semplici (nome,cognome, codice fiscale, corso, ecc). Infine per terminare il discorso sugli Schemi analizziamo lo Schema equivalente alla seconda DTD: <?xml version="1.0" encoding="utf-8"?> <!--W3C Schema generated by XMLSPY v5 ( <xs:schema xmlns:xs=" elementformdefault="qualified"> <xs:element name="data" type="xs:string"/> <xs:element name="docente" type="xs:string"/> <xs:element name="materia" type="xs:string"/> <xs:element name="voto" type="xs:string"/> <xs:element name="exams"> <xs:complextype> <xs:sequence> <xs:element name="exam" type="examtype" maxoccurs="unbounded"/> </xs:sequence> </xs:complextype> </xs:element> <xs:complextype name="examtype"> <xs:sequence> <xs:element ref="materia"/> <xs:element ref="voto"/> <xs:element ref="data"/> <xs:element ref="docente"/> </xs:sequence> </xs:complextype> </xs:schema> Come si può vedere la logica seguita è la stessa dello schema già visto. Vi è un elemento radice <schema..>, che racchiude al suo interno tutti gli elementi dello schema stesso, seguito dalla dichiarazione del namespace (xmlns:xs=" di cui si è già parlato precedentemente. Piersalvo Ortu 81
82 CAPITOLO 6- PROGETTAZIONE 6.5 FOGLI DI STILE Occorre a questo punto creare i fogli di stile che possano essere applicati ai documenti XML visti precedentemente. I fogli di stile creati sono due, uno applicato al documento Students.xml per la formattazione dei dati degli studenti, l altro da applicare al documento esami1.xml per la visualizzazione degli esami registrati. Entrambi i fogli di stile comprendono sia elementi propri del linguaggio HTML, utilizzati per effettuare le varie formattazioni della pagina, sia elementi del linguaggio XSLT utilizzati per effettuare le trasformazioni in HTML. Quello che segue è il foglio di stile fstyle.xsl, applicato al documento Students.xml: <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl=" <xsl:template match="/"> <html> <BODY BGCOLOR="#99CCFF" align="center"> xmlns=" <DIV STYLE="margin-left=200px;font-weight:bold;font-size:20"> <SPAN STYLE="font-weight:normal;color:red"> LIBRETTO VIRTUALE <br/> CORSO DI <xsl:value-of select="students/student/corso"/> </SPAN> </DIV> <BR/> <H2 align="left"> <img src=" jpg" width="140" height="110"/> </H2> <DIV STYLE="margin-left=10px;font-weight:bold;font-size:15"> <SPAN STYLE="font-type:Arial;font-weight:normal;color:red;"> <xsl:value-of select="students/student/nome"/> <xsl:value-of select="students/student/cognome"/> Matricola: <xsl:value-of select="students/student/matricola"/> </SPAN> </DIV> <!-- ************************************************************************** --> <DIV STYLE="margin-left=10px;font-weight:bold;font-size:15"> <SPAN STYLE="font-weight:normal;color:red"> <xsl:value-of select="students/student/indirizzo"/> </SPAN> </DIV> <!-- ************************************************************************** --> <DIV STYLE="margin-left=10px;color:red;font-weight:bold;font-size:15"> Tel/Fax: <SPAN STYLE="font-weight:normal;color:red"> <xsl:value-of select="students/student/telefono"/> Piersalvo Ortu 82
83 CAPITOLO 6- PROGETTAZIONE Cell: <xsl:value-of select="students/student/cellulare"/> <br /> <xsl:value-of select="/students/student/ "/> </SPAN> </DIV> <HR/> <!-- ************************************************************************** --> <h1 align="right-bottom"> <FONT SIZE="3"> <a href="libretto/prenotaesami/form.html">prenota ESAME </a></font></h1> <h3 align="center"> <FONT COLOR="white"> ESAMI SOSTENUTI </FONT> </h3> <table align="center" cellpadding="12" bgcolor="white"> <TR > <td bgcolor="red">materie</td> <td bgcolor="red">voto <td bgcolor="red">data </td> </td> <td bgcolor="red">docente </td> </TR> </table> <br/><hr></hr> </BODY> </html> </xsl:template> <!-- ************************************************************************** --> </xsl:stylesheet> Il foglio di stile si apre con l elemento radice xsl:stylesheet, il quale possiede due namespace. Il primo è quello predefinito a cui è associato il prefisso xsl:, che viene utilizzato per identificare tutti gli elementi del linguaggio XSLT all interno del foglio di stile. Il secondo namespace deve essere scelto in base al tipo di trasformazione che deve essere effettuata. Nel caso del foglio di stile precedente, il secondo namespace indica che il documento fa riferimento alla specifica HTML 4.0. Segue queste dichiarazioni di namespace il foglio di stile vero e proprio, contenuto all interno della regola di modello definita dall elemento <xsl:template match="/">, la quale contiene codice HTML per la formattazione degli elementi che verranno visualizzati nel browser, unito a codice XSL/XSLT come ad esempio le espressioni <xsl:value-of select="."/>, per effettuare le trasformazioni. Il valore dell attributo select degli elementi <xsl:value-of..>, è rappresentato da un espressione XPath, (vb capitolo 4), che viene utilizzata per recuperare parti specifiche del documento XML. Infine applicando tale foglio di stile al nostro Documento 1 si ottiene una visualizzazione come quella di figura 6.4. Piersalvo Ortu 83
84 CAPITOLO 6- PROGETTAZIONE Figura 6.4 Visualizzazione del documento XML Students.xml Esaminiamo ora il foglio di stile fstyle1.xsl, che deve essere applicato al Documento 2 esami1.xml: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl=" xmlns=" <xsl:template match="/"> <html> <head> <title></title> </head> <body bgcolor="#99ccff"> <table align="center" cellpadding="15" bgcolor="white"> <xsl:for-each select="exams/exam"> <tr> <td height="0.5"><font size="2" color="red"> <xsl:value-of select="materia"/> </font></td> <td height="0.5"><font size="2" color="red"> <xsl:value-of select="voto"/> </font></td> <td height="0.5"><font size="2" color="red"> <xsl:value-of select="data"/> </font></td> <td height="0.5"><font size="2" color="red"> <xsl:value-of select="docente"/> </font></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Il compito principale di questo foglio di stile è quello di creare una tabella all interno della quale verranno visualizzati gli esami che sono stati registrati nel database. Analizzando il codice, notiamo l elemento <xsl:for-each select="exams/exam">, il quale viene utilizzato Piersalvo Ortu 84
85 CAPITOLO 6- PROGETTAZIONE per eseguire un ciclo all interno dell elemento complesso exam, quest ultimo indicato come valore dell attributo select. Tale ciclo è indispensabile in quanto, come si è già detto quando si è analizzato il documento XML esami1.xml, esso è costituito da una molteplicità di elementi <exam> </exam>, uno per ciascun esame registrato. A sua volta ogni elemento <exam> possiede i quattro sottoelementi <materia>, <voto>, <data>, <docente>. Per ogni elemento <exam> viene creata una riga nella tabella. Per concludere, notiamo che è stato previsto anche un collegamento: PRENOTA ESAME per accedere al modulo di prenotazione degli esami. Questa funzionalià non è però stata implementata nel progetto del libretto. Passando al lato pratico, supponiamo ora di applicare tale foglio di stile al Documento 2, visto nel paragrafo 6.3. Otteniamo la visualizzazione della tabella che mostra gli esami, come si può vedere in figura 6.5. Nel caso invece in cui nel database non ci siano ancora esami registrati, ad esempio nel caso di uno studente appena immatricolato, verrà visualizzato un messaggio informativo, come mostra la figura 6.6. Nota: Le due visualizzazioni che seguono sono state ottenute applicando due fogli di stile diversi, uno per visualizzare le informazioni sullo studente, l altro per gli esami. L effetto che si ottiene è quello di una pagina uniforme, come se si fosse utilizzato un unico foglio di stile. Figura 6.5 Visualizzazione nel caso ci siano esami registrati Piersalvo Ortu 85
86 CAPITOLO 6- PROGETTAZIONE Figura 6.6 Visualizzazione nel caso di nessun esame registrato nel database. 6.6 TRASFORMAZIONI LATO-SERVER Riprendendo in esame lo schema a livelli presentato in figura 6.3, restano da esaminare gli ultimi due livelli riguardanti le trasformazioni XSLT e la visualizzazione sul browser di I.Explorer 5-6 e Netscape 7. Le trasformazioni XSLT vengono effettuate per mezzo di uno script sul server, il quale restituisce il risultato in HTML al client. Si era già accennato a questo script nel paragrafo 6.3, nel quale tra l altro erano state analizzate le funzioni che consentivano di collegarsi al database e di trasformare un recordset in documento XML. In questo paragrafo viene presentato lo script al completo e in particolare viene analizzata la funzione transformxml che si occupa di effettuare le trasformazioni. Quello che segue è il codice dello script principale Transform.asp : <%@ Language=VBScript %> <% Response.Buffer = True%> <!-- #INCLUDE FILE="FunzLib.asp" --> <% Function Search (objrs) Dim intok Piersalvo Ortu 86
87 CAPITOLO 6- PROGETTAZIONE Do while Not objrs.eof For each objfield in objrs.fields If IsNull(objField) Then intok = 0 else intok = 1 End If Next objrs.movenext Loop Search=intOK End Function %> <% Function GetRecords(numRec) Set objrs = CreateObject("ADODB.Recordset") Set objcnn = CreateObject("ADODB.Connection") objcnn.open "DRIVER={Microsoft Access Driver (*.mdb)};" & "DBQ=" & server.mappath("/libretto") & "\" & "DATABASE/DatiStudenti.mdb" if (numrec=1) Then Set GetRecords = objcnn.execute("select * from Students" & " where COGNOME="&"'"&Request.Form("txtCognome")&"'"& " And " &" MATRICOLA="&"'"&Request.Form("txtMatricola")&"'"&";") else If (numrec=2) Then set objrs = objcnn.execute("select materia,voto,data,docente from esami" & " where MATRICOLA="&"'"&Request.Form("txtMatricola")&"'"&";") If (1=Search(objRS)) Then objrs.movefirst Set GetRecords = objrs else If(0=Search(objRS)) Then%> <html> <body> <h5 align="center"> <font style="bold" color="red"> <br></br> <% Set GetRecords = objrs %> <% = Response.write("NESSUN ESAME REGISTRATO") %> </font> <h5> </body> </html> <% End If End If End If End If End Function %> ********************************************************************************************************************* <% IF( cstr(request.form("txtcognome")="") OR cstr(request.form("txtmatricola")="") ) Then%> <html> <body align="center"> <div style="margin-left=200px;font-weight:bold;font-size:20"> <span style="font-weight:normal;color:red"> <%response.write("error!")%><br/> <%response.write("inserire CORRETTAMENTE I DATI")%> </span> </div> </body> Piersalvo Ortu 87
88 CAPITOLO 6- PROGETTAZIONE </html> <%Else Response.write("Trasformazione effettuata lato server " ) Response.write(transformXML(RecordsToXML(GetRecords(1), "student"), "fstyle.xsl") ) Response.write(transformXML(RecordsToXML(GetRecords(2), "exam"), "fstyle1.xsl") ) %> <%End If %> Cominciando dall alto, notiamo la solita dichiarazione Language che definisce il linguaggio dello script, in questo caso VBScript. Segue la riga <%Response.buffer=true%> che indica al server di creare un intera pagina Web in memoria prima di inviarla al client. Per default una pagina Web viene inviata al client riga per riga mentre viene generata, mentre comunicando al server di crearla prima di inviarla al browser, si ha la possibilità di ripulire il buffer e ripartire da capo. Nella terza riga vi è la direttiva INCLUDE, che include appunto il file FunzLib.asp all interno del quale sono definite tutte le funzioni utilizzate nello script principale. Ecco il codice del file FunzLib.asp: <% function AddXMLNode( DOMXML, Parent, Name, Value ) Set AddXMLNode = AddXMLNodes( DOMXML, Parent, Name, Value, "" ) End Function function AddXMLNodes( DOMXML, Parent, Name, Value, Namespace ) dim objnode set objnode = DOMXML.createNode( 1, LCase(Name), Namespace) if Len(Value) <> 0 then objnode.text = Trim(Value) end if Parent.appendChild objnode set AddXMLNodes = objnode End Function Function RecordsToXML( rs, NodeName ) Dim objnodecol, objnode, objxml, x set objxml = Server.CreateObject("Microsoft.XMLDOM") Set objnodecol = AddXMLNode( objxml, objxml, NodeName & "s", "" ) while rs.eof = False Set objnode = AddXMLNode( objxml, objnodecol, NodeName, "" ) for each x in rs.fields AddXMLNode objxml, objnode, x.name, Trim(x.Value) Next rs.movenext wend Set RecordsToXML = objxml End Function %> <% function transformxml( XML, XSL ) Dim objxml Dim objxsl Set objxml = getxmldoc(xml) Set objxsl = getxmldoc(xsl) If objxml.parseerror <> 0 Then Response.Write reportparseerror(objxml.parseerror) If objxsl.parseerror <> 0 Then Response.Write reportparseerror(objxsl.parseerror) transformxml = objxml.transformnode(objxsl) End Function Piersalvo Ortu 88
89 CAPITOLO 6- PROGETTAZIONE Function getxmldoc( XML ) Dim objxml If IsObject(XML) Then set objxml = XML Else Set objxml = Server.CreateObject("Microsoft.XMLDOM") If InStr(XML,"<") > 0 Then 'This is a string because < is not valid in a filename objxml.loadxml XML Else objxml.load(server.mappath(xml)) End If End If Set getxmldoc = objxml End Function %> <script language=javascript runat=server> // Parse error formatting function function reportparseerror(error) { var s = ""; for (var i=1; i<error.linepos; i++) { s += " "; } r = "<font face=verdana size=2><font size=4>xml Error loading '" + error.url + "'</font>" + "<P><B>" + error.reason + "</B></P></font>"; if (error.line > 0) r += "<font size=3><xmp>" + "at line " + error.line + ", character " + error.linepos + "\n" + error.srctext + "\n" + s + "^" + "</XMP></font>"; return r; } // Runtime error formatting function function reportruntimeerror(exception) { return "<font face=verdana size=2><font size=4>xsl Runtime Error</font>" + "<P><B>" + exception.description + "</B></P></font>"; } </script> Proseguendo l analisi dello script Transform.asp, troviamo le funzioni Search e GetRecords di cui si è già parlato nel paragrafo 6.3 e infine la parte più importante di tutto il progetto che inizia con la riga di codice: IF( cstr(request.form("txtcognome")="") OR cstr(request.form("txtmatricola")="") ) Then%> che controlla se nel modulo di figura 6.1 sono stati inseriti correttamente i dati richiesti. Se i dati sono non sono stati inseriti correttamente viene visualizzato un messaggio di errore, come in figura 6.7, altrimenti vengono eseguite le trasformazioni da XML ad HTML, sul server, il quale poi invia il risultato, in HTML, al client. Piersalvo Ortu 89
90 CAPITOLO 6- PROGETTAZIONE Figura 6.7 Messaggio di errore Per effettuare le trasformazioni, viene chiamata la funzione TransformXML. Tale funzione viene chiamata all interno dell oggetto ASP, Response, il quale restituisce i risultati ottenuti dalla trasformazione al client. Questo perché la trasformazione è stata appunto eseguita sul server. Questa funzione inoltre viene chiamata due volte nello script. Nella prima viene trasformato il Documento 1 (vb paragrafo 6.3), al quale viene applicato il foglio di stile fstyle.xsl, mentre la seconda volta viene trasformato il Documento 2 con l applicazione del foglio di stile fstyle1.xsl. Analizzando la definizione della funzione TransformXML nello script FunzLib.asp, notiamo la presenza dei due parametri XML e XSL : il primo rappresenta il documento XML restituito effettuando la chiamata alla funzione RecordsToXML(GetRecords, " "), l altro è il documento del foglio di stile da applicare al documento XML. Sia il documento XML che il foglio di stile vengono poi passati come parametri, prima uno e poi l altro, alla funzione getxmldoc la quale verifica che siano degli oggetti di tipo DOM, tramite l uso della funzione IsObject(). Nel caso in cui uno di essi non sia un oggetto, ne viene creato uno utilizzando il metodo CreateObject ("Microsoft.XMLDOM"), altrimenti viene recuperato il percorso dove i due documenti sono memorizzati nel server, tramite la stringa Server.MapPath(XML). Vengono poi caricati con il metodo load e restituiti alla funzione transformxml come oggetti, cioè objxml e objxsl. Nel caso poi vengano riscontrati degli errori nei due oggetti restituiti viene chiamata la funzione reportparseerror(error), che è stata prelevata dalla libreria MSDN della Microsoft. Tale funzione restituisce al client informazioni sugli errori rilevati, nel caso ce ne siano. Infine per concludere il discorso sulla funzione transformxml, riporto la seguente stringa di codice dello script Transform.asp: transformxml = objxml.transformnode(objxsl) Piersalvo Ortu 90
91 CAPITOLO 6- PROGETTAZIONE nella quale viene chiamato il metodo transformnode fornito dall interfaccia DOM, che si occupa di effettuare la trasformazione da XML ad HTML. Una volta eseguita la trasformazione, i risultati di quest ultima vengono inviati al client che visualizza la pagina HTML. Nel caso si utilizzi I.Explorer 5-6, la pagina visualizzata è quella nella figura 6.5. Nel caso si utilizzi invece Netscape 7 si ottiene la schermata di figura 6.8. Figura 6.8 Visualizzazione del libretto su Netscape FOGLI DI STILE PER TRASFORMAZIONI DA XML AD XHTML XHTML (Extensible Hypertext Markup Language) è la riformulazione di HTML 4.01 in XML. Questo linguaggio rappresenta un passo avanti nello sviluppo di HTML, ed è destinato ad essere adottato come linguaggio predefinito nella maggior parte dei browser Web. Perciò un documento XHTML sarà anche compatibile con HTML 4 e pertanto visualizzabile in tutti gli attuali browser Web conformi con HTML 4. Trattandosi di un linguaggio formulato in XML, ha regole più rigide per quanto concerne il modo in cui le informazioni devono apparire ed essere formattate. Ciò rappresenta un notevole passo avanti per gli sviluppatori Web, i quali possono elaborare i documenti XHTML con strumenti XML e inoltre possono estendere il vocabolario HTML, grazie alla possibilità di incorporare altri tipi di documento e sintassi XML nei documenti XHTML. Piersalvo Ortu 91
92 CAPITOLO 6- PROGETTAZIONE Per ottenere la trasformazione da XML ad XHTML è necessario apportare qualche modifica ai due fogli di stile presentati nel paragrafo 6.5. Per quanto riguarda il primo di questi fstyle.xsl, il relativo foglio di stile in XHTML, rinominato fstylexhtml.xsl si presenta così: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl=" <xsl:template match="/"> <html xmlns=" <body bgcolor="#99ccff" align="center"> <div style="margin-left=200px;font-weight:bold;font-size:20"> <span style="font-weight:normal;color:red"> LIBRETTO VIRTUALE<br/> CORSO DI <xsl:value-of select="students/student/corso"/> </span> </div> <br/> <h2 align="left"> <img src=" jpg" width="140" height="110"/> </h2> <div style="margin-left=10px;font-weight:bold;font-size:15"> <span style="font-type:arial;font-weight:normal;color:red;"> <xsl:value-of select="students/student/nome"/> <xsl:value-of select="students/student/cognome"/> matricola: <xsl:value-of select="students/student/matricola"/> </span> </div> <!-- ************************************************************************** --> <div style="margin-left=10px;font-weight:bold;font-size:15"> <span style="font-weight:normal;color:red"> <xsl:value-of select="students/student/indirizzo"/> </span> </div> <!-- ************************************************************************** --> <div style="margin-left=10px;color:red;font-weight:bold;font-size:15"> tel/fax: <span style="font-weight:normal;color:red"> <xsl:value-of select="students/student/telefono"/> cell: <xsl:value-of select="students/student/cellulare"/> <br /> <xsl:value-of select="/students/student/ "/> </span> </div> <hr/> <!-- ************************************************************************** --> <h1 align="right-bottom"> <font size="3"> <a href="libretto/form.html">prenota ESAME </a></font></h1> <h3 align="center"> <font color="white"> ESAMI SOSTENUTI </font> </h3> <table align="center" cellpadding="12" bgcolor="white"> <tr > <td bgcolor="red">materie</td> <td bgcolor="red">voto</td> <td bgcolor="red">data </td> <td bgcolor="red">docente</td> </tr> </table> <br/><hr></hr> Piersalvo Ortu 92
93 CAPITOLO 6- PROGETTAZIONE </body> </html> </xsl:template> <!-- ************************************************************************** --> </xsl:stylesheet> Il foglio di stile relativo a fstyle1.xsl, è fstyle1xhtml.xsl, riportato di seguito: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl=" <xsl:template match="/"> <html xmlns=" <head> <title></title> </head> <body bgcolor="#99ccff"> <table align="center" cellpadding="15" bgcolor="white"> <xsl:for-each select="exams/exam"> <tr> <td height="0.5"><font size="2" color="red"> <xsl:value-of select="materia"/> </font></td> <td height="0.5"><font size="2" color="red"> <xsl:value-of select="voto"/> </font></td> <td height="0.5"><font size="2" color="red"> <xsl:value-of select="data"/> </font></td> <td height="0.5"><font size="2" color="red"> <xsl:value-of select="docente"/> </font></td> </tr> </xsl:for-each> </table> </body> </html> </xsl:template> </xsl:stylesheet> Come è possibile notare dal codice dei fogli di stile, questi sono leggermente diversi da quelli visti nel paragrafo 6.5, utilizzati per la trasformazione da XML ad HTML. Quando si utilizza la specifica XHTML, occorre tener presenti alcune regole. Di seguito sono state indicate quelle principali: Tutti i nomi degli elementi e degli attributi devono essere minuscoli. Tutti i valori degli attributi devono essere racchiusi tra le virgolette. L elemento radice del documento deve essere <html>. Il namespace predefinito associato con l elemento radice deve essere: xmlns=" Per specificare la codifica dei caratteri usata nel documento XHTML, si può utilizzare sia l attributo encoding nella dichiarazione XML, cioè: <?xml version="1.0" encoding="euc-jp"?>, sia l elemento XHTML corrispondente, cioè meta http-equiv. Ad esempio: <meta http-equiv="content-type" content="text/html"; charset="euc-jp"/> Piersalvo Ortu 93
94 CAPITOLO 6- PROGETTAZIONE Le interruzioni di riga e gli spazi vuoti aggiuntivi nei valori degli attributi sono gestiti in modo poco coerente, e pertanto vanno evitati. L uso di fogli di stile esterni è consigliato se il foglio di stile utilizza uno qualunque dei seguenti caratteri: <, &, ]]>, o -. Tutti gli elementi devono essere chiusi. Gli elementi vuoti devono essere chiusi con una barra trasversale prima della parentesi angolare > di chiusura. Nella seguente tabella 6.1 sono indicate le conversioni da HTML ad XHTML di alcuni elementi. ELEMENTO HTML ELEMENTO XHTML <AREA> <BASE> <BR> <DD> <DT> <FRAME> <HR> <IMG> <INPUT> <LI> <LINK> <META> <P> <TD> <TH> <THEAD> <TR> <PARAM> <area /> <base /> <br/> <dd>... </dd> <dt>... </dt> <frame /> <hr /> <img /> <input /> <li>... </li> <link /> </meta> <p> </p> <td> </td> <th> </th> <thead> </thead> <tr> </tr> <param /> Tabella 6.1 Conversioni di tag da HTML ad XHTML Piersalvo Ortu 94
95 CAPITOLO 7 XML WML E WAP 7.1 LIBRETTO VERSIONE WAP - INTRODUZIONE Dopo aver presentato nel capitolo precedente l applicazione del libretto universitario virtuale, accessibile dai browser di Internet Explorer e Netscape, in questo capitolo verrà esaminato il caso in cui si voglia accedere al libretto tramite i browser WAP (Wireless Application Protocol). Questi ultimi utilizzano il linguaggio WML (Wireless Markup Language), il quale prende una parte del suo nome da XML, del quale ne è un applicazione molto specifica. Il WAP si basa appunto sullo scambio e la ricezione di oggetti definiti attraverso WML, il linguaggio definito ad hoc per la telefonia cellulare. WML è un linguaggio interpretato, è strutturato per essere visualizzato sui piccoli display dei telefoni cellulari, non dispone però di tutti gli oggetti utilizzabili in HTML (ad esempio l incapacità di gestire filmati, suoni ecc). Inoltre è stato ottimizzato per essere trasmesso via WAP a 9600 bps, che è la velocità di trasmissione secondo lo standard GSM. Le ragioni che hanno portato allo sviluppo e all utilizzo del WML piuttosto che la scelta di HTML, sono molteplici. La più importante è data dalla scarsa banda disponibile e dalla semplicità di interpretazione delle istruzioni, così da ridurre al minimo il consumo energetico per la loro elaborazione. Inoltre l uso di HTML, richiederebbe display molto più grandi per poter sfruttare tutte le sue potenzialità, mentre come ovvio un display di un telefono cellulare o di palmtop non hanno le stesse potenzialità dei browser Web. 7.2 LE PAGINE WML Le pagine o documenti WML sono strutturate in deck. Ogni deck consiste di una o più cards, che sono le unità di visualizzazione sul browser, quelle che per il dispositivo WAP sono le pagine vere e proprie. Ogni deck inizia e termina con <wml> </wml> e ogni card con <card> </card>. Quando il browser WAP accede ad un deck, lo legge interamente, e la navigazione al suo interno è fatta senza bisogno di scaricare nuovi dati dal server. Una volta che il deck è scaricato dal browser, tutte le sue cards rimangono staticamente all interno della sua memoria, finchè non si accede ad un altro deck o si forza un reload. I deck devono avere una dimensione massima, per assicurare la compatibilità tra vari dispositivi cellulari, in quanto questi hanno memorie di diversa capacità. Ecco un esempio di deck che contiene al suo interno due card: <wml> Piersalvo Ortu 95
96 CAPITOLO 7- XML WML E WAP <card id="card1"> </card> <card id="card2">.. </card> </wml> L elemento card può avere uno o più attributi (o proprietà), di cui solo id è indispensabile, in quanto definisce il nome stesso della card, indispensabile per poterla utilizzare e richiamare, pertanto risulta necessario, deve essere univoco e deve essere composto da una sola parola. Le altre proprietà, opzionali, sono: TITLE NEWCONTEXT STYLE ONENTERFORWARD ONENTERBACKWARD ONTIMER Definisce il titolo della card e può essere utile per definire un'intestazione della card corrente, anche se occupa una riga del già piccolo display. Di solito si utilizza nelle card principali che richiamano altre card, ma spesso il titolo si omette per avere una più ampia dimensione di display a disposizione. È un tag booleano e può assumere quindi al massimo due valori (TRUE/FALSE) e permette di specificare se quando una card viene caricata debba essere reimpostato oppure no il browser context. Per browser context si intendono tutte le variabili locali e di ambiente definite per ogni card. Ad esempio se la proprietà NEWCONTEXT di una card viene settata a TRUE, quando si entra in questa Card vengono rimosse tutte le variabili precedentemente definite, viene azzerato lo storico di navigazione del browser, e se alcune variabili avevano un valore di default questo viene reimpostato. Serve per indicare l'organizzazione del contenuto di una card. Se impostato a LIST vuol dire che gli oggetti presenti sono tutti di tipo required (necessari) e che il loro ordine di inserimento è quello con cui vengono visualizzati. Invece se gli elementi presenti all'interno di un form o di una card non sono tutti necessari ma possono essere opzionali o non esiste un ordine logico di inserimento per i campi di un form, allora la proprietà STYLE deve essere impostata come SET. Per fare un esempio, se in un form inseriamo dei campi relativi alle informazioni su un utente (es. Nome, Cognome, Indirizzo, telefono... ), e vogliamo che tutti siano necessari e che debbano essere valutati esattamente nell'ordine in cui si trovano, allora imposteremo l'attributo STYLE a LIST. Reindirizza l'utente a un URL specificato quando questi accede a una card utilizzando il metodo GO. Serve per reindirizzare l'utente a una card specifica quando questi riaccede alla card alla quale è associata la proprietà ONENTERBACKWORD attraverso il tasto BACK. Serve per fare in modo che, dopo l'esecuzione di un timer, quando scade il tempo l'utente venga reindirizzato automaticamente alla pagina richiesta. 7.3 COME FUNZIONA IL WAP In questo paragrafo vengono esaminate le differenze tra la comunicazione client server in una tipica applicazione Web e quella tra un dispositivo Wap e il server Web. Piersalvo Ortu 96
97 CAPITOLO 7- XML WML E WAP In una tipica applicazione Web, un utente digita un indirizzo URL nel browser, il quale invia una richiesta HTTP al server Web. Quest ultimo interpreta la richiesta e determina quali risorse (file, script ecc), deve recuperare o eseguire. Ad esempio se l URL specifica un file, questo viene inviato direttamente al client, altrimenti nel caso venga specificata una pagina ASP, il server ne esegue il codice e restituisce il risultato al client. Questo processo può essere schematizzato come nella figura seguente. Figura 7.1 Comunicazione tra browser e server Web A differenza del caso precedente, per accedere ad un sito Web da un dispositivo mobile, è necessario un server intermedio detto Gateway, che gestisca i messaggi scambiati tra il cellulare e il server Web, e viceversa. Per accedere ad un sito Web da un dispositivo cellulare basta digitare l URL nel browser Wap come nel caso precedente. Quest ultimo crea una richiesta dell URL contenente l identificativo dell utente, e la invia attraverso il protocollo WSP (Wireless Session Protocol), al server Gateway. La comunicazione dei dati tra il Gateway e il dispositivo cellulare avviene in formato binario. Poichè i dispositivi Wap non possono comunicare con dati in formato basato su testo (o textbased), a causa della poca banda disponibile, così come avviene nelle comunicazioni sulla rete internet con il protocollo HTTP, viene utilizzato il protocollo WSP che converte gli Header HTTP (pacchetti di dati in formato basato su testo), in formato binario, diminuendo così anche la quantità di dati trasmessi. WSP utilizza il protocollo WTP (Wireless Transaction Protocol) invece di TCP (Transmission Control Protocol), per trattare le richieste e le risposte tra il server Gateway e il server Web. Il Gateway interpreta le richieste inviategli dal browser WAP in formato binario, le traduce in richieste di tipo http (formato testo), e poi le invia al server Web. Quest ultimo dopo aver ricevuto tali richieste le interpreta, determina quale/i risorse deve recuperare o eseguire e invia i risultati che possono essere dei file o l output ottenuto eseguendo uno script, al Gateway. Ciò che viene restituito al Gateway deve esser nella forma di documento WML, il quale verrà poi convertito dal Gateway in formato binario per essere inviato al dispositivo mobile. Quest ultimo di conseguenza interpreta il codice WML e visualizza la pagina sul display. Questi passi possono essere schematizzati come in figura 7.2. Piersalvo Ortu 97
98 CAPITOLO 7- XML WML E WAP Figura 7.2 Comunicazione tra cellulare e server Web 7.4 SOFTWARE Prima di iniziare ad entrare nei dettagli della progettazione del libretto WAP che verrà presentato nel paragrafo successivo, è opportuno fare una scelta degli strumenti che verranno utilizzati per creare e testare tale l applicazione. In particolare gli strumenti di cui si deve disporre sono: un simulatore di cellulare per testare e verificare la navigabilità delle pagine WML create, un server Gateway per lo scambio di dati tra il server Web e il dispositivo cellulare e un server Web. Per quest ultimo si è scelto di utilizzare Personal Web Server fornito con Windows 98, già utilizzato per l applicazione descritta nel capitolo 6. Il funzionamento tra questi ultimi inoltre è già stato esaminato nel paragrafo precedente (vb anche figura 7.2). Per quanto riguarda la scelta del simulatore di cellulare e del Gateway, vi sono vari tool di sviluppo attualmente disponibili su Internet che sono provvisti di questi strumenti e sono: 1) il Mobile Internet Toolkit 3.1 sviluppato dalla Nokia, disponibile all indirizzo: 2) il.net Mobile Web SDK (Software Development Kit), fornito dalla Microsoft e disponibile all indirizzo: il quale è provvisto di un emulatore di browser Wap chiamato UP.Browser, grazie al quale è possibile testare un applicazione su diversi tipi di apparati mobili disponibili attualmente sul mercato. 3) UP.SDK che viene fornito dalla Openwave ( Anche quest ultimo è dotato di un emulatore di browser WAP proprio come il penultimo. Per la progettazione del libretto verrà utilizzato il tool Wap della Nokia, che include varie particolarità e componenti tra cui: 1) vari editor tra cui quello per creare e testare pagine WML, WMLScript, e WBMP che è il formato utilizzato nella trasmissione di immagini via WAP, studiato ad hoc per le ristrettezze di banda e di visualizzazione. Vengono anche forniti gli editor per i CSS, XHTML ed MMS Piersalvo Ortu 98
99 CAPITOLO 7- XML WML E WAP (Multimedial Messaging Service), il nuovo standard per i messaggi multimediali, tramite il quale è possibile inviare e ricevere video e suono. 2) un simulatore di server WAP e un WAP Gateway, con cui comunica il dispositivo cellulare. 3) un simulatore di dispositivo cellulare sul quale visualizzare i contenuti delle pagine create (ad esempio WML, XHTML, MMS ecc). È possibile scegliere il tipo di dispositivo in maniera tale da testare la compatibilità della propria applicazione su diversi tipi di apparati. Il toolkit Nokia ha un solo tipo di emulatore WAP al momento dell installazione (vb figura 7.3). È possibile comunque aggiungere altri tipi di simulatori disponibili per vari dispositivi mobili della Nokia, scaricandoli dal sito Figura 7.3 Finestra principale del Nokia Toolkit e simulatore di cellulare Nota: occorre ricordare che per il funzionamento del Nokia Toolkit è necessario installare la piattaforma Java Run Time Enviroment versione 1.3.1_07, disponibile all indirizzo PROGETTAZIONE L applicazione del libretto WAP è costituita da una combinazione di quattro pagine, di cui tre pagine WML e uno script che verranno esaminati nel corso di questo paragrafo. Piersalvo Ortu 99
100 CAPITOLO 7- XML WML E WAP È stata innanzitutto creata una prima pagina WML che servirà come accesso al resto dell applicazione del libretto. Per accedere alla prima pagina del libretto è sufficiente digitare l URL: nella barra degli indirizzi, nella figura 7.3. LocalHost indica il nome del computer locale che funge da server Web, mentre Libretto_Wap è la directory all interno della quale sono memorizzati tutti i file dell applicazione e i database che verranno trattati nel corso del capitolo. Tale directory deve essere creata in c:/inetpub/wwwroot/. Ecco il codice della prima pagina WML, chiamata accesso.wml : <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" " <wml> <head> <meta http-equiv="cache-control" content="max-age=0"/> </head> <!--PRIMA CARD DEL DECK--> <card id="card1" ontimer="#card2" > <timer value="20"/> <p align="center"> <b>libretto Virtuale</b><br/> <b>home Page</b><br/> <anchor title="enter-->"> Loading...> <go href="#card2"/></anchor> </p> </card> <!-- SECONDA CARD- Modulo di Accesso al Libretto --> <card id="card2"> <p> <do type="options" label="clear"> <refresh> <setvar name="cogn" value=""/> <setvar name="matr" value=""/> </refresh></do> Inserire:<br/> <b>cognome: </b><br/> <input type="text" name="cogn" emptyok="false"/> <b>matricola: </b><br/> <input type="text" name="matr" emptyok="false"/> <do type="accept" label="invia"> <go href=" > </do> </p> </card> Piersalvo Ortu 100
101 CAPITOLO 7- XML WML E WAP </wml> Esaminando questa pagina WML notiamo innanzitutto la dichiarazione XML seguita da quella che specifica la DTD WML, cioè: <!DOCTYPE wml PUBLIC.. wml_1.1.dtd"> Segue il deck WML vero e proprio che inizia con <wml>. All interno del deck sono presenti due card, indicate rispettivamente con card1 e card2, all interno dell attributo id. La prima di queste viene utilizzata per creare una pagina principale di accesso al resto del libretto, come mostra l immagine del display in figura 7.4. L elemento <card> contiene l attributo ontimer che serve per far in modo che dopo l esecuzione di un timer (in questo caso <timer value="20"/>), quando scade il tempo, impostato a 20ms cioè value="20", l utente viene reindirizzato automaticamente alla card successiva, cioè card2. Figura 7.4 Home Quest ultima definisce un modulo nel quale uno studente deve inserire il proprio cognome e la matricola per accedere alle informazioni del libretto. Tale modulo, (figura 7.5), è l equivalente in WML di quello presentato nel capitolo 6 in figura 6.1. Una volta inseriti i dati nel modulo e selezionato Invia dal menù Options (in basso a sinistra nel display), questi vengono inviati allo script esamireg.asp (indicato nell attributo href dell elemento Figura 7.5 Modulo di accesso <go >), utilizzando il metodo GET che consente di attaccare i dati all URL: per mezzo del carattere (?), seguito dai campi del Form: Cogn e Matr. Questi infine vengono inviati al server Web, indicato in questo caso dalla stringa LocalHost nell URL precedente. I dati inseriti nel modulo, vengono cercati nel database e se corrispondono, vengono restituiti: nome, cognome e matricola dello studente, tipo figura 7.6, altrimenti viene visualizzata la stringa studente non registrato come in figura 7.7. Figura 7.6 Dati studente Figura 7.7 Studente non registrato Figura 7.8 Menù del libretto Piersalvo Ortu 101
102 CAPITOLO 7- XML WML E WAP Com è possibile vedere nel display di figura 7.6, è previsto un collegamento, Menù-->, che permette di accedere alla seconda pagina WML (figura 7.8). Tale collegamento viene visualizzato solo nel caso in cui lo studente sia stato registrato nel database. Inoltre c è da dire che tale collegamento viene restituito dal codice dello script esamireg.asp, che verrà trattato nel paragrafo 7.6. Quella che segue è la seconda pagina WML denominata menu.wml : <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" " <wml> <head> <meta http-equiv="cache-control" content="max-age=0"/> </head> <!--Prima Card Menu'--> <card id="card3"> <p align="center"><b>scegli:</b></p> <p align="left"> <select> <option onpick="#prenot">prenota Esame</option> <option onpick="checkesami.wml">esami Registrati</option> </select> <anchor title="back"> Back Home <go href="accesso.wml"/> </anchor> </p> </card> <!-- ********************************************************** --> <!--Seconda Card - Prenotazione esami--> <card id="prenot"> <do type="options" label="clear"> <refresh> <setvar name="nome" value=""/> <setvar name="cogn" value=""/> <setvar name="matr" value=""/> </refresh></do> <p> Inserire:<br/> <b>nome:</b><br/> <input type="text" name="nome" emptyok="false"/> <b>cognome:</b><br/> <input type="text" name="cogn" emptyok="false"/> <b>matricola</b><br/> <input type="text" name="matr" emptyok="false"/> <b>scegli Anno:</b><br/> <select multiple="false" name="anno"> <option onpick="#anno1" value="1">1</option> <option onpick="#anno2" value="2">2</option> <option onpick="#anno3" value="3">3</option> </select> </p> </card> <!--***********************************************************--> <!--***********************************************************--> Piersalvo Ortu 102
103 CAPITOLO 7- XML WML E WAP <!--Terza Card --> <card id="anno1"> <p> <b>scegli:</b><br/> <select multiple="false" name="es"> <option value="matematica1">matematica1</option> <option value="fisica1">fisica1</option> <option value="matematica2">matematica2</option> </select> <do type="options" label="invia"> <go href="esamireg.asp?nome=$(nome)&cogn=$(cogn)&matr=$(matr)&es=$(es)& Anno=$(Anno)&Mod=2"/> </do> </p> </card> <!--***********************************************************--> <!--***********************************************************--> <!--Quarta Card --> <card id="anno2"> <p> <b>scegli:</b><br/> <select multiple="false" name="es"> <option value="misure1">misure1</option> <option value="elettronica1">elettronica1</option> <option value="elettronica2">elettronica2</option> </select> <do type="options" label="invia"> <go href="esamireg.asp?nome=$(nome)&cogn=$(cogn)&matr=$(matr)&es=$(es)& Anno=$(Anno)&Mod=2"/> </do> </p> </card> <!--***********************************************************--> <!--***********************************************************--> <!--Quinta Card --> <card id="anno3"> <p> <b>scegli:</b><br/> <select multiple="false" name="es"> <option value="basididati">basi di dati</option> <option value="calcolatori3">calcolatori3</option> <option value="elettrotecnica2">elettrotecnica2</option> </select> <do type="options" label="invia"> <go href="esamireg.asp?nome=$(nome)&cogn=$(cogn)&matr=$(matr)&es=$(es)& Anno=$(Anno)&Mod=2"/> </do> </p> </card> </wml> Analizzando questa seconda pagina WML notiamo che le prime 7 righe di codice sono identiche alla prima pagina WML. Le card presenti all interno del deck <wml>, sono cinque, chiamate rispettivamente card3, Prenot, anno1, anno2, anno3. La prima ha il Piersalvo Ortu 103
104 CAPITOLO 7- XML WML E WAP compito di presentare all utente un menù con due opzioni: Esami Registrati, con la quale si possono controllare gli esami registrati nel libretto e Prenota Esame, che consente di prenotare un esame. Scegliendo Esami Registrati, si passa alla terza pagina WML, CheckEsami.wml, utilizzando l attributo onpick definito all interno dell elemento option, cioè: <option onpick="checkesami.wml">esami Registrati</option> Tale attributo ha come valore il nome della 3 pagina WML. Invece per il passaggio alla seconda card (Prenot), l attributo contiene l identificativo di quest ultima. Quella che segue è la terza pagina WML: <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.3//EN" " <wml> <!-- Prima Card - Controllo esami registrati nel libretto --> <card id="esamiregist"> <p align="left"> <b>scegli:</b><br/> <select multiple="false" name="anno"> <option onpick="#anno1" value="1">1 anno</option> <option onpick="#anno2" value="2">2 anno</option> <option onpick="#anno3" value="3">3 anno</option> </select> </p> </card> <card id="anno1"> <p align="left"> <b>scegli:</b><br/> <select multiple="false" name="es"> <option value="matematica1">matematica1</option> <option value="fisica1">fisica1</option> <option value="informatica1">informatica1</option> <option value="informatica2">informatica2</option> <option value="chimica">chimica</option> </select> <do type="options" label="controlla"> <go href="esamireg.asp?cogn=$(cogn)&matr=$(matr)&es=$(es)&anno=$(anno)& Mod=1"/> </do> </p> </card> <card id="anno2"> <p align="left"> <b>scegli:</b><br/> <select multiple="false" name="es"> <option value="elettrotecnica1">elettrotecnica1</option> <option value="elettronica1">elettronica1</option> <option value="elettronica2">elettronica2</option> Piersalvo Ortu 104
105 CAPITOLO 7- XML WML E WAP <option value="reti logiche">reti logiche</option> <option value="calcolatori1">calcolatori1</option> </select> <do type="options" label="controlla"> <go href="esamireg.asp?cogn=$(cogn)&matr=$(matr)&es=$(es)&anno=$(anno)& Mod=1"/> </do> </p> </card> <card id="anno3"> <p align="left"> <b>scegli:</b><br/> <select multiple="false" name="es"> <option value="controlli automatici">contr automatici</option> <option value="reti calcolatori">reti calcol</option> <option value="misure">misure elettr</option> <option value="ingegneria del software">ing software</option> <option value="ricerca operativa">ric operativa</option> </select> <do type="options" label="controlla"> <go href="esamireg.asp?cogn=$(cogn)&matr=$(matr)&es=$(es)&anno=$(anno)& Mod=1"/> </do> </p> </card> </wml> Questa pagina WML contiene quattro card. La prima fornisce all utente un menù come quello di figura 7.9 nel quale è possibile scegliere l anno a cui appartiene l esame, di cui si vuole controllare la registrazione. In base a tale scelta si passa ad una delle altre tre card, che forniscono un elenco degli esami previsti per l anno scelto. Ad esempio selezionando il primo anno si passa alla card (anno1), che visualizza l elenco esami di figura 7.10, e così via per gli altri anni. Figura 7.9 Scelta anno Figura 7.10 Elenco Figura 7.10a Menù Options esami 1 anno Una volta scelto l esame nell elenco, per controllare la registrazione, è sufficiente scegliere la voce Controlla dal menù Options del cellulare (figura 7.10a). Le altre due voci, (Push Piersalvo Ortu 105
106 CAPITOLO 7- XML WML E WAP Inbox e Main Menu), sono proprie del simulatore di cellulare utilizzato e come tali non fanno parte dell applicazione del libretto. Esaminiamo ora l altra opzione del menù di figura 7.8: Prenota Esame, che porta, una volta scelta, alla seconda card, (Prenot), della pagina menu.wml. In questo caso viene fornito all utente un modulo come quello di figura , nel quale è necessario inserire nome, cognome, matricola, e scegliere l anno a cui appartiene l esame che deve essere prenotato. In base all anno scelto, (figura 7.12), si passa ad una delle rispettive card: anno1, anno2, anno3, presenti nella pagina menu.wml, e da non confondere con quelle della terza pagina (CheckEsami.wml), che hanno gli stessi nomi. Le tre card, presentano all utente un elenco degli esami che possono essere prenotati. L elenco di tali esami cambia in base all anno selezionato. Ad esempio scegliendo il primo anno verranno visualizzati gli esami in figura 7.14, mentre per il secondo quelli di figura 7.15 e così via. È possibile aggiungere nuovi esami all elenco, (per qualsiasi anno), o addirittura cambiarli, modificando o aggiungendo gli elementi <option > all interno delle tre card. Una volta scelto un esame da prenotare, (figura 7.14 o 7.15), scegliendo il menù Options, in basso a sinistra nel display, vengono presentate all utente due possibili scelte (vb figura 7.13): la prima Invia, consente di inviare allo script i dati inseriti nel modulo di figura La seconda Clear, consente di cancellare i dati inseriti nel modulo nel caso qualcuno sia stato inserito erroneamente. Figura 7.11 Modulo Figura 7.12 Scelta 7.13 Menù Options di prenotazione esame dell anno dell esame 7.14 Elenco esami 7.15 Elenco esami primo anno secondo anno Piersalvo Ortu 106
107 CAPITOLO 7- XML WML E WAP Infine, selezionando Invia, i dati: nome, cognome, matricola e anno inseriti, vengono inviati allo script esamireg.asp sul server. Oltre questi dati viene inviata la variabile Mod con valore 2. Nel caso venga scelta invece l opzione Esami Registrati, tale variabile ha valore 1. La variabile Mod informa lo script su quale opzione è stata scelta, e in base a quest ultima esegue diverse operazioni che verranno analizzate nel prossimo paragrafo. 7.6 SCRIPT E TRASFORMAZIONE DA XML A WML Quello che segue è il codice dello script esamireg.asp: <%@ Language=VBScript %> <!-- #INCLUDE FILE="FunzLib.asp" --> <%Response.Buffer = True%> <%Response.ContentType = "text/vnd.wap.wml"%> <%response.write "<?xml version="+chr(34)+"1.0"+chr(34)+"?>"%> <%response.write "<!DOCTYPE wml PUBLIC "+chr(34)+"-//wapforum//dtd WML 1.1//EN"+chr(34)+" "+chr(34)+" >"%> <% Set objrs = CreateObject("ADODB.Recordset") Set objcnn = CreateObject("ADODB.Connection") objcnn.open "DRIVER={Microsoft Access Driver (*.mdb)};" & "DBQ=" & server.mappath("/libretto_wap") & "\" & "DATABASE/DatiStudenti.mdb" ' *********************************************************************************************************************** Visualizzazione dei dati sullo studente - Prima IF IF(Request("Mod")="3") Then Set objrs = objcnn.execute("select nome, cognome, matricola from Students" & " where COGNOME="&"'"&Request("Cogn")&"'"& " And " &" MATRICOLA="&"'"&Request("Matr")&"'"&";") Do while Not objrs.eof For each objfield in objrs.fields If (objfield.value<>request("cogn") and objfield.value<>request("matr")) Then intok=0 else intok=1 End If Next objrs.movenext Loop%> <%IF(intOK=0) Then%> <%response.write "<wml>"%> <%response.write "<card>"%> <%response.write "<p>"%> <%response.write "<b>studente non registrato</b><br/>"%> <%response.write "</p>"%> <%response.write "</card>"%> <%response.write "</wml>"%> <%Else%> <%response.write "<wml>"%> <%response.write "<card>"%> <%response.write "<p>"%> <%response.write "<b>libretto di:</b><br/>"%> <%objrs.movefirst%> Piersalvo Ortu 107
108 CAPITOLO 7- XML WML E WAP <%response.write(transformxml(recordstoxml(objrs, "student"), "wapsheet.xsl"))%> <%response.write "<anchor title="+chr(34)+"menus"+chr(34)+"><br/>menu -->"%> <%response.write "<go href="+chr(34)+"menu.wml"+chr(34)+"/>"%> <%response.write "</anchor>"%> <%response.write "</p>"%> <%response.write "</card>"%> <%response.write "</wml>"%> <%End If End If ' ********************************************************************************************************************** ' ********************************************************************************************************************** Visualizzazione degli esami registrati nel libretto virtuale - Seconda IF IF(Request("Mod")="1") Then Set objrs = objcnn.execute("select materia,voto,data from esami" & " where MATERIA="&"'"&Request("Es")&"'"& " And " &" MATRICOLA="&"'"&Request("Matr")&"'"&";") Do while Not objrs.eof For Each objfield in objrs.fields IF IsNull(objField) Then intvar = 0 Else intvar = 1 End If Next objrs.movenext Loop %> <%IF (intvar=0) Then%> <%response.write "<wml>"%> <%response.write "<card>"%> <%response.write "<p align="+chr(34)+"center"+chr(34)+">"%> <%response.write "<b>esame non registrato</b>"%> <%response.write "</p>"%> <%response.write "</card>"%> <%response.write "</wml>"%> <%Else %> <%response.write "<wml>"%> <%response.write "<card>"%> <%response.write "<p align="+chr(34)+"center"+chr(34)+">"%> <%response.write "<b>esame registrato</b><br/>"%> <%objrs.movefirst%> <%response.write(transformxml(recordstoxml(objrs, "exam"), "wapsheet1.xsl"))%> <%response.write "</p>"%> <%response.write "</card>"%> <%response.write "</wml>"%> <%End If End If ' *********************************************************************************************************************** %> <% Prenotazione degli esami - Terza IF IF(Request("Mod")="2") Then%> <%IF(Request("Anno")="1") Then objcnnp.open "DRIVER={Microsoft Access Driver (*.mdb)};" & "DBQ=" & server.mappath("/libretto_wap") & "\" & "PrenotaEsami/Primoanno/uno.mdb" Piersalvo Ortu 108
109 CAPITOLO 7- XML WML E WAP objmateria = Request("Es") objcnnp.execute( "INSERT INTO " &objmateria& " VALUES("&"'"&Request("Nome")&"',"&" '"&Request("Cogn")&"',"&" '"&Request("Matr")&"')") End If %> <%IF(Request("Anno")="2") Then objcnnp.open "DRIVER={Microsoft Access Driver (*.mdb)};" & "DBQ=" & server.mappath("/libretto_wap") & "\" & "PrenotaEsami/Secondoanno/due.mdb" objmateria = Request("Es") objcnnp.execute( "INSERT INTO " &objmateria& " VALUES("&"'"&Request("Nome")&"',"&" '"&Request("Cogn")&"',"&" '"&Request("Matr")&"')") End If %> <%IF(Request("Anno")="3") Then objcnnp.open "DRIVER={Microsoft Access Driver (*.mdb)};" & "DBQ=" & server.mappath("/libretto_wap") & "\" & "PrenotaEsami/Terzoanno/tre.mdb" objmateria = Request("Es") objcnnp.execute( "INSERT INTO " &objmateria& " VALUES("&"'"&Request("Nome")&"',"&" '"&Request("Cogn")&"',"&" '"&Request("Matr")&"')") End If %> <%response.write "<wml>"%> <%response.write "<card>"%> <%response.write "<p align="+chr(34)+"center"+chr(34)+">"%> <%response.write "<b>esame prenotato</b>"%> <%response.write "</p>"%> <%response.write "</card>"%> <%response.write "</wml>"%> <% End If %> Iniziando ad esaminare il codice, le prime tre righe non hanno bisogno di ulteriori spiegazioni, sono già state viste nello script Transform.asp, nel paragrafo 6.6. Dalla quinta all ottava riga troviamo in ordine: 1) La dichiarazione del tipo di contenuto, in questo caso WML. Affinché il server possa gestire correttamente tale contenuto WML, è necessario fornirgli il tipo MIME (Multipurpose Internet Mail Extension), identificato dalla stringa text/vnd.wap.wml. 2) La dichiarazione XML: <%response.write "<?xml version="+chr(34)+"1.0"+chr(34)+"?>"%> 3) La dichiarazione XML della DTD WML: <%response.write "<!DOCTYPE wml PUBLIC > Vengono poi creati, un oggetto di tipo Recordset, e due oggetti Connection: il primo di questi ultimi, objcnn, è utilizzato per aprire la connessione con il database di Access, nel quale sono registrate le informazioni sugli studenti, mentre il secondo, (objcnnp), serve per la connessione col database delle prenotazioni degli esami. Sia l oggetto Recordset, che quello Connection, sono già stati esaminati quando si è parlato della funzione GetRecords nel paragrafo 6.3. Piersalvo Ortu 109
110 CAPITOLO 7- XML WML E WAP Infine troviamo la parte più importante dello script costituito dal codice all interno delle tre IF principali. Queste controllano il valore della variabile Mod passata dalle tre pagine WML. La prima IF: IF(Request("Mod")="3") Then End If ' ****************************** %> viene eseguita se la variabile Mod ha valore 3, cioè si è eseguita la seconda card della prima pagina WML, nella quale dovevano essere inseriti i dati dello studente (figura 7.5). Le operazioni svolte all interno di questa IF sono 3: 1) viene eseguita la query:.. select nome, cognome, matricola from Students che restituisce un Recordset contenente il nome, il cognome e la matricola dello studente. 2) viene fatto un controllo per sapere, se i dati restituiti nel Recordset, (quelli recuperati dal database), sono diversi da quelli inseriti nel modulo di figura 7.5. In tal caso viene impostato a 0 il valore della variabile intok, altrimenti tale valore viene messo ad 1. 3) Se intok vale 0, viene creato un primo deck: <%response.write "<wml>"%> <%response.write "<card>"%> <%response.write "<p>"%> <%response.write "<b>studente non registrato</b><br/>"%> <%response.write "</p>"%> <%response.write "</card>"%> <%response.write "</wml>"%> per visualizzare il messaggio Studente non registrato (vb figura 7.7); altrimenti viene creato un altro deck: <%response.write "<wml>"%> <%response.write "<card>"%> <%response.write "<p>"%> <%response.write "<b>libretto di:</b><br/>"%> <%objrs.movefirst%> <%response.write(transformxml(recordstoxml(objrs, "student"), "wapsheet.xsl"))%> <%response.write "<anchor title="+chr(34)+"menus"+chr(34)+"><br/>menu -->"%> <%response.write "<go href="+chr(34)+"menu.wml"+chr(34)+"/>"%> <%response.write "</anchor>"%> <%response.write "</p>"%> <%response.write "</card>"%> <%response.write "</wml>"%> per visualizzare le informazioni dello studente come in figura 7.6. Le informazioni sullo studente vengono restituite eseguendo la seguente riga di codice: <%response.write(transformxml(recordstoxml(objrs, "student"), "wapsheet.xsl"))%> che era già stata utilizzata, anche se con qualche modifica, nel capitolo 6, quando si era parlato di trasformazioni da XML ad HTML Lato-Server (paragrafo 6.6). In questo caso si parla di trasformazioni da XML a WML. Piersalvo Ortu 110
111 CAPITOLO 7- XML WML E WAP Analizzando tale riga di codice ritroviamo la funzione RecordsToXML già vista nel paragrafo 6.6, che converte il Recordset objrs in un documento XML simile a quello che segue: <students> <student> <nome>piersalvo</nome> <matricola>508018</matricola> <cognome>ortu</cognome> </student> </students> al quale viene applicato il foglio di stile wapsheet.xsl che segue: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet xmlns:xsl=" <xsl:template match="/"> <xsl:value-of select="students/student/nome"/> <xsl:value-of select="students/student/cognome"/> Matricola: <xsl:value-of select="students/student/matricola"/> </xsl:template> </xsl:stylesheet> Il compito di questo foglio di stile è quello di restituire le informazioni contenute nel documento XML precedente, nome, cognome e matricola, (costituite da semplice testo), all interno del deck seguente: <%response.write <wml> %> <%response.write </wml> %> ottenendo la trasformazione da XML a WML. Com è possibile notare nel documento XML precedente, (<students>. </students), non sono state incluse tutte le informazioni presenti nel documento XML visto nel paragrafo 6.3. Sono state utilizzate solo quelle ritenute più importanti. Questa scelta è stata fatta tenendo conto delle dimensioni dei display dei cellulari che sono abbastanza piccole. Esaminiamo ora la seconda IF, che si presenta così: IF(Request("Mod")="1") Then End If ' ****************************** %> Il codice all interno di questa IF viene eseguito se Mod è uguale 1. Significa cioè che si è eseguita la seconda opzione, (Esami Registrati), visibile in figura 7.8. Tale opzione consente all utente di controllare se un determinato esame è stato registrato nel libretto. Una volta inviati i dati e la variabile Mod, (Mod=1), allo script, questo riconoscendo la modalità 1, esegue le seguenti operazioni all interno della IF: Piersalvo Ortu 111
112 CAPITOLO 7- XML WML E WAP Per prima viene eseguita la seguente query:..("select materia,voto,data from esami" & " where MATERIA="&"'"&Request("Es")&"'"& " And " &" MATRICOLA="&"'"&Request("Matr")&"'"&";") che restituisce un Recordset contenete le informazioni sulla materia, il voto e la data dell esame, in base alla matricola e all esame scelto ad esempio dall elenco di figura Nel caso non ci siano ancora esami registrati viene restituito un Recordset vuoto. Tale Recordset viene quindi scandito per verificare se è vuoto o meno. Se è vuoto viene messa a 0 la variabile intvar, altrimenti a 1. Se intvar è = 0, allora viene visualizzato il messaggio Esame non registrato (figura 7.17), altrimenti si ottiene la schermata di figura Figura 7.16 Esame registrato Figura 7.17 Esame non registrato Analizziamo la riga di codice seguente: <%response.write(transformxml(recordstoxml(objrs, "exam"), "wapsheet1.xsl"))%> Tale riga è simile a quella già vista precedentemente, cambia solamente il nome dell elemento radice del documento XML, (exam), e il nome del foglio di stile applicato a quest ultimo. La funzione RecordsToXML, come è stato detto più volte, converte il Recordset objrs restituito dall ultima query vista, in un documento XML come il seguente: <exams> <exam> <materia>fisica1</materia> <voto>26</voto> <data>05/10/03</data> </exam> </exams> al quale poi viene applicato il foglio di stile wapsheet1.xsl seguente: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl=" <xsl:template match="/"> <xsl:value-of select="exams/exam/materia"/><br/> Voto: <xsl:value-of select="exams/exam/voto"/><br/> Data: <xsl:value-of select="exams/exam/data"/> Piersalvo Ortu 112
113 CAPITOLO 7- XML WML E WAP </xsl:template> </xsl:stylesheet> La funzione transformxml applica questo foglio di stile al documento XML precedente, ed effettua la trasformazione XSLT, che restituisce le informazioni contenute in quest ultimo, all interno del deck che segue: <%response.write <wml> %> <%response.write </wml> %> proprio come il caso visto nella prima IF. Anche in questo caso si è ottenuta una trasformazione da XML a WML. Considerando le informazioni contenute nel documento XML precedente il deck restituito dallo script dovrebbe apparire così: <wml> <card> <p align="center"> <b>esame registrato</b><br/> FISICA1<br/> Voto: 26<br/> Data: 05/10/03 </p> </card> </wml> e la visualizzazione ottenuta è quella di figura Per concludere la descrizione dello script esaminiamo la terza IF: <% IF(Request("Mod")="2") Then%> <% End If %> che si occupa di gestire le prenotazioni degli esami effettuate dal modulo di figura All interno della IF principale sono presenti altre tre IF che controllano quale anno è stato scelto (figura 7.12). In base a tale scelta viene aperta la connessione con il database corrispondente. Ad esempio, prendiamo in esame il caso in cui sia stato scelto il primo anno, in quanto gli altri due casi sono del tutto simili. Viene aperta la connessione con il database uno.mdb, che si trova all interno della directory PrenotaEsami, a sua volta all interno della directory Primoanno cioè: objcnnp.open "DRIVER={Microsoft Access Driver (*.mdb)};" & "DBQ=" & server.mappath("/libretto_wap") & "\" &"PrenotaEsami/Primoanno/uno.mdb". I database sono in tutto tre, uno per ciascun anno, (3 previsti). All interno di ciascun database vi sono delle tabelle, una per ciascun esame previsto per quel determinato anno. In tal modo Piersalvo Ortu 113
114 CAPITOLO 7- XML WML E WAP ogni prenotazione viene registrata nella propria tabella corrispondente. Ad esempio la prenotazione dell esame di fisica1, viene inserita nella tabella fisica1, (figura 7.18). Nel database del primo anno ad esempio sono definite le tabelle per gli esami di: matematica1 fisica1 matematica2 com è possibile vedere nella figura successiva. Figura 7.18 Tabelle per le prenotazioni degli esami del primo anno Naturalmente è possibile aggiungere o modificare le tabelle in base alle proprie esigenze. Per terminare l analisi di questa parte, una volta aperta la connessione col database, viene memorizzato nella variabile objmateria, il nome dell esame prenotato, disponibile nella variabile Es, che viene passata allo script da una delle tre card ( ), nella pagina menu.wml, cioè: objmateria = Request("Es") Tale nome, oltre a rappresentare quello dell esame, è anche il nome della tabella corrispondente nel database. Per chiarire il tutto vediamo un esempio. Supponiamo di aver aver scelto di prenotare l esame di fisica1 nell elenco di figura La riga di codice corrispondente è: <option value="fisica1">fisica1</option> che si trova nella terza card della pagina menu.wml. Piersalvo Ortu 114
115 CAPITOLO 7- XML WML E WAP Com è possibile notare l elemento option ha un attributo, value, con il valore fisica1, che deve essere uguale al nome della tabella fisica1 presente nel database, come mostra la figura Per cui tale corrispondenza è vitale affinché l applicazione funzioni correttamente. Tale valore inoltre viene applicato alla variabile Es dell elemento select: <select multiple="false" name="es"> e poi inviata allo script, come è stato già detto prima. Infine la variabile objmateria, viene utilizzata per eseguire la query che segue: "INSERT INTO " &objmateria& " VALUES("&"'"&Request("Nome")&"',"&" '"&Request("Cogn")&"',"&" '"&Request("Matr")&"')" che consente di memorizzare i dati nome, cognome e matricola inseriti nel modulo di figura 7.11, nella tabella indicata dalla variabile. Piersalvo Ortu 115
116 CONCLUSIONI In conclusione si può dire che il linguaggio XML è una vera rivoluzione nello sviluppo delle applicazioni Web e non solo, ma anche, come si è visto nel capitolo 7, nelle applicazioni Wireless, ed anche in applicazioni TV. La vera innovazione portata da XML è data dal fatto che è possibile trasformare dinamicamente i documenti XML in altri tipi di documenti, ad esempio in HTML, nel formato PDF, utilizzato per la stampa dei documenti, in formato audio (attraverso i cosiddetti fogli di stile acustici), o in formato video e Braille, ecc. Tutto ciò è possibile grazie all introduzione del linguaggio XSL- XSLT, che permette di definire i fogli di stile che, applicati al documento XML, consentono di effettuare le trasformazioni da XML ad un altro formato, quest ultimo scelto in base al browser utilizzato per la visualizzazione delle informazioni contenute nel documento XML. Inoltre sempre grazie ai fogli di stile è possibile modificare l aspetto globale delle informazioni contenute nel documento XML, in maniera tale che siano correttamente visualizzate dal browser a cui vengono inviate. Una novità importante apportata dai fogli di stile è il fatto che le informazioni del documento XML sono completamente separate dal foglio di stile, facilitandone la manutenzione o eventuali modifiche future da parte degli sviluppatori. In poche parole è possibile, utilizzando un unico documento, in XML, ottenere una varietà di altri tipi di documento, semplicemente applicando il tipo di trasformazione adeguata al documento XML. Tutto ciò non era possibile fino a poco tempo fa, utilizzando semplicemente il linguaggio HTML, in quanto non c era una netta separazione tra le informazioni, e il codice HTML utilizzato per effettuare la formattazione delle informazioni stesse, per cui non era possibile l utilizzo e l elaborazione successiva delle informazioni da parte ad esempio di linguaggi di programmazione o di Script. Piersalvo Ortu 116
117 INDICE Prefazione...1 CAPITOLO 1 IL LINGUAGGIO XML C E N N I S U X M L RELAZIONE TRA SGML E XML RELAZIONE TRA HTML E XML OBIETTIVI PROGETTUALI DI XML PROPRIETÀ DI XML STRUTTURA E SINTASSI DI UN DOCUMENTO XML STRUTTURA LOGICA IL PROLOGO DICHIARAZIONE XML DICHIARAZIONE DEL TIPO DI DOCUMENTO L ELEMENTO DOCUMENT STRUTTURA FISICA DEL LINGUAGGIO XML SINTASSI XML GLI ELEMENTI GLI ATTRIBUTI LE ENTITÀ I COMMENTI DOCUMENTI XML VALIDI E WELL FORMED DOCUMENTI VALIDI DOCUMENTI BEN-FORMATI, (WELL FORMED) SPAZIO DEI NOMI XML (XML NAMESPACE) CREAZIONE DI NOMI UNIVOCI TRAMITE GLI SPAZI DEI NOMI XML NOMI QUALIFICATI NOMI NON QUALIFICATI AREA DI VALIDITÀ DELLO SPAZIO DEI NOMI SPAZIO DEI NOMI PREDEFININTI DICHIARAZIONE DELLO SPAZIO DEI NOMI COME URL O URN SPAZIO DEI NOMI DEGLI ATTRIBUTI...22 CAPITOLO 2 DTD LE DTD E LA CONVALIDA STRUTTURA DELLE DTD DTD DI TIPO SYSTEM DTD DI TIPO PUBLIC USO COMBINATO DI DTD INTERNI ED ESTERNI DICHIARAZIONE DEI TIPI ELEMENTO ELEMENTI FIGLI (CHILDREN ELEMENTS)...26 Piersalvo Ortu CXVII
118 INDICE ELEMENTI ANNIDATI ELEMENTI DI TIPO MISTO (MIXED) DICHIARAZIONE DEI TIPI ATTRIBUTO DICHIARAZIONE DI ENTITÀ...31 CAPITOLO 3 XML SCHEMA COSA SONO GLI SCHEMI DTD E SCHEMI A CONFRONTO STRUTTURA DEL DOCUMENTO DELLO SCHEMA DICHIARAZIONE DI ELEMENTI DELLO SCHEMA TIPI DI ELEMENTI TIPO DI CONTENUTO GRUPPI DI ELEMENTI VINCOLI SUGLI ELEMENTI DICHIARAZIONE DI ATTRIBUTI DICHIARAZIONE DI ENTITÀ...46 CAPITOLO 4 FOGLI DI STILE COSA SONO I FOGLI DI STILE SCELTA TRA XSL E CSS VANTAGGI DI XSL CONCETTI ALLA BASE DI XSLT CENNI SU XPATH STRUTTURA DEI FOGLI DI STILE COLLEGAMENTO DI UN FOGLIO DI STILE AD UN DOCUMENTO XML UTILIZZO DI MODELLI...56 CAPITOLO 5 SOFTWARE PER XML EDITOR XML ANALIZZATORI NON CONVALIDANTI ANALIZZATORI CONVALIDANTI ELABORATORI XSLT MSXSL.EXE SCELTA DEGLI EDITOR E DEI BROWSER...67 CAPITOLO 6 PROGETTAZIONE PROGETTO: LIBRETTO UNIVERSITARIO VIRTUALE - INTRODUZIONE FASI DEL PROGETTO DOCUMENTI XML DOCUMENTO DELLA DTD E DELLO SCHEMA FOGLI DI STILE TRASFORMAZIONI LATO-SERVER FOGLI DI STILE PER TRASFORMAZIONI DA XML AD XHTML...91 Piersalvo Ortu CXVIII
119 INDICE CAPITOLO 7 XML WML E WAP LIBRETTO VERSIONE WAP - INTRODUZIONE LE PAGINE WML COME FUNZIONA IL WAP SOFTWARE PROGETTAZIONE SCRIPT E TRASFORMAZIONE DA XML A WML Conclusioni Piersalvo Ortu CXIX
120 Bibliografia Per i Capitoli Heather Williamson - La Guida Completa XML - McGraw Hill Siti per il materiale su XML: Per il Capitolo 6 Informazioni sulle Trasformazioni Lato-Server Per il Capitolo 7 Materiale su Wireless, Wap e WML Piersalvo Ortu CXX
extensible Markup Language
XML a.s. 2010-2011 extensible Markup Language XML è un meta-linguaggio per definire la struttura di documenti e dati non è un linguaggio di programmazione un documento XML è un file di testo che contiene
Capitolo 4 Pianificazione e Sviluppo di Web Part
Capitolo 4 Pianificazione e Sviluppo di Web Part Questo capitolo mostra come usare Microsoft Office XP Developer per personalizzare Microsoft SharePoint Portal Server 2001. Spiega come creare, aggiungere,
connessioni tra i singoli elementi Hanno caratteristiche diverse e sono presentati con modalità diverse Tali relazioni vengono rappresentate QUINDI
Documenti su Internet LINGUAGGI DI MARKUP Internet permette (tra l altro) di accedere a documenti remoti In generale, i documenti acceduti via Internet sono multimediali, cioè che possono essere riprodotti
XML. XML è contemporaneamente: XML non è:
XML XML è contemporaneamente: Linguaggio di annotazione (Markup) che permette di creare gruppi di marcatori (tag set) personalizzati (MathML, XHTML, chemicalml, ecc..) Formato standard per lo scambio dei
Il database management system Access
Il database management system Access Corso di autoistruzione http://www.manualipc.it/manuali/ corso/manuali.php? idcap=00&idman=17&size=12&sid= INTRODUZIONE Il concetto di base di dati, database o archivio
Excel. A cura di Luigi Labonia. e-mail: [email protected]
Excel A cura di Luigi Labonia e-mail: [email protected] Introduzione Un foglio elettronico è un applicazione comunemente usata per bilanci, previsioni ed altri compiti tipici del campo amministrativo
Database. Si ringrazia Marco Bertini per le slides
Database Si ringrazia Marco Bertini per le slides Obiettivo Concetti base dati e informazioni cos è un database terminologia Modelli organizzativi flat file database relazionali Principi e linee guida
EXPLOit Content Management Data Base per documenti SGML/XML
EXPLOit Content Management Data Base per documenti SGML/XML Introduzione L applicazione EXPLOit gestisce i contenuti dei documenti strutturati in SGML o XML, utilizzando il prodotto Adobe FrameMaker per
XML: extensible Markup Language
XML: extensible Markup Language Laura Farinetti Dip. Automatica e Informatica Politecnico di Torino [email protected] L. Farinetti - Politecnico di Torino 1 Introduzione XML: extensible Markup
Simple & Efficient. www.quick-software-line.com
Cosa è XML? extensible Markup Language Linguaggio è una definizione limitativa XML serve a descrivere con precisione qualsiasi informazione XML è estensibile. Ovvero non ha tag predefiniti come HTML XML
ESERCITAZIONE Semplice creazione di un sito Internet
ESERCITAZIONE Semplice creazione di un sito Internet Sistemi e Tecnologie Informatiche - Prof. Gregorio Cosentino 1 Internet Una rete globale che connette milioni di computer in tutto il mondo, anarchica
La struttura: DTD. Laura Farinetti Dip. Automatica e Informatica Politecnico di Torino. [email protected]
La struttura: DTD Laura Farinetti Dip. Automatica e Informatica Politecnico di Torino [email protected] L. Farinetti - Politecnico di Torino 1 Modello di struttura I tag annidati danno origine
Architettura del. Sintesi dei livelli di rete. Livelli di trasporto e inferiori (Livelli 1-4)
Architettura del WWW World Wide Web Sintesi dei livelli di rete Livelli di trasporto e inferiori (Livelli 1-4) - Connessione fisica - Trasmissione dei pacchetti ( IP ) - Affidabilità della comunicazione
Siti web centrati sui dati (Data-centric web applications)
Siti web centrati sui dati (Data-centric web applications) 1 A L B E R T O B E L U S S I A N N O A C C A D E M I C O 2 0 1 2 / 2 0 1 3 WEB La tecnologia del World Wide Web (WWW) costituisce attualmente
Laboratorio Matematico Informatico 2
Laboratorio Matematico Informatico 2 (Matematica specialistica) A.A. 2006/07 Pierluigi Amodio Dipartimento di Matematica Università di Bari Laboratorio Matematico Informatico 2 p. 1/1 Informazioni Orario
Applicazioni web centrati sui dati (Data-centric web applications)
Applicazioni web centrati sui dati (Data-centric web applications) 1 ALBERTO BELUSSI ANNO ACCADEMICO 2009/2010 WEB La tecnologia del World Wide Web (WWW) costituisce attualmente lo strumento di riferimento
Guida alla registrazione on-line di un DataLogger
NovaProject s.r.l. Guida alla registrazione on-line di un DataLogger Revisione 3.0 3/08/2010 Partita IVA / Codice Fiscale: 03034090542 pag. 1 di 17 Contenuti Il presente documento è una guida all accesso
Sistema operativo. Sommario. Sistema operativo...1 Browser...1. Convenzioni adottate
MODULO BASE Quanto segue deve essere rispettato se si vuole che le immagini presentate nei vari moduli corrispondano, con buona probabilità, a quanto apparirà nello schermo del proprio computer nel momento
Reti di Telecomunicazione Lezione 6
Reti di Telecomunicazione Lezione 6 Marco Benini Corso di Laurea in Informatica [email protected] Lo strato di applicazione protocolli Programma della lezione Applicazioni di rete client - server
Capitolo 2. Operazione di limite
Capitolo 2 Operazione di ite In questo capitolo vogliamo occuparci dell operazione di ite, strumento indispensabile per scoprire molte proprietà delle funzioni. D ora in avanti riguarderemo i domini A
Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da
ARPA Fonte Dati Regione Toscana Redatto da L. Folchi (TAI) Rivisto da Approvato da Versione 1.0 Data emissione 06/08/13 Stato DRAFT 1 Versione Data Descrizione 1,0 06/08/13 Versione Iniziale 2 Sommario
Progetto: ARPA Fonte Dati. ARPA Fonte Dati. Regione Toscana. Manuale Amministratore
ARPA Fonte Dati Regione Toscana 1 Redatto da L. Folchi (TAI) Rivisto da Approvato da Versione 1.1 Data emissione 09/10/13 Stato FINAL 2 Versione Data Descrizione 1,0 06/08/13 Versione Iniziale 1.1 09/10/2013
ARCHIVI E DATABASE (prof. Ivaldi Giuliano)
ARCHIVI E DATABASE (prof. Ivaldi Giuliano) Archivio: è un insieme di registrazioni (o records) ciascuna delle quali è costituita da un insieme prefissato di informazioni elementari dette attributi (o campi).
Corrispondenze e funzioni
Corrispondenze e funzioni L attività fondamentale della mente umana consiste nello stabilire corrispondenze e relazioni tra oggetti; è anche per questo motivo che il concetto di corrispondenza è uno dei
FtpZone Guida all uso Versione 2.1
FtpZone Guida all uso Versione 2.1 La presente guida ha l obiettivo di spiegare le modalità di utilizzo del servizio FtpZone fornito da E-Mind Srl. All attivazione del servizio E-Mind fornirà solamente
Linguaggi per il web oltre HTML: XML
Linguaggi per il web oltre HTML: XML Luca Console Con XML si arriva alla separazione completa tra il contenuto e gli aspetti concernenti la presentazione (visualizzazione). XML è in realtà un meta-formalismo
La sintassi di un DTD si basa principalmente sulla presenza di quattro dichiarazioni:
XML: DTD Da un punto di vista cronologico, il primo approccio per la definizione di grammatiche per documenti XML è rappresentato dai Document Type Definition (DTD). Un DTD è un documento che descrive
MANUALE MOODLE STUDENTI. Accesso al Materiale Didattico
MANUALE MOODLE STUDENTI Accesso al Materiale Didattico 1 INDICE 1. INTRODUZIONE ALLA PIATTAFORMA MOODLE... 3 1.1. Corso Moodle... 4 2. ACCESSO ALLA PIATTAFORMA... 7 2.1. Accesso diretto alla piattaforma...
Cosa è un foglio elettronico
Cosa è un foglio elettronico Versione informatica del foglio contabile Strumento per l elaborazione di numeri (ma non solo...) I valori inseriti possono essere modificati, analizzati, elaborati, ripetuti
G I O R D A N I A L E S S A N D R A I T T S E R A L E G. M A R C O N I
Introduzione ad XML G I O R D A N I A L E S S A N D R A I T T S E R A L E G. M A R C O N I XML XML (Extensible Markup Language) è un insieme standard di regole sintattiche per modellare la struttura di
Che cos'è un modulo? pulsanti di opzione caselle di controllo caselle di riepilogo
Creazione di moduli Creazione di moduli Che cos'è un modulo? Un elenco di domande accompagnato da aree in cui è possibile scrivere le risposte, selezionare opzioni. Il modulo di un sito Web viene utilizzato
COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA
LINGUAGGI DI ALTO LIVELLO Si basano su una macchina virtuale le cui mosse non sono quelle della macchina hardware COS È UN LINGUAGGIO? Un linguaggio è un insieme di parole e di metodi di combinazione delle
Corso di HTML. Prerequisiti. Modulo L3. 1-Concetti generali. Browser Rete Internet Client e server. M. Malatesta 1-Concetti generali-12 28/07/2013
Corso di HTML Modulo L3 1-Concetti generali 1 Prerequisiti Browser Rete Internet Client e server 2 1 Introduzione In questa Unità introduciamo alcuni semplici elementi del linguaggio HTML, con il quale
Manuale Amministratore Legalmail Enterprise. Manuale ad uso degli Amministratori del Servizio Legalmail Enterprise
Manuale Amministratore Legalmail Enterprise Manuale ad uso degli Amministratori del Servizio Legalmail Enterprise Pagina 2 di 16 Manuale Amministratore Legalmail Enterprise Introduzione a Legalmail Enterprise...3
Progettaz. e sviluppo Data Base
Progettaz. e sviluppo Data Base! Progettazione Basi Dati: Metodologie e modelli!modello Entita -Relazione Progettazione Base Dati Introduzione alla Progettazione: Il ciclo di vita di un Sist. Informativo
Organizzazione degli archivi
COSA E UN DATA-BASE (DB)? è l insieme di dati relativo ad un sistema informativo COSA CARATTERIZZA UN DB? la struttura dei dati le relazioni fra i dati I REQUISITI DI UN DB SONO: la ridondanza minima i
Database 1 biblioteca universitaria. Testo del quesito
Database 1 biblioteca universitaria Testo del quesito Una biblioteca universitaria acquista testi didattici su indicazione dei professori e cura il prestito dei testi agli studenti. La biblioteca vuole
Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.
Algoritmi 1 Sommario Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi. 2 Informatica Nome Informatica=informazione+automatica. Definizione Scienza che si occupa dell
Infrastrutture INFormatiche Ospedaliere 2 Corso di laurea di Ingegneria Medica. Indice
Indice 4. XML Extensible Markup Language...2 4.1 Usi di XML...3 4.2 Caratteristiche di XML...3 4.3 Elementi...5 4.4 Attributi...5 4.4.1 Documento XML ben formato...6 4.5 Informazioni di controllo...6 4.5.1
Istruzioni per l installazione del software per gli esami ICoNExam (Aggiornate al 15/01/2014)
Istruzioni per l installazione del software per gli esami ICoNExam (Aggiornate al 15/01/2014) Il software per gli esami ICON può essere eseguito su qualunque computer dotato di Java Virtual Machine aggiornata.
Come costruire una presentazione. PowerPoint 1. ! PowerPoint permette la realizzazione di presentazioni video ipertestuali, animate e multimediali
PowerPoint Come costruire una presentazione PowerPoint 1 Introduzione! PowerPoint è uno degli strumenti presenti nella suite Office di Microsoft! PowerPoint permette la realizzazione di presentazioni video
Manuale Utente Albo Pretorio GA
Manuale Utente Albo Pretorio GA IDENTIFICATIVO DOCUMENTO MU_ALBOPRETORIO-GA_1.4 Versione 1.4 Data edizione 04.04.2013 1 TABELLA DELLE VERSIONI Versione Data Paragrafo Descrizione delle modifiche apportate
MODULO 5 Appunti ACCESS - Basi di dati
MODULO 5 Appunti ACCESS - Basi di dati Lezione 1 www.mondopcnet.com Modulo 5 basi di dati Richiede che il candidato dimostri di possedere la conoscenza relativa ad alcuni concetti fondamentali sui database.
Informatica per la comunicazione" - lezione 10 -
Informatica per la comunicazione" - lezione 10 - Evoluzione del Web" Nell evoluzione del Web si distinguono oggi diverse fasi:" Web 1.0: la fase iniziale, dal 1991 ai primi anni del 2000" Web 2.0: dai
2.0 Gli archivi. 2.1 Inserire gli archivi. 2.2 Archivio Clienti, Fornitori, Materiali, Noleggi ed Altri Costi. Impresa Edile Guida all uso
2.0 Gli archivi All interno della sezione archivi sono inserite le anagrafiche. In pratica si stratta di tutti quei dati che ricorreranno costantemente all interno dei documenti. 2.1 Inserire gli archivi
EXCEL PER WINDOWS95. sfruttare le potenzialità di calcolo dei personal computer. Essi si basano su un area di lavoro, detta foglio di lavoro,
EXCEL PER WINDOWS95 1.Introduzione ai fogli elettronici I fogli elettronici sono delle applicazioni che permettono di sfruttare le potenzialità di calcolo dei personal computer. Essi si basano su un area
Strutturazione logica dei dati: i file
Strutturazione logica dei dati: i file Informazioni più complesse possono essere composte a partire da informazioni elementari Esempio di una banca: supponiamo di voler mantenere all'interno di un computer
CORSO ACCESS PARTE II. Esistono diversi tipi di aiuto forniti con Access, generalmente accessibili tramite la barra dei menu (?)
Ambiente Access La Guida di Access Esistono diversi tipi di aiuto forniti con Access, generalmente accessibili tramite la barra dei menu (?) Guida in linea Guida rapida Assistente di Office indicazioni
Novità di Access 2010
2 Novità di Access 2010 In questo capitolo: Gestire le impostazioni e i file di Access nella visualizzazione Backstage Personalizzare l interfaccia utente di Access 2010 Creare database utilizzando modelli
Come funziona il WWW. Architettura client-server. Web: client-server. Il protocollo
Come funziona il WWW Il funzionamento del World Wide Web non differisce molto da quello delle altre applicazioni Internet Anche in questo caso il sistema si basa su una interazione tra un computer client
lo 2 2-1 - PERSONALIZZARE LA FINESTRA DI WORD 2000
Capittol lo 2 Visualizzazione 2-1 - PERSONALIZZARE LA FINESTRA DI WORD 2000 Nel primo capitolo sono state analizzate le diverse componenti della finestra di Word 2000: barra del titolo, barra dei menu,
per immagini guida avanzata Organizzazione e controllo dei dati Geometra Luigi Amato Guida Avanzata per immagini excel 2000 1
Organizzazione e controllo dei dati Geometra Luigi Amato Guida Avanzata per immagini excel 2000 1 Il raggruppamento e la struttura dei dati sono due funzioni di gestione dati di Excel, molto simili tra
MODA-ML: Esempi di XSL (Extensible Stylesheet Language) Vocabolario di supporto alla creazione di un set di Schemi di documenti XML
MODA-ML: Esempi di XSL (Extensible Stylesheet Language) Vocabolario di supporto alla creazione di un set di Schemi di documenti XML Thomas Imolesi [email protected] [email protected] XML un linguaggio
Corso di Informatica
Corso di Informatica Modulo T2 3-Compilatori e interpreti 1 Prerequisiti Principi di programmazione Utilizzo di un compilatore 2 1 Introduzione Una volta progettato un algoritmo codificato in un linguaggio
XML: La nascita del linguaggio
XML: introduzione alla codifica dei testi Con la codifica dei testi si intende la rappresentazione dei testi stessi su un supporto digitale in un formato utilizzabile dall'elaboratore (Machine Readable
MODELLO RELAZIONALE. Introduzione
MODELLO RELAZIONALE Introduzione E' stato proposto agli inizi degli anni 70 da Codd finalizzato alla realizzazione dell indipendenza dei dati, unisce concetti derivati dalla teoria degli insiemi (relazioni)
GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL
GUIDA RAPIDA BOZZA 23/07/2008 INDICE 1. PERCHÉ UNA NUOVA VERSIONE DEI MODULI DI RACCOLTA DATI... 3 2. INDICAZIONI GENERALI... 4 2.1. Non modificare la struttura dei fogli di lavoro... 4 2.2. Cosa significano
7. Layer e proprietà degli oggetti
7. Layer e proprietà degli oggetti LAYER 09/01/13 ing. P. Rordorf arch. D. Bruni arch. A. Chiesa ing. A. Ballarini 38(52) Le proprietà dei layer: - Nome: ogni layer ha un nome proprio che ne permette una
Software di sistema e software applicativo. I programmi che fanno funzionare il computer e quelli che gli permettono di svolgere attività specifiche
Software di sistema e software applicativo I programmi che fanno funzionare il computer e quelli che gli permettono di svolgere attività specifiche Software soft ware soffice componente è la parte logica
Lezione 8. La macchina universale
Lezione 8 Algoritmi La macchina universale Un elaboratore o computer è una macchina digitale, elettronica, automatica capace di effettuare trasformazioni o elaborazioni su i dati digitale= l informazione
Linguaggi e Paradigmi di Programmazione
Linguaggi e Paradigmi di Programmazione Cos è un linguaggio Definizione 1 Un linguaggio è un insieme di parole e di metodi di combinazione delle parole usati e compresi da una comunità di persone. È una
Introduzione alla programmazione in C
Introduzione alla programmazione in C Testi Consigliati: A. Kelley & I. Pohl C didattica e programmazione B.W. Kernighan & D. M. Ritchie Linguaggio C P. Tosoratti Introduzione all informatica Materiale
Facoltà di Farmacia - Corso di Informatica
Basi di dati Riferimenti: Curtin cap. 8 Versione: 13/03/2007 1 Basi di dati (Database, DB) Una delle applicazioni informatiche più utilizzate, ma meno conosciute dai non informatici Avete già interagito
Mon Ami 3000 Varianti articolo Gestione di varianti articoli
Prerequisiti Mon Ami 3000 Varianti articolo Gestione di varianti articoli L opzione Varianti articolo è disponibile per le versioni Azienda Light e Azienda Pro e include tre funzionalità distinte: 1. Gestione
Il sistema operativo: interazione con l utente
interazione con l utente S.O fornisce un meccanismo per specificare le attività da eseguire (es. copiare un file) L interazione avviene mediante un linguaggio testuale (DOS) o grafico (Windows) linguaggio
Guida Compilazione Piani di Studio on-line
Guida Compilazione Piani di Studio on-line SIA (Sistemi Informativi d Ateneo) Visualizzazione e presentazione piani di studio ordinamento 509 e 270 Università della Calabria (Unità organizzativa complessa-
CMS ERMES INFORMATICA
01/07/2014 Guida di riferimento alla pubblicazione di contenuti sul portale Il presente documento costituisce una guida di riferimento all aggiornamento e alla pubblicazione di contenuti sui portali web
. A primi passi con microsoft a.ccepss SommarIo: i S 1. aprire e chiudere microsoft access Start (o avvio) l i b tutti i pro- grammi
Capitolo Terzo Primi passi con Microsoft Access Sommario: 1. Aprire e chiudere Microsoft Access. - 2. Aprire un database esistente. - 3. La barra multifunzione di Microsoft Access 2007. - 4. Creare e salvare
Sviluppata da: Lo Russo - Porcelli Pag. 1 di 6 6FRSR utilizzare il DBMS Postgresql per imparare il linguaggio SQL.
Pag. 1 di 6 6FRSR utilizzare il DBMS Postgresql per imparare il linguaggio SQL. 2ELHWWLYL GD UDJJLXQJHUH SHU JOL VWXGHQWL alla fine dell esercitazione gli studenti dovranno essere in grado di: 1. utilizzare
Progettazione di un Database
Progettazione di un Database Per comprendere il processo di progettazione di un Database deve essere chiaro il modo con cui vengono organizzati e quindi memorizzati i dati in un sistema di gestione di
PowerPoint 2007 Le funzioni
PowerPoint 2007 Le funzioni Introduzione Cos è un ipertesto L' ipertesto è un testo organizzato in link, o collegamenti ad altre parti del testo e/o altri testi, in modo da consentire all utente di scegliere
XSL: extensible Stylesheet Language
XSL: extensible Stylesheet Language XSL è un insieme di tre linguaggi che forniscono gli strumenti per l elaborazione e la presentazione di documenti XML in maniera molto flessibile. I tre linguaggi devono
Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti
Capitolo 3 L applicazione Java Diagrammi ER Dopo le fasi di analisi, progettazione ed implementazione il software è stato compilato ed ora è pronto all uso; in questo capitolo mostreremo passo passo tutta
Reti di Calcolatori. Il Livello delle Applicazioni
Reti di Calcolatori Il Livello delle Applicazioni Il DNS Gli indirizzi IP sono in formato numerico: sono difficili da ricordare; Ricordare delle stringhe di testo è sicuramente molto più semplice; Il Domain
I database relazionali sono il tipo di database attualmente piu diffuso. I motivi di questo successo sono fondamentalmente due:
Il modello relazionale I database relazionali sono il tipo di database attualmente piu diffuso. I motivi di questo successo sono fondamentalmente due: 1. forniscono sistemi semplici ed efficienti per rappresentare
HTML e Linguaggi. Politecnico di Milano Facoltà del Design Bovisa. Prof. Gianpaolo Cugola Dipartimento di Elettronica e Informazione
HTML e Linguaggi Politecnico di Facoltà del Design Bovisa Prof. Gianpaolo Cugola Dipartimento di Elettronica e Informazione [email protected] http://home.dei.polimi.it/cugola Indice Il linguaggio del
L informatica INTRODUZIONE. L informatica. Tassonomia: criteri. È la disciplina scientifica che studia
L informatica È la disciplina scientifica che studia INTRODUZIONE I calcolatori, nati in risposta all esigenza di eseguire meccanicamente operazioni ripetitive Gli algoritmi, nati in risposta all esigenza
LABORATORIO PER IL DESIGN DELLE INTERFACCE PEGORARO ALESSANDRO CASSERO.IT MANUALE DI AGGIORNAMENTO, MANUTENZIONE E USO DEL SITO
CASSERO.IT MANUALE DI AGGIORNAMENTO, MANUTENZIONE E USO DEL SITO 1 Installazione e requisiti per il corretto funzionamento del sito: L istallazione è possibile sui più diffusi sistemi operativi. Il pacchetto
Manuale d uso Software di parcellazione per commercialisti Ver. 1.0.3 [05/01/2015]
Manuale d uso Software di parcellazione per commercialisti Ver. 1.0.3 [05/01/2015] Realizzato e distribuito da LeggeraSoft Sommario Premessa... 2 Fase di Login... 2 Menù principale... 2 Anagrafica clienti...
Registratori di Cassa
modulo Registratori di Cassa Interfacciamento con Registratore di Cassa RCH Nucleo@light GDO BREVE GUIDA ( su logiche di funzionamento e modalità d uso ) www.impresa24.ilsole24ore.com 1 Sommario Introduzione...
Introduzione all Information Retrieval
Introduzione all Information Retrieval Argomenti della lezione Definizione di Information Retrieval. Information Retrieval vs Data Retrieval. Indicizzazione di collezioni e ricerca. Modelli per Information
NAVIGAORA HOTSPOT. Manuale utente per la configurazione
NAVIGAORA HOTSPOT Manuale utente per la configurazione NAVIGAORA Hotspot è l innovativo servizio che offre ai suoi clienti accesso ad Internet gratuito, in modo semplice e veloce, grazie al collegamento
Access. P a r t e p r i m a
Access P a r t e p r i m a 1 Esempio di gestione di database con MS Access 2 Cosa è Access? Access e un DBMS che permette di progettare e utilizzare DB relazionali Un DB Access e basato sui concetti di
Alla scoperta della nuova interfaccia di Office 2010
Alla scoperta della nuova interfaccia di Office 2010 Una delle novità più eclatanti della versione 2007 era la nuova interfaccia con la barra multifunzione. Office 2010 mantiene questa filosofia di interfaccia
LA RICLASSIFICAZIONE DEI SALDI CONTABILI CON MICROSOFT ACCESS 2007
LA RICLASSIFICAZIONE DEI SALDI CONTABILI CON MICROSOFT ACCESS 2007 La fase di riclassificazione del bilancio riveste un ruolo molto importante al fine di comprendere l andamento aziendale; essa consiste,
Per accedere clicca su START o AVVIO (in basso a sinistra sul tuo schermo), poi su PROGRAMMI, ACCESSORI e infine su BLOCCO NOTE.
Cos'è l'html HTML è una sigla che viene da una frase inglese che vuol dire: " Linguaggio di contrassegno di ipertesti" (Hyper Text Markup Language) L'Html non è un vero e proprio linguaggio di programmazione,
MODELLO CLIENT/SERVER. Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena [email protected]
MODELLO CLIENT/SERVER Gianluca Daino Dipartimento di Ingegneria dell Informazione Università degli Studi di Siena [email protected] POSSIBILI STRUTTURE DEL SISTEMA INFORMATIVO La struttura di un sistema informativo
Riepilogo delle modifiche di PA-DSS dalla versione 2.0 alla 3.0
Settore delle carte di pagamento (PCI) Standard di protezione dei dati per le applicazioni di pagamento () Riepilogo delle modifiche di dalla versione 2.0 alla 3.0 Novembre 2013 Introduzione Il presente
XML. Parte VI - Introduzione e nozioni fondamentali di sintassi. XML: Extensible Markup Language:
XML Parte VI - Introduzione e nozioni fondamentali di sintassi XML: cosa è XML: Extensible Markup Language: è un linguaggio che consente la rappresentazione di documenti e dati strutturati su supporto
Ipertesto. Reti e Web. Ipertesto. Ipertesto. Ipertestualità e multimedialità
Ipertesto Reti e Web Ipertestualità e multimedialità Ipertesto: documento elettronico costituito da diverse parti: nodi parti collegate tra loro: collegamenti Navigazione: percorso tra diversi blocchi
