La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

eXtensible Markup Language

Presentazioni simili


Presentazione sul tema: "eXtensible Markup Language"— Transcript della presentazione:

1 eXtensible Markup Language
XML eXtensible Markup Language

2 ESERCIZI Correggere un testo in base all’originale
Scrivere un ordine di acquisto e la relativa risposta Scrivere una agenda di indirizzi Analisi grammaticale/logica di una frase XML - Guido Boella

3 XML Linguaggi di markup servono alla rappresentazione di informazione strutturata XML permette la definizione di tali linguaggi (come l’alfabeto permette di scrivere in lingue diverse) Un documento strutturato contiene del contenuto (testo, numeri, ma anche immagini) e le indicazioni sul ruolo giocato dal contenuto La strutturazione in ruoli non riguarda solo la forma (e.g., titolo, nota) ma anche la funzione del contenuto (e.g., le colonne di una tabella relazionale) XML - Guido Boella

4 Markup (marca, etichetta)
Markup: tutto ciò che ha un significato speciale che deve essere ben caratterizzato, reso esplicito Esempi di markup: testo in corsivo, testo sottolineato anche identificatore, simbolo o altro espediente per distinguere un elemento da altri simili, può indicare l’inizio o la fine di un oggetto Ma html riguarda solo la visualizzazione su web XML - Guido Boella

5 Markup (marca, etichetta)
Tutto ciò che è compreso tra i caratteri “<” e “>” (angled brackets, parentesi angolari) è considerato markup, viene detto anche tag (etichetta), esempio: <nome> Anche HTML è un markup language inizialmente definito in SGML. XML - Guido Boella

6 Markup L’ introduzione di elementi esterni (markup) al
contenuto di un documento permette di: •Separare gli elementi logici del documento •Specificare le elaborazioni a cui devono essere sottoposti questi elementi XML - Guido Boella

7 Informazione (non) strutturata
La mia agenda elettronica (!): un file di solo testo (agenda.txt) con i nomi: Boella Guido Svizzera John Doe Dawson street Parco Realtà Virtuale. Cso Lombardia XX Torino Italia ... XML - Guido Boella

8 Interpretazione di un file di testo
Il nostro algoritmo per trovare il numero di telefono: Se un documento contiene un nome allora il numero seguente è quello di telefono ... E se sono disordinato, se manca il numero di telefono? Se ho più di un numero? XML - Guido Boella

9 In un database XML - Guido Boella nome cognome via telefono Guido
svizzera 185 John Doe Dawson XML - Guido Boella

10 Con questo formato… XML - Guido Boella

11 In HTML... <head><title>agenda</title></head> <body bgcolor="white"> <table border="1"> <tr><th>nome</th><th>cognome</th><th>via</th> <th>telefono</th><th>cellulare</th></tr> <tr><td>Guido</td><td>Boella</td><td>svizzera 185</td> <td> </td><td> </td></tr> <tr><td>John</td><td>Doe</td><td>Dawson</td> <td> </td><td></td></tr> </table> </body> </html> VEDI XML - Guido Boella

12 Interpretazione di HTML
Il nostro algoritmo per trovare il numero di telefono: Se un documento contiene una tabella allora la prima parola dopo la prima riga dopo il quarto tag <td> è il numero di telefono. Qualche miglioramento: non posso mettere un numero di telefono nella colonna sbagliata Ma se la tabella è diversa? se aggiungo una colonna prima di quella in questione? se ci sono più numeri di telefono? XML - Guido Boella

13 Perchè un nuovo linguaggio ?
Cosa è questo? <td> </td> Il numero di telefono ? Il numero civico di una via ? Entrambe le cose ? Nessuna delle due ? • Nessuna delle due ? XML - Guido Boella

14 HTML è sempre lo stesso Posso cambiare lo stile di visualizzazione con CSS normale a colori più grosso ma la struttura resta la stessa: non posso riordinare i dati togliere delle colonne aggiungere delle altre informazioni selezionare solo alcuni dati trasformare in formato diverso (testo, wml, xls, pdf, ps, ecc.) XML - Guido Boella

15 Modifiche a tabella XML - Guido Boella nome cognome via telefono
cellulare John Doe Dawson Guido Boella svizzera 185 nome cognome via telefono Guido Boella svizzera 185 John Doe Dawson nome cognome via telefono Guido Boella svizzera 185 John Doe Dawson nome cognome via telefono cellulare John Doe Dawson XML - Guido Boella

16 Formati diversi John Doe Dawson Guido Boella svizzera 185 nome cognome via telefono cellulare John Doe Dawson Guido Boella svizzera pard \ql \li0\ri0\widctlpar\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\lang1040\langfe1033\langnp1040 Guido\tab Boella\tab }{\lang1040\langfe1033\langnp1040 XML - Guido Boella

17 Da xml a ... XML - Guido Boella

18 Trasformazione XML - Guido Boella

19 I problemi degli informatici
Problema attuale: scambio di documenti Formati proprietari difficilmente scambiabili XML studiato per facilitare scambi di dati anche tra applicazioni di tipo diverso (es.: i database e i word processor). Documento facilmente interpretabile tre parti fondamentali da tenere distinte: ·il contenuto; ·le specifiche relative agli elementi, la struttura (DTD); ·le specifiche relative alla rappresentazione, lo stile (Stylesheet). XML - Guido Boella

20 Interscambio XML - Guido Boella

21 Database eterogenei Un esempio di questa categoria di applicazioni Web è il sistema informativo di un’agenzia americana di "home health care". Questo tipo di agenzie sono il maggior componente dell’industria medica americana e la loro importanza sta aumentando da quando politiche governative hanno spostato l’assistenza medica ospedaliera verso l’assistenza medica domestica. Come si può ben capire la gestione dell’informazione è critica per questa industria; la salute di un paziente è rappresentata nel sistema informativo attraverso una collezione di documenti storici che rappresentano la vita medica di una persona, passata attraverso vari dottori, ospedali, farmacie e compagnie di assicurazioni; quando un nuovo paziente entra in una agenzia, c’è l’enorme compito di prelevare tutto il materiale e di memorizzarlo nel database dell’agenzia. XML - Guido Boella

22 Raggiungere il sito Web dell’ospedale Diventare un utente autorizzato
L’avvento del Web diede alla comunità informatica medica la speranza di poter semplificare lo sforzo di memorizzazione delle informazioni nel database; sfortunatamente le applicazioni Web esistenti offrono modelli di soluzione a questo problema inadeguati. Gli ospedali offrono alle agenzie una soluzione che in poche parole è così riassunta: Raggiungere il sito Web dell’ospedale Diventare un utente autorizzato Accedere alla documentazione medica del paziente attraverso il browser Stampare la documentazione Inserire manualmente i dati nel database (dalla stampa) Attualmente questa soluzione è proposta da un gran numero di ospedali americani. Una versione leggermente più sofisticata permette all’operatore di inserire manualmente i dati letti dal browser direttamente in un form dell’agenzia (in una finestra separata), evitando così la stampa del documento. Anche questa però non è una grande soluzione. XML - Guido Boella

23 La soluzione ideale sarebbe la seguente:
Raggiungere il sito Web dell’ospedale Diventare un utente autorizzato Accedere alla documentazione medica del paziente attraverso una interfaccia Web che rappresenti la documentazione con una icona a cartella Fare un drag della cartella dall’applicazione Web nel database interno Fare un drop della cartella nel database Attualmente questa soluzione non è possibile poiché ci si scontra con i limiti dell’HTML; le ragioni sono due: L’HTML non permette di rappresentare strutture dati L’HTML non permette il controllo dei dati per validare i documenti ricevuti Una soluzione tecnica per implementare questo scambio di documenti è quella di richiedere agli ospedali e alle agenzie di utilizzare un sistema informativo standard dettato dal governo (tale soluzione è attualmente allo studio); XML - Guido Boella

24 questo tipo di soluzione è però difficile da mettere in pratica, soprattutto in un ambiente dove ospedali e agenzie stanno attraversando un momento di difficoltà finanziaria (cambiare il sistema informativo comporta generalmente grosse spese). Un’altra soluzione è quella di adottare un formato standard di scambio dell’informazione; un grande numero di industrie nel campo spaziale, telecomunicazioni, hardware, software, ha utilizzato per anni un linguaggio standard per lo scambio dei dati e il processo è attualmente molto ben compreso. Tipicamente un consorzio di grandi industrie definisce un Document Type Definition (in ambiente SGML) per implementare un linguaggio di markup specifico per un determinato scopo; quindi il linguaggio è utilizzato come standard per lo scambio dei dati in determinati ambienti. XML - Guido Boella

25 La soluzione XML è indipendente dai sistemi, dalle organizzazioni e proviene dalla decennale esperienza dell’SGML; l’XML permette di utilizzare l’approccio SGML per lo scambio dei dati nel Web; è significativo come il giorno del rilascio della prima versione stabile dell’XML, l’organizzazione che raggruppa le maggiori agenzie di home health care, abbia annunciato lo sviluppo dell’Health Care Markup Language in ambiente SGML, che dovrebbe risolvere i tipi di problemi descritti in questo esempio. Si è anche dimostrato che rappresentare i dati con un ricco markup ha dei benefici che vanno oltre lo scambio dei dati; ad esempio è molto utile rappresentare risultati di un esame clinico con tag quali <allergia> oppure <reazione>; infatti chi legge il documento è subito allertato (da una applicazione apposita) del fatto che un paziente può essere allergico alla penicillina. XML - Guido Boella

26 Processi distribuiti Un esempio di questa seconda categoria di applicazioni XML è il sistema di distribuzione dei dati adottato dall’industria dei semiconduttori. Ogni grande industria nel campo dei semiconduttori deve mantenere enormi quantità di dati tecnici sui circuiti integrati prodotti. Per abilitare lo scambio di questi dati, anni fa fu formato un consorzio (il Pinnacles Group) di industrie quali Intel, National Semiconductor, Philips, Texas Instrument e Hitachi; lo scopo era quello di sviluppare uno specifico linguaggio di markup in ambiente SGML; nel 1995 è stata presentata la prima versione stabile e attualmente le grandi compagnie sono impegnate nel processo d’implementazione di questo linguaggio. Si potrebbe pensare che l’incremento della popolarità dell’HTML avesse fatto cambiare idea ai membri del Pinnacles Group, ma le limitazioni di tale linguaggio li hanno convinti che l’idea originale fosse più che corretta. XML - Guido Boella

27 L’idea era che utilizzare il linguaggio di markup come veicolo per la distribuzione dei dati sui circuiti integrati potesse permettere non solo la loro visualizzazione, ma anche il progetto dei circuiti stessi. Questo approccio si integra molto bene con la tecnologia dei Java applet perché permette ad un ingegnere di accedere al sito Web di una industria di semiconduttori e di scaricarsi non solo i dati di un particolare circuito integrato, ma anche un Java applet che permetta di combinare i dati in vari modi. Questo esempio dei semiconduttori è una buona dimostrazione dei vantaggi dell’XML perché: Richiede uno specifico tag set che non può essere ottenuto con il non estensibile tag set dell’HTML. Richiede che la rappresentazione dei dati sia indipendente dai sistemi utilizzati nelle varie industrie. XML - Guido Boella

28 Creare il disegno dei circuiti dai dati è un processo computazionalmente molto intensivo; quindi in un ambiente Web client-server è necessario distribuire il processo computazionale per ridurre al minimo l’interazione fra il client e il server e lasciare la parte più intensiva del processo sul client; questo aspetto può essere riassunto nel seguente slogan: "XML fa lavorare Java". Bisogna notare che la validazione dei dati in questi processi non è sempre necessaria; infatti la validazione dei dati è cruciale quando questi devono essere memorizzati in un database, ma non sempre questo è richiesto; per rendere questi processi il più efficienti possibile, XML permette che la validazione sia un optional in applicazioni dove non è necessaria. L’esempio dei semiconduttori mostra come si integrano bene l’XML e Java in applicazioni in cui i dati devono essere manipolati in modo interessante sul client. XML - Guido Boella

29 Motori di ricerca XML permette di aggiungere informazioni semantiche al testo: <Autore>Giancarlo Parma</Autore> questo permette di semplificare la creazione di applicazioni che svolgono operazioni intelligenti con i documenti elettronici; un motore di ricerca sarebbe in grado di eseguire ricerche esplicite nel Web per trovare tutti i documenti in cui Giancarlo Parma è l’autore; in questo modo si può superare uno dei limiti dell’HTML, in cui i dati sono orientati al video e difficili da utilizzare per una elaborazione successiva; a questo riguardo, il commercio on-line è in pieno sviluppo e sempre più commercianti in tutto il mondo si stanno affacciando nel Web; però un’indagine su un campione di acquirenti abituali via Internet, ha evidenziato una certa frustrazione da parte dei consumatori per la difficoltà di trovare i prodotti di cui hanno bisogno; il problema risiede nel sistema di indicizzazione delle merci, non sempre intuitivo e semplice come l’utente vorrebbe. XML - Guido Boella

30 La chiave per risolvere questo tipo di problemi sta in questo slogan: "L’informazione ha bisogno di conoscere se stessa, ma ha anche bisogno di conoscere me"; supponiamo di dover implementare una guida TV personalizzata per un sistema via cavo di 500 canali; la guida TV personalizzata deve conoscere sia le preferenze e le caratteristiche dell’utente (livello di educazione, interessi, professione, età, etc.), sia le caratteristiche dei programmi trasmessi; queste informazioni devono essere fornite in modo tale da permettere al motore di ricerca implementato nella guida, di fare una selezione intelligente dei programmi più interessanti per l’utente; si ha quindi bisogno di un sistema standard che utilizzi uno specifico set di tag con cui poter esprimere le caratteristiche di un particolare programma (argomento, tipo di utenza a cui è rivolto, attori, lunghezza, data in cui è stato girato, lingua, etc.). Questo è un semplice esempio che può naturalmente essere esteso ad un qualsiasi ambiente in cui l’informazione debba essere ritagliati sui gusti degli utenti; l’XML è un’ottima soluzione anche per questo tipo di problemi e permetterà ad applicazioni Web di competere realmente con la grande distribuzione dislocata sul territorio. XML - Guido Boella

31 Come fare? Sarebbe meglio che accanto a Guido ci fosse scritto che è un nome, che accanto a Boella ci fosse scritto COGNOME Che si sapesse dove comincia il NOME e dove finisce Sarebbe meglio che ci sapesse che una agenda è fatta da un elenco di contatti Che i CONTATTI sono fatti da NOME e COGNOME, ma che il telefono puo’ non esserci, cosi’ come possono essercene piu’. XML - Guido Boella

32 Ecco a voi…

33 In XML... <agenda data="01/02/00">
<contatto> <nome>Guido</nome> <cognome>Boella</cognome> <via>Svizzera</via><numero>185</numero> <tel> </tel> <cellulare> </cellulare> </contatto> <contatto> <nome>John</nome> <cognome>Doe</cognome> <via>Dawson</via> <tel> </tel> </agenda> XML - Guido Boella

34 In technicolor... <agenda data="01/02/00">
<contatto> <nome>Guido</nome> <cognome>Boella</cognome> <via>Svizzera</via><numero>185</numero> <tel> </tel> <cellulare> </cellulare> </contatto> <contatto> <nome>John</nome> <cognome>Doe</cognome> <via>Dawson</via> <tel> </tel> </agenda> XML - Guido Boella

35 Come in HTML <agenda data="01/02/00">
<contatto> <nome>Guido</nome> <cognome>Boella</cognome> <via>Svizzera</via><numero>185</numero> <tel> </tel> <cellulare> </cellulare> </contatto> <contatto> <nome>John</nome> <cognome>Doe</cognome> <via>Dawson</via> <tel> </tel> </agenda> XML - Guido Boella

36 XML vs HTML HTML ha un numero di tag predefinito cosi' come il loro significato Markup di formattazione e strutturazione e' mescolato (e.g. <H1>, titolo e grassetto, <TH> intestazione tabella, e…) XML non specifica né formattazione né il significato dei tag ma solo quali tag sono usati in un tipo di documento e la relazione fra di loro HTML ha una sintassi troppo elastica XML - Guido Boella

37 Interpretazione di XML
Il nostro algoritmo per trovare il numero di telefono: cerca il testo che si trova all’interno di un tag telefono Si’ ma quale fra i tanti? Il numero di telefono che si trova all’interno dello stesso tag contatto che contiene il tag nome della persona cercata XML - Guido Boella

38 XML vs SGML Standard Generalised Markup Language (ISO 8879) creato all'IBM negli anni '80 Stesso scopo: strutturazione documenti e interoperabilità DB SGML è troppo complesso per l'utilizzo su web (sintassi non definita da grammatica regolare) XML è una restrizione di SGML XML - Guido Boella

39 Scopo Definire un mezzo per la strutturazione di documenti e dati:
leggibile dagli esseri umani flessibile alle diverse esigenze standard (e non proprietario) Base per la trasformazione in formati diversi, ad esempio in HTML o in tabelle di DB relazionali XML - Guido Boella

40 Estensibilità • XML non ha tag predefiniti, è estensibile, consente di definire nuovi linguaggi, è un metalinguaggio Metalinguaggio: nella logica formale, linguaggio impiegato nello studio di un linguaggio oggetto. Può essere o non essere formalizzato e a sua volta può essere oggetto di indagine che si attua mediante un metametalinguaggio. Detto anche linguaggio di descrizione del linguaggio • L’insieme delle regole di HTML sono contenute in un documento (separato dal file .html) il DTD HTML (Document Type Definition) incorporato nel browser, è invisibile all’utente. XML - Guido Boella

41 Ricapitolando: limiti di HTML
· non ci dice nulla sul contenuto del documento · non permette di estendere il linguaggio con tag personali · limitato come prodotto di pubblicazione · limitato come ipertesto · limitato come elaborazione · non supporta dati strutturati -> inefficiente per i motori di ricerca Serve un linguaggio semplice, flessibile HTML non verrà comunque sostituito, almeno nel più immediato futuro, perché offre il metodo più semplice per pubblicare informazioni sul Web XML - Guido Boella

42 XML XML (Extensible Markup Language [sic!]) è un meta-linguaggio di markup, progettato per lo scambio e la interusabilità di documenti strutturati su Internet. XML prevede una sintassi semplificata rispetto a SGML, e definisce contemporaneamente una serie piuttosto lunga di linguaggi associati: uno per i link, uno per i nomi di tag, uno per i fogli di stile, uno per la descrizione di meta-informazioni, ecc. XML si propone di integrare, arricchire e, nel lungo periodo, sostituire HTML come linguaggio di markup standard per il World Wide Web. XML - Guido Boella

43 Metalinguaggio mia agenda XML - Guido Boella

44 Perché XML? HTML nacque come un DTD di SGML (non proprio!!!), che permetteva di mettere in rete documenti di un tipo molto specifico, semplici documenti di testo con qualche immagine e dei link ipertestuali. Con il successo del WWW, HTML venne iniziato ad usare per molti scopi, molti più di quelli per cui era stato progettato. Si iniziò ad abusare dei tag di HTML per gli effetti grafici che forniva, più che per gli aspetti strutturali o semantici. Si iniziarono a desiderare elaborazioni sofisticate sui dati HTML, elaborazioni che non era possibile fornire. Si iniziò a trovare limitata la capacità grafica di HTML, anche abusando dei tag. XML - Guido Boella

45 Perché non SGML? SGML ha molti pregi, ma ha dalla sua una complessità d’uso e di comprensione notevole. Inoltre, a SGML mancano caratteristiche di notevole importanza per l’uso pratico, come link ipertestuali e specifiche grafiche. L’avvento di HTML ha fatto capire come i linguaggi di markup siano ormai maturi per essere compresi dal largo pubblico, ma che la semplicità d’uso di HTML doveva costituire un elemento di partenza. XML contiene tutte le caratteristiche di SGML che servono per creare applicazioni generali senza scendere nel livello di dettaglio e pedanteria richiesti da SGML. XML - Guido Boella

46 XML non fa nulla! Nessuna elaborazione
• Il linguaggio XML non produce nessun effetto: non comprende le istruzioni di elaborazioni (neanche quelle di visualizzazioni) • Necessita sempre di qualche applicazione che decide cosa fare per ogni tag. XML - Guido Boella

47 I vantaggi di XML (1) Documenti auto-descrittivi
La scelta dei nomi degli elementi può essere fatta per facilitare la comprensione del ruolo strutturale dell’elemento. Inoltre, l’uso di un DTD può esplicitare le regole di composizione ed i rapporti possibili tra le varie parti dei documenti. Struttura navigabile dei documenti La rigida struttura ad albero e l’assenza di regole di minimizzazione rendono semplice la visualizzazione e l’analisi della struttura del documento, e la possibilità di visualizzare il documento è indipendente dal foglio di stile che vi si applica. XML - Guido Boella

48 I vantaggi di XML (2) Platform-independence
XML è uno standard aperto, e chiunque può realizzare strumenti che lo usino come formato di dati. Facile convertibilità a formati Web La totale interdipendenza tra XML, SGML, HTML etc. fa sì che la conversione tra formati interni e formati per il Web sia facile. XML - Guido Boella

49 Cosa si fa con XML? (Bradley)
Data Interchange Ogni volta che più programmi si debbono scambiare dati, ci sono problemi di compatibilità. Ogni programma ha le proprie assunzioni in termini di caratteri, separatori, ripetibilità di elementi, differenza tra elementi vuoti e assenti, ecc. XML si propone come la sintassi intermedia più semplice per esprimere dati anche complessi in forma indipendente dall’applicazione che li ha creati. Document publishing XML è ideale come linguaggio per esprimere documenti strutturati o semi strutturati, e per esprimerli in maniera indipendente dalla loro destinazione finale. Lo stesso documento XML può essere preso e trasformato per la stampa, il Web, il telefonino, l’autoradio. XML - Guido Boella

50 Cosa si fa con XML? Bosak (1)
Applicazioni che richiedono che il client Web si ponga a mediare tra due o più database eterogenei Applicazioni che distribuiscono una parte significativa del carico computazionale dal server al client Applicazioni che richiedono che il client Web presenti view diverse degli stessi dati agli utenti Applicazioni in cui agenti Web intelligenti adattano la scoperta di informazioni alle esigenze degli specifici utenti. Da J. Bosak, XML, Java, and the future of the Web, XML - Guido Boella

51 Cosa si fa con XML? Bosak (2)
Accesso a database eterogenei Ogni volta che è necessario trasferire dei dati da un database all’altro, la soluzione più economica a tutt’oggi è stampare i dati dal primo DB su carta e ribatterli a mano sul secondo. Idealmente io vorrei accedere via Web ai dati del primo DB, selezionare quelli che voglio in una cartella, e sbattere la cartella sul secondo DB, che si preoccupa di adattarli alle sue esigenze. Il secondo DB, dunque, deve essere in grado di comprendere la sintassi dei dati, di interpretare la struttura (eventualmente, in parte, aiutato da un essere umano) e di isolare le informazioni di suo interesse. Per questo potrebbe essere aiutato da un formato di interscambio tipo XML, che permetterebbe di etichettare i dati esplicitamente ed in maniera generale e comprensibile agli esseri umani. XML - Guido Boella

52 Cosa si fa con XML? Bosak (3)
Computazioni client-side Esistono molte esigenze di testing e computazione su oggetti descrivibili parametricamente: Caratteristiche e funzionalità di chip, semilavorati, e prodotti industriali Scheduling in aerei, treni, ecc. Shopping on-demand, e user-tailoring Applicazioni per il customer suppot In tutti questi casi, attualmente si creano applicazioni server-side che interrogano i database per i parametri e usano cicli del server per le computazioni, mentre i client sono in attesa. Poter esprimere in Java o altri linguaggi client-side la logica della computazione, che scarica i parametri dal sito giusto ed esegue le computazioni indipendentemente, sarebbe molto comodo, e permetterebbe confronti incrociati e ogni altro tipo di valutazione ottimale per le esigenze di chi compra. XML - Guido Boella

53 Cosa si fa con XML? Bosak (4)
Viste selettive L’esempio tipico è l’indice sommario dinamico di un documento: interrogo una base documentaria e ottengo il primo livello di indice di un documento. Seleziono una voce e ri-interrogo la base dati per avere il secondo livello dell’indice. Ogni espansione richiede un passaggio al server, con ovvi problemi di latenza. Sarebbe possibile fare tutto client-side con Javascript, ma o si fa l’indice a mano del documento HTML, oppure bisogna ricorrere a documenti ben strutturati, come XML. Altri esempi: Un grafico che si trasforma in una tabella Un documento annotato in cui vedo il contenuto, o le annotazioni, o tutti e due Un manuale di due versioni dello stesso sistema, con testi e immagini che cambiano a seconda di quale specifica versione si sta esaminando. XML - Guido Boella

54 Cosa si fa con XML? Bosak (5)
Agenti Web Mattew Fuchs (Disney Imagineering): “Data needs to know about itself, and data needs to know about me” Agenti di filtro, selezione, rilevamento hanno bisogno di sapere le caratteristiche dei dati che stanno filtrando in maniera vendor-independent, ben strutturata e flessibile (nuove esigenze, categorie, comunità virtuali, sub-società si formano continuamente) Ad esempio, bot personalizzati, la guida dei canali TV, i sistemi di classificazione del contenuto delle pagine Web, ecc. Su questo specifico tema esistono argomenti di tesi di laurea. XML - Guido Boella

55 Un esempio: XMLNews (1) XMLNews definisce il contenuto testuale e le meta-informazioni di notizie da agenzia stampa. E’ una parte dello standard denominato News Industry Text Format (NITF), sviluppato dal International Press Telecommunications Council e dalla Newspaper Association of America. XMLNews è composto di due parti: XMLNews-Story è un DTD XML per descrivere in maniera variamente arricchita il testo delle notizie XMLNews-Meta definisce il formato delle meta-informazioni per notizie d’agenzia. E’ conforme al Resource Description Framework (RDF), e on si riferisce solo alle notizie testuali, ma anche a immagini, video-clip, ecc. XML - Guido Boella

56 Un esempio: XMLNews (2) XMLNews-Story: il testo di una notizia di agenzia è diviso in tre parti: l’head contiene informazioni di organizzazione, mentre il body è a sua volta diviso in intestazione e contenuto. <?xml version="1.0"?> <nitf> <head> <title>Colombia Earthquake</title> </head> <body> <body.head> <hedline><hl1>143 Dead in Earthquake</hl1></hedline> <byline><bytag>By Jared Kotler, AP </bytag></byline> <dateline> <location>Bogota, Colombia</location> <story.date>January :28 ET</story.date> </dateline> </body.head> <body.content> … </body.content> </body> </nitf> XML - Guido Boella

57 Un esempio: XMLNews (3) XMLNews-Story: Il body ha un markup minimale di struttura del testo: <?xml version="1.0"?> <nitf> <head> … </head> <body> <body.head> … </body.head> <body.content> <p>An earthquake struck western Colombia on Monday, killing at least 143 people and injuring more than as it toppled buildings across the country's coffee-growing heartland, civil defense officials said </p> <p>The early afternoon quake had a preliminary magnitude of 6, according to the U.S. Geological Survey in Golden, Colo. Its epicenter was located in western Valle del Cauca state, 140 miles west of the capital, Bogota. </p> </body.content> </body> </nitf> XML - Guido Boella

58 Un esempio: XMLNews (4) XMLNews-Story: Però è possibile in qualunque momento aggiungere informazioni inline: <p>An <event>earthquake</event> struck <location>western <country>Colombia</country></location> on <chron norm=" ">Monday</chron>, killing at least 143 people and injuring more than 900 as it toppled buildings across the country's coffee-growing heartland, <function>civil defense officials</function> said.</p> Questo permette di arricchire la storia con molte informazioni e in maniera semi-automatica: Nella ricerca: è possibile cercare tutto quello che è successo in Colombia, o cosa è successo in una certa data. Nella presentazione: un provider potrebbe fornire semi-automaticamente dei link o delle cartine della Colombia. Nell’organizzazione delle news: è possibile cercare tutti i terremoti effettivi, e non le notizie che ne usano la parola, magari figurativamente. XML - Guido Boella

59 Un esempio: XMLNews (5) XMLNews-Meta: Assieme ad ogni notizia, vengono scritte delle informazioni sulla notizia, che possono avere una distribuzione separata. XMLNews-Meta permette di gestire insieme informazioni come: Informazioni sul contenuto della notizia (titolo, lingua, formato, ecc.) Informazioni sulle date della notizia: creazione, pubblicazione, scadenza, ecc. Informazioni sulla provenienza ed attendibilità della notizia Informazioni sui possessori dei diritti di distribuzione e copyright Informazioni di classificazione ed organizzazione Link a documenti connessi: versioni precedenti, seguenti, ed altre notizie connesse. XML - Guido Boella

60 Cosa c’è con XML? XML è in realtà una famiglia di linguaggi, alcuni già definiti, altri in corso di completamento. Alcuni hanno l’ambizione di standard, altri sono solo proposte di privati o industrie interessate. Alcuni hanno scopi generali, altri sono applicazioni specifiche per ambiti più ristretti. Noi di occupiamo, tra gli altri, di: XML 1.0: un meta-linguaggio di markup, sottoinsieme di SGML XML-Namespace: un meccanismo per la convivenza di nomi di tag appartenenti a DTD diversi XPath: per focalizzare un punto del documento XPointer e XLink: tre linguaggi per la creazione di link ipertestuali XSL: extensible stylesheet language (trasformazione di XML per formattazione) XSLT: extensible stylesheet language transformation (trasformo da XML a XML) XML schema: un linguaggio per la specifica di criteri di validazione di documenti XML RDF: un linguaggio per l’espressione di metainformazioni su documenti XML. XHTML: HTML con sintassi XML XQuery: per cercare nel documento come in un database XML - Guido Boella

61 XML 1.0 Prima bozza: 1996 Una raccomandazione W3C del 10 febbraio 1998. È definita come un sottoinsieme di SGML URL ufficiale: Traduzione ufficiale in italiano: Molto più formalizzata della grammatica di SGML, usa una notazione formale, Extended Backus-Naur Form. XML - Guido Boella

62 Criteri di progettazione di XML (1)
Nel documento ufficiale di XML si elencano i seguenti obiettivi progettuali di XML: 1. XML deve essere utilizzabile in modo diretto su Internet. Non significa che deve essere possibile usarlo sul browser del giorno. Significa che si dovevano tenere in conto le esigenze di applicazioni distribuite su reti a larga scala. 2. XML deve supportare un gran numero di applicazioni. Cioè XML non si limita al supporto di documenti in rete, ma a una larga classe di applicazioni che non c’entrano con la rete. Specificamente: deve essere possibile creare applicazioni come tool di authoring, filtri, formattatori, e traduttori. XML - Guido Boella

63 Criteri di progettazione di XML (2)
3. XML deve essere compatibile con SGML Tool SGML esistente debbono essere in grado di leggere e scrivere documenti XML Istanze XML debbono essere istanze SGML così come sono, senza traduzioni, per quanto semplici. Dato un documento XML, deve essere possibile generare un DTD SGML tale per cui un tool SGML esegue lo stesso parsing di un tool XML. XML deve avere essenzialmente lo stesso potere espressivo di SGML. Questi goal sono stati sostanzialmente raggiunti. XML - Guido Boella

64 Criteri di progettazione di XML (3)
4. Deve essere facile lo sviluppo di programmi che elaborino documenti XML Deve essere possibile creare applicazioni XML utili che non dipendano dal leggere ed interpretare il DTD Obiettivo dichiarato: un diplomato in informatica deve essere in grado di scrivere un processore minimale XML in meno di una settimana. 5. Il numero di caratteristiche opzionali deve essere mantenuto al minimo possibile, idealmente a zero. SGML, per generalità, aveva adottato un numero molto alto di caratteristiche opzionali, di dubbia utilità, o molto specifiche Risultato: ogni processore SGML implementava solo una parte delle caratteristiche opzionali, e quindi documenti SGML conformi che potevano essere letti da un processore SGML non venivano letti da un altro, e viceversa. XML - Guido Boella

65 Criteri di progettazione di XML (4)
6. I documenti XML dovrebbero essere leggibili da umani e ragionevolmente chiari. Formati testuali sono più aperti, più utili, più gradevoli da lavorarci che formati binari. Inoltre, per quanti capricci possa fare il tuo editor specializzato XML, puoi sempre aprire il documento con un editor di testi e rimettere a posto le cose. 7. La specifica del linguaggio XML deve avvenire rapidamente. La paura era che le esigenze di estensibilità del Web potessero essere soddisfatte da una qualche combinazione di complicati formati binari e di accrocchi proprietari. Es: DHTML! XML - Guido Boella

66 Criteri di progettazione di XML (5)
8. La progettazione XML deve essere formale e concisa. La specifica di SGML è composta di un documento di oltre 300 pagine in testo, ottuso e burocratico. Il manuale SGML ne richiede più di 600, e comunque non è leggibile. Inoltre non è neanche immediatamente utilizzabile da un programmatore per realizzare tool. La scelta di formalismi nitidi e pochi commenti ha permesso la creazione di una specifica notevolmente più corta e immediatamente utilizzabile dai realizzatori di tool. 9. I documenti XML devono essere facili da creare. In particolare, deve essere facile creare tool di authoring di documenti XML. XML - Guido Boella

67 Criteri di progettazione di XML (6)
10. Non ha importanza l'economicità del markup XML. Le esigenze di economicità di markup (terseness) di SGML avevano portato all’adozione di molte pratiche di minimizzazione dei caratteri, che però rendevano i documenti poco leggibili e molto più complicati da parsare. XML non ha meccanismi di minimizzazione, e dove si poteva scegliere tra economicità e chiarezza, si è scelta la chiarezza. Esistono poi due obiettivi progettuali non riportati: A. Supporto per l’internazionalizzazione XML deve funzionare con tutti i set di caratteri. B. Desperate Perl hacker Il programmatore a cui viene imposto di eseguire un compito di modifica globale su una grande quantità di documenti e che riesce a farla applicando un qualche script semplice sulla struttura pulita dei documenti XML. XML - Guido Boella

68 Introduzione Qui esaminiamo in breve tutti gli aspetti di XML che non sono derivati da SGML: Differenze sintattiche Differenze architettoniche Usi innovativi e visioni del futuro di XML XML - Guido Boella

69 XML e Unicode XML (come Java) abbandona completamente ASCII e le codifiche ad un byte, e si basa direttamente su Unicode. Questo porta a due vantaggi nei riguardi dell’internazionalizzazione: È possibile scrivere documenti misti, senza ricorrere a trucchi strani per identificare la parte che usa un alfabeto dalla pare che ne adopera un altro. Un documento scritto in un linguaggio non latino non deve basarsi su parametri esterni per essere riconosciuto come tale, ma la codifica stessa dei caratteri lo identifica. XML - Guido Boella

70 Documenti ben formati o validi
XML distingue due tipi di documenti rilevanti per le applicazioni XML: i documenti ben formati ed i documenti validi. In SGML, un DTD è necessario per la validazione del documento. Anche in XML, un documento è valido se presenta un DTD ed è possibile validarlo usando il DTD. Tuttavia XML permette anche documenti ben formati, ovvero documenti che, pur essendo privi di DTD, presentano una struttura sufficientemente regolare e comprensibile da poter essere controllata. XML - Guido Boella

71 Documenti XML ben formati
Un documento XML si dice ben formato se: Tutti i tag di apertura e chiusura corrispondono e sono ben annidati Esiste un elemento radice che contiene tutti gli altri I tag vuoti (senza contenuto) utilizzano un simbolo speciale di fine tag: <vuoto/> Tutti gli attributi sono sempre racchiusi tra virgolette Tutte le entità sono definite. XML - Guido Boella

72 Parser validanti e non validanti
Il cuore di un applicazione XML è il parser, ovvero quel modulo che legge il documento XML e ne crea una rappresentazione interna utile per successive elaborazioni (come la visualizzazione). Un parser validante, in presenza di un DTD, è in grado di verificare la validità del documento, o di segnalare gli errori di markup presenti. Un parser non validante invece, anche in presenza di un DTD è solo in grado di verificare la buona forma del documento. Un parser non validante è molto più semplice e veloce da scrivere, ma è in grado di fare meno controlli. In alcune applicazioni, però, non è necessario validare i documenti, solo verificare la loro buona forma. XML - Guido Boella

73 Le novità sintattiche di XML
La dichiarazione XML Sezioni CDATA Sintassi di <!ELEMENT>, degli elementi vuoti, delle processing instructions Rigore sintattico (case sensitivity, nessuna minimizzazione) Entità predefinite Gestione del white space Attributi riservati XML - Guido Boella

74 Dichiarazione XML (1) <?XML version=“1.0” encoding=“UTF-16” standalone=“yes” ?> Un documento XML può includere una dichiarazione XML. Questa specifica le caratteristiche opzionali del documento in questione. Poiché esse sono ridotte al minimo, la dichiarazione XML è brevissima. La sintassi usata per la dichiarazione XML è quella delle Processing Instructions, La non obbligatorietà della dichiarazione XML è dovuta a motivi di convenienza, per poter usare la grande quantità di documenti HTML e SGML che sono ben formati senza richiedere modifiche anche stupide. In assenza di dichiarazione XML, si assume la forma: <?XML version=“1.0” ?> XML - Guido Boella

75 Dichiarazione XML (2) Esistono esattamente tre valori che possono essere messi in una dichiarazione XML: Il parametro “version” identifica quale versione di XML si sta usando. Per il momento, l’unico valore possibile è “1.0”. Necessario. Il parametro “encoding” permette di specificare, se il dubbio può sorgere, quale codifica di caratteri viene usata per il documento. Facoltativo. Il parametro “standalone” permette di specificare se le informazioni necessarie per valutare e validare il documento sono interne o se ne esistono anche di esterne. Facoltativo. XML - Guido Boella

76 Sezioni CDATA A volte può essere comodo inserire un blocco di caratteri comprendenti anche ‘&’ e ‘<‘, senza preoccuparsi di nasconderli dentro ad entità. Si usa allora la sezione CDATA, che ha la seguente sintassi: <![CDATA[ dati liberi comprendenti & e < ]]> L’unica sequenza di caratteri non accettabile è la sequenza ‘]]>’, che definisce la fine della sezione CDATA Il parser XML passa all’applicazione finale tutti i caratteri che trova fino alla sequenza ]]> <para>In HTML, “<![CDATA[ <h1>Questo è un titolo</h1>]]>” indica un titolo </para> XML - Guido Boella

77 Altre differenze tra SGML e XML (1)
Elementi vuoti: un elemento con content model EMPTY ha il carattere di chiusura tag ‘/>’. <EMPTY/> Case sensitivity: in XML tutto il markup è case-sensitive (il maiuscolo è diverso dal minuscolo). È quindi necessario usare le maiuscole per ELEMENT, ATTLIST, ecc., e l’elemento <para> è diverso dall’elemento <PARA>. Valori tra virgolette: tutti i valori di tutti gli attributi debbono avere le virgolette (semplici o doppie, ma in maniera coerente), anche se numeri o appartenenti ad una lista di valori predefiniti. XML - Guido Boella

78 Altre differenze tra SGML e XML (2)
Tag omissibili: Non esiste il concetto di tag omissibili, e nella definizione degli elementi non ci sono i parametri di minimizzazione. Entità predefinite: sono pre-definite e non ridefinibili 5 entità: <!ENTITY lt “<”> <!ENTITY gt “>”> <!ENTITY amp “&”> <!ENTITY apos “’”> <!ENTITY quot ‘”’> Processing instructions: la sequenza di chiusura di un’istruzione di elaborazione è ‘?>’: <?Fine-pagina?> XML - Guido Boella

79 Il white space XML adotta convenzioni molto semplici e dirette per il white space: New line: Per semplicità ed uniformità, XML trasforma ogni tipo di new line (CRLF, LF e CR) nel solo carattere LF. “If it ain’t markup, it’s data”: Ogni white space che appare nel contenuto del documento è rilevante, e deve essere passato intatto all’applicazione. Tuttavia, un parser validante è tenuto a precisare all’applicazione quale white space è stato riscontrato in elementi con content model di tipo elemento, cosicché l’applicazione possa decidere cosa farne. XML - Guido Boella

80 Attributi per white space e lingua
Esistono in XML due attributi riservati (ma da definire se usati): xml:space (valori possibili: “default” o “preserve”) permette all’autore di indicare all’applicazione se è opportuno che mantenga il white space xml:lang (valori possibili: i codici a due lettere di RFC 1766): permette all’applicazione di identificare la lingua in cui è scritto il contenuto di un elemento, per attivare funzionalità dipendenti dalla lingua: Rendering corretto Spell-checking Full-text indexing Editing XML - Guido Boella

81 Conclusioni Qui abbiamo parlato di XML, soprattutto per quanto non è derivato da SGML: Il senso di XML Usi innovativi di XML I criteri progettuali La distinzione tra documenti ben formati e validi Le principali differenze sintattiche XML - Guido Boella

82 Riferimenti Wilde’s WWW, capitolo 7 Altri testi:
Neil Bradley, The XML companion, Addison Wesley 1998 J. Bosak, XML, Java, and the future of the Web, T. Bray, J. Paoli, C.M. Sperberg-McQueen, Extensible Markup Language (XML) 1.0, W3C Recommendation, 10 February 1998, T. Bray, The annotated XML Specification,1998, XMLNews Specifications, XML - Guido Boella

83 Sintassi

84 • Internet Explorer 5.0 has the following XML support:
Browsers e XML • Internet Explorer 5.0 has the following XML support: · Viewing of XML documents · Full support for W3C DTD standards · XML embedded in HTML as Data Islands · Binding XML data to HTML elements · Transforming and displaying XML with XSL · Displaying XML with CSS · Access to the XML DOM XML - Guido Boella

85 Apertura e chiusura dei tag
Nel codice HTML un elemento contiene in genere sia tag di apertura che di chiusura. A differenza dell’HTML, l’XML richiede che un tag di chiusura venga utilizzato per ogni elemento. Si consideri ad esempio l’elemento HTML Paragraph che dovrebbe in genere includere un tag di apertura, il contenuto e un tag di chiusura come mostrato di seguito: <P>Questo è un elemento HTML Paragraph.</P> Non sempre viene utilizzato un tag di chiusura in questo contesto. Questo avviene perché l’HTML e il linguaggio di origine SGML consentono di omettere i tag di chiusura senza invalidare il codice. Poiché un paragrafo in HTML non può essere annidato all’interno di un altro paragrafo, l’elaboratore è in grado di leggere il tag di apertura del paragrafo e di presumere che indichi anche la fine del paragrafo precedente. Queste tecniche di minimizzazione non sono consentite nel linguaggio XML. XML - Guido Boella

86 IL TAG DI ELEMENTO VUOTO
Il linguaggio XML supporta 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. <tag attributo=“valore”>contenuto</tag> Nuova sintassi per i tag di chiusura Quando l’elemento è senza contenuto <tag attr=“3”></tag> <tag attr=“3”/> sono equivalenti XML - Guido Boella

87 Annidamento L’annidamento è il processo che consente di incorporare un oggetto o un costrutto l’uno all’interno dell’altro. Un documento XML può ad esempio contenere elementi nidificati 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 - Guido Boella

88 Annidamento Regole per i tag Non permesso <a> <b>
Corretto <a> <b> </b> </a> XML - Guido Boella

89 Overlapping • E’ vietata la sovrapposizione (overlapping) degli elementi <B>Bold <I> Bold e Italic </B> Continua solo Italic </I> Possibili Soluzioni: <B>Bold </B><I><B> Bold e Italic </B></I><I> solo Italic </I> <B>Bold </B><I><B> Bold e Italic </B> solo Italic </I> XML - Guido Boella

90 Attributi Gli attributi consentono di associare valori a un elemento senza che siano considerati parte del contenuto dell’elemento stesso. 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 è Questo formato del nome e del valore mostra il modo in cui sono utilizzati gli attributi nel linguaggio XML. I valori vanno sempre tra virgolette XML - Guido Boella

91 Tag e attributi <? XML version="1.0" ?>
<!DOCTYPE indirizzi SYSTEM "mio.dtd"> <tag att1="val1" att2="val2"> <tag1 att3="val3"><tag2>testo</tag2> </tag1> <tag1><tag2>testo</tag2></tag1> <tag1/> </tag> coppie attributo - valore elemento elemento vuoto: aperto e chiuso subito: equivale a <tag1></tag1> NB: diversamente da HTML ogni tag va chiuso: no <HR> XML - Guido Boella

92 Attributi - Problemi • Non esistono regole per scegliere gli
attributi o gli elementi • Alcuni problemi con l’ uso di attributi: – non possono contenere valori multipli (gli elementi si) – non sono facilmente espandibili per un uso futuro – non descrivono la struttura gerarchica – sono più difficili da essere manipolati dalle applicazioni – i loro valori sono più difficili da controllare da un parser di DTD XML - Guido Boella

93 Struttura di un documento
XML - Guido Boella

94 PROLOGO Il primo elemento strutturale di un documento XML è un prologo opzionale: DICHIARAZIONE XML: identifica la versione delle specifiche XML a cui è conforme il documento. E’ un elemento opzionale, ma deve sempre essere inserita in documento XML (espresso come processing instruction <? ?>) <?xml version="1.0"?> Una dichiarazione XML può contenere una dichiarazione di codifica (encoding) e una dichiarazione di documento autonomo (standalone). 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. La dichiarazione di documento autonomo identifica l’esistenza delle dichiarazioni di markup esterne al documento. Questo tipo di dichiarazione può assumere valore yes o no. XML - Guido Boella

95 <!DOCTYPE Wildflowers SYSTEM "Wldflr.dtd">
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. <?xml version="1.0"?> <!DOCTYPE Wildflowers SYSTEM "Wldflr.dtd"> XML - Guido Boella

96 L’ELEMENTO DOCUMENT L’elemento Document contiene tutti i dati di un documento XML inclusi tutti i sottoelementi nidificati e le entità esterne. Può essere considerato simile 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. Queste stringhe di codice aggiungono un elemento Document, in questo caso l’elemento Plant all’esempio: <?xml version="1.0"?> <!DOCTYPE Wildflowers SYSTEM "Wldflr.dtd"> <PLANT> <COMMON>Columbine</COMMON> <BOTANICAL>Aquilegia canadensis</BOTANICAL> </PLANT> XML - Guido Boella

97 ENTITA' PREDEFINITE Nel linguaggio XML alcuni caratteri sono utilizzati per contrassegnare il documento in modo specifico. Le parentesi angolari (<>) e la barra (/) sono interpretate come markup e non come dati di un carattere effettivo: <PLANT>Blodroot</PLANT> Questi e altri caratteri sono riservati per il markup e non possono essere utilizzati come contenuto. Se si desidera che questi caratteri siano visualizzati come dati, è necessario utilizzare determinati codici: < < (parentesi angolare di apertura) > > (parentesi angolare di chiusura) &amp ; & (e commerciale) &apos; ‘ (apostrofo) " " (virgolette doppie) XML - Guido Boella

98 ENTITA’ ANALIZZABILI E NON ANALIZZABILI
Un’entità può essere analizzabile o non analizzabile. Per entità analizzabile si intende un’entità in grado di essere letta dall’elaboratore di 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, una dichiarazione del tipo analizzabile potrebbe essere questa : <!ENTITY LR1 "light requirement: mostly shade"> Ogni volta che nel documento viene fatto riferimento a questa entità, quest’ultima verrà sostituita dal contenuto. Se si desidera modificare il contenuto dell’entità, è necessario effettuare questa operazione solo nella dichiarazione e la modifica si rifletterà in qualsiasi punto del documento in cui venga utilizzata l’entità. XML - Guido Boella

99 RIFERIMENTI DI ENTITA’
Il contenuto di ogni entità viene aggiunto al documento ogni volta che viene fatto riferimento a quell’entità. Il riferimento ha la funzione di segnaposto per l’autore del contenuto e l’elaboratore di XML colloca il contenuto effettivo nei punti di riferimento. Per includere un riferimento, bisogna inserire una e commerciale (&) e immettere il nome dell’entità seguito da punto e virgole (;). All’interno di un documento assumerebbe il seguente aspetto: <TERM>Wild Ginger has the following &LR1;</TERM> XML - Guido Boella

100 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. XML - Guido Boella

101 ENTITA’ DI PARAMETRO Un’entità non analizzabile viene indicata talvolta come entità binaria in quanto il contenuto è spesso costituito da un file binario, ad esempio un’immagine, che non può essere interpretato direttamente dall’elaboratore XML. Un’entità non analizzabile richiede informazioni diverse da quelle incluse in un’entità analizzabile. Viene richiesta un’annotazione che identifica il formato o il tipo di risorsa per cui l’entità viene dichiarata. Ad esempio : <!ENTITY MyImage SYSTEM "Image001.gif" NDATA GIF> XML - Guido Boella

102 ENTITA’ DI PARAMETRO Questa dichiarazione significa che l’entità MyImage è un file binario nell’annotazione GIF. Perché queste dichiarazione di entità siano valide, anche l’annotazione deve essere dichiarata. La dichiarazione di annotazione consente all’applicazione di XML di gestire i file binari esterni. Nel caso dell’annotazione GIF utilizzata nell’esempio, può essere impiegata la dichiarazione di annotazione seguente: <!NOTATION GIF SYSTEM "/Utils/Gifview.exe"> Questa stringa di codice indica all’elaboratore di XML di utilizzare Gifview.exe per elaborare l’entità di tipo GIF ogni volta che viene rilevata. Dopo essere stata dichiarata, la dichiarazione di annotazione può essere utilizzata all’interno del documento. XML - Guido Boella

103 ENTITA’ INTERNE ED ESTERNE
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, ad esempio: <!ENTITY LR1 "light requirement: mostly shade"> Un’entità esterna fa riferimento a un’unità di memorizzazione nella dichiarazione mediante un identificatore pubblico o di sistema. L’identificatore di sistema fornisce un collegamento alla posizione in cui si trova il contenuto dell’entità, ad esempio un URI (Uniform Resource Identifier) come ad esempio: <!ENTITY MyImage SYSTEM " NDATA GIF> In questo caso l’elaboratore di XML deve necessariamente leggere il file Image001.gif per recuperare il contenuto di questa entità. XML - Guido Boella

104 identificatore pubblico
fornisce un metodo opzionale e alternativo per il recupero del contenuto di un’entità da parte dell’elaboratore di XML. Utilizzato se l’applicazione è collegata a una libreria del documento disponibile pubblicamente <!ENTITY MyImage PUBLIC "-//Wildflowers/TEXT Standard images//EN” " NDATA GIF> Se non esiste l’oggetto pubblico si ricorre all’indentificatore di sistema opzionale XML - Guido Boella

105 RIFERIMENTI DI ENTITA’ DI PARAMETRO
Un altro tipo di riferimento è quello relativo all’entità di parametro che utilizza un modulo (%) invece di una e commerciale anche se l’aspetto è simile a qualsiasi altro riferimento di entità. %CDF; è un esempio di entità di parametro. XML - Guido Boella

106 DTD

107 DTD Document type definition permette di creare un nuovo linguaggio di markup per scrivere documenti di un certo tipo. Definisce quali sono i tag, l'ordine degli elementi, i loro attributi e valori Un DTD serve ad un parser per controllare la correttezza di un documento Un DTD è opzionale e puo' essere specificato all'inizio di un documento XML XML - Guido Boella

108 <?xml version=”1.0” encoding=“UTF-8”?> <biblioteca>
<libro codice=”R414”> <titolo>2001: Odissea nello spazio</titolo> <autore> <cognome>Clarke</cognome> <nome>Arthur Charles</nome> </autore> <editore>Rizzoli</editore> <parola_chiave>romanzo</parola_chiave> <parola_chiave>fantascienza</parola_chiave> </libro> </biblioteca> <nome>  <Nome>  <NOME> XML - Guido Boella

109 DTD - Document Type Definition Struttura gerarchica
• contiene le regole di definizione dei tag • indica gli elementi e il loro ordine all’interno del documento XML • il suo uso non è obbligatorio; ne è consigliato l'utilizzo • può essere interna o esterna al documento XML • il suo nome per convenzione corrisponde a quello dell'elemento radice XML - Guido Boella

110 una DTD XML che rappresenta la struttura definita precedentemente:
<!DOCTYPE biblioteca [ <!ELEMENT biblioteca (libro+)> <!ELEMENT libro (titolo, autore+, editore, parola_chiave+)> <!ATTLIST libro codice ID #REQUIRED> <!ELEMENT titolo (#PCDATA)> <!ELEMENT autore (cognome, nome)> <!ELEMENT editore (#PCDATA)> <!ELEMENT parola_chiave (#PCDATA)> <!ELEMENT cognome (#PCDATA)> <!ELEMENT nome (#PCDATA)> ]> Elemento (1) Elemento ? (0,1) Elemento * (0,1,+) Elemento + (1,+) Elemento1 | Elemento2 (or) <!ATTLIST nome_elemento nome_ attributo1 tipo_ attributo valore_di_default #REQUIRED (obbligatorio) nome_ attributo2 tipo_ attributo #IMPLIED (opzionale) nome_ attributo3 tipo_ attributo valore_di_default #FIXED (obbligatorio con valore prefissato) > XML - Guido Boella

111 Documenti ben formati 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 nidificazione impostate nel DTD del documento, mentre un documento XML ben formato viene strutturato in modo appropriato per l’utilizzo da parte di un computer. XML - Guido Boella

112 Struttura della DTD Una DTD può essere costituita da due parti: un sottoinsieme DTD esterno e un sottoinsieme DTD interno. Un documento può contenere una o entrambi i tipi di sottoinsiemi. In questo caso il sottoinsieme interno viene elaborato per primo e gli viene data la precedenza su qualsiasi sottoinsieme esterno. DTD interno al documento: è sufficiente scriverlo nella dichiarazione del tipo di documento. Un sottoinsieme DTD esterno tuttavia deve essere incluso mediante un riferimento DTD, che indica al processore dove trovare il sottoinsieme esterno specificando il nome del file DTD. <!DOCTYPE catalog PUBLIC "-//flowers//DTD Standard //EN" XML - Guido Boella

113 una DTD semplice <?xml version="1.0"?> <!DOCTYPE EMAIL [
<!ELEMENT (TO, FROM, CC, SUBJECT, BODY)> <!ELEMENT TO (#PCDATA)> <!ELEMENT FROM (#PCDATA)> <!ELEMENT CC (#PCDATA)> <!ELEMENT SUBJECT (#PCDATA)> <!ELEMENT BODY (#PCDATA)> ]> < > <SUBJECT>My first DTD</SUBJECT> <BODY>Hello, World</BODY> </ > XML - Guido Boella

114 Dichiarazioni di elementi
Ogni dichiarazione di elemento contiene il nome dell’elemento e il tipo di dati definito specifiche di contenuto costituite da uno tra i quattro tipi seguenti: Un elenco di altri elementi, denominato modello di contenuto La parola chiave EMPTY La parola chiave ANY Contenuto di vario tipo XML - Guido Boella

115 Tipi di dati All’interno del contenuto dei documenti, il linguaggio XML consente di utilizzare dati di caratteri analizzabili dichiarati mediante la parola chiave #PCDATA e i dati di caratteri dichiarati mediante la parola chiave CDATA. I dati di caratteri analizzabili sono dati di caratteri di markup, contengono quindi tag di markup. I dati di caratteri sono costituiti da testo ordinario che può includere caratteri in genere riservati al markup. In base all’impostazione predefinita, gli elaboratori di XML presuppongono che il contenuto di un file XML sia costituito da dati di caratteri. Mentre i dati di caratteri analizzabili sono in genere utilizzati nel contenuto di un documento XML, i dati di carattere possono essere utilizzati nel caso in cui un autore desideri includere dati che non possono essere analizzati. XML - Guido Boella

116 Tipi di dati Per dichiarare una sezione come dati di carattere, è necessario indicare l’inizio della sezione con la sequenza <![CDATA[ e la fine con due parentesi di chiusura ]]. Tutti i dati che risiedono all’interno di questo insieme di marcatori verranno interpretati come semplici dati non analizzabili. <![CDATA[ *p = &q; b = (i <= 3); ]]> XML - Guido Boella

117 DICHIARAZIONI DI ATTRIBUTO
Nel linguaggio XML gli attributi vengono dichiarati nella DTD utilizzando la sintassi seguente: <!ATTLIST ElementName AttributeName Type Default> In questo caso <!ATTLIST> rappresenta il tag che identifica una dichiarazione di attributo. La voce ElementName rappresenta il nome dell’elemento a cui vengono applicati gli attributi, La voce AttributeName rappresenta il nome dell’attributo. La voce Type identifica il tipo di attributo dichiarato. La voce Default specifica le impostazioni predefinite relative all’attributo. XML - Guido Boella

118 Tipo di attributo Utilizzo
CDATA In questo attributo possono essere utilizzati solo dati in formato carattere. ENTITY Il valore dell’attributo deve fare riferimento a un’entità binaria esterna dichiarata nella DTD. ENTITIES E’ equivalente all’attributo ENTITY, ma consente l’utilizzo di più valori separati da spazi. ID Il valore dell’attributo deve essere un identificatore univoco. Se un documento contiene attributi ID con lo stesso valore, l’elaboratore produrrà un errore. XML - Guido Boella

119 Tipo di attributo Utilizzo
IDREF 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. IDREFS E’ equivalente all’attributo IDREF, ma consente l’utilizzo di più valori separati da spazi. NMTOKEN Il valore dell’attributo consiste in una qualsiasi combinazione di caratteri del token del nome, rappresentati da lettere, numeri, punti trattini, due punti o caratteri di sottolineatura. XML - Guido Boella

120 Tipo di attributo Utilizzo
NMTOKENS E’ equivalente all’attributo NMTOKEN, ma consente l’utilizzo di più valori separati da spazi. NOTATION 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. Enumerated Il valore dell’attributo deve corrispondere a uno dei valori inclusi. Ad esempio: <!ATTLIST MyAttribute (content1|content2)> XML - Guido Boella

121 Impostazione predefinita Utilizzo
#REQUIRED Ogni elemento contenente questo attributo deve specificarne un valore. Un valore mancante può causare un errore. #IMPLIED Questo attributo è opzionale. L’elaboratore può ignorare questo attributo se non viene rilevato alcun valore. #FIXED fixedvalue Questo attributo deve avere il valore fixedvalue. Se l’attributo non è incluso nell’elemento, viene stabilito il valore fixedvalue. Default Identifica un valore predefinito per un attributo. Se l’elemento non include l’attributo, viene stabilito il valore default. XML - Guido Boella

122 <!ELEMENT EMAIL (TO+, FROM, CC*, BCC*, SUBJECT?, \BODY?)>
<?xml version="1.0"?> <!DOCTYPE [ <!ELEMENT (TO+, FROM, CC*, BCC*, SUBJECT?, \BODY?)> <!ATTLIST LANGUAGE(Western|Greek|Latin|Universal) " Western" ENCRYPTED CDATA #IMPLIED PRIORITY (NORMAL|LOW|HIGH) "NORMAL"> <!ELEMENT TO (#PCDATA)> <!ELEMENT FROM (#PCDATA)> <!ELEMENT CC (#PCDATA)> <!ELEMENT BCC (#PCDATA)> <!ATTLIST BCC HIDDEN CDATA #FIXED "TRUE"> <!ELEMENT SUBJECT (#PCDATA)> <!ELEMENT BODY (#PCDATA)> ]> XML - Guido Boella

123 specificare il valore nella DTD, in questo caso TRUE.
In questo esempio sono stati aggiunti attributi all’elemento e al nuovo elemento Bcc. Il primo attributo aggiunto all’elemento è LANGUAGE. Questo attributo può contenere una tra le numerose opzioni. L’attributo conterrà il valore predefinito Western se non verrà specificato un altro valore. L’attributo successivo dell’elemento è ENCRYPTED. Questo elemento deve contenere i dati di carattere e poiché l’impostazione predefinita è #IMPLIED, l’elaboratore ignorerà questo attributo se non verrà specificato alcun valore. L’ultimo attributo dell’elemento è PRIORITY. Questo attributo può assumere uno dei tre valori NORMAL, LOW e HIGH. Il valore predefinito è NORMAL. L’attributo HIDDEN è stato incluso nell’elemento Bcc. Questo attributo è di tipo CDATA e il valore predefinito di #FIXED viene specificato dopo la parola chiave #FIXED. Questo attributo deve sempre specificare il valore nella DTD, in questo caso TRUE. XML - Guido Boella

124 XML utilizza una serie di simboli per specificare la struttura di una dichiarazione di elementi.
Parentesi Racchiudono una sequenza, un gruppo di elementi o una serie di alternative (content1, content2) L’elemento deve contenere la sequenza content1 e content2. Virgola Separa gli elementi di una sequenza e identifica l’ordine in cui devono essere visualizzati (content1, content2, content3) L’elemento deve contenere content1, content2 e content3 nell’ordine specificato. XML - Guido Boella

125 Pipe Separa gli elementi in un gruppo di alternative (content1| content2 | content3) L’elemento deve contenere content1, content2 o content3. Punto di domanda Indica che un elemento deve essere visualizzato una sola volta o non apparire mai content1? L’elemento può contenere content1. Se content1 viene visualizzato, deve apparire una sola volta. XML - Guido Boella

126 Asterisco Indica che l’elemento può essere visualizzato ogni volta che l’autore desidera content1* L’elemento può contenere content1. Se viene visualizzato, può apparire una o più volte. Segno più Un elemento deve essere visualizzato una o più volte content1+ L’elemento deve contenere content1 una volta, ma può essere visualizzato anche più di una volta. Nessun simbolo Indica che deve essere visualizzato un elemento content1 L’elemento deve contenere content1. XML - Guido Boella

127 Esempio almeno uno <!ELEMENT agenda (contatto+)> <! ELEMENT contatto (nome*, cognome, tel+, via, numero, ?, webaddress?)> <!ELEMENT nome #PCDATA> <!ATTRIBUTE agenda data CDATA required> <!ATTRIBUTE tel tipo (celluare | fisso) 'fisso'> zero o più uno opzionale parsable character data attributo obbligatorio character data valori possibili default XML - Guido Boella

128 IE5, XML e XSL Il browser IE5 permette di visualizzare un file XML facendolo tradurre da uno stylesheet CSS <?xml version="1.0"?> <?xml-stylesheet type="text/css" href="menu.css" ?> XML - Guido Boella

129 CSS per XML menu.xml <?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="menu.css" ?> <Menu effective=" " expires=" "> <Appetizers> <Item> <Name>Deep Fried Mushrooms with Stuff in Them</Name> <Price>6.00</Price> <Description>All mushrooms look alike. Focus on the conversation</Description> </Item> menu.css: NAME {BACKGROUND-COLOR: teal; COLOR: white; DESCRIPTION {BACKGROUND-COLOR: white; COLOR: blue;} XML - Guido Boella

130 APPETIZERS { BORDER-BOTTOM: red thin groove;
BORDER-LEFT: red thin groove; BORDER-RIGHT: red thin groove; BORDER-TOP: red thin groove; COLOR: black; DISPLAY: block; FONT-FAMILY: 'Times New Roman'; FONT-SIZE: 12pt } ITEM { BACKGROUND-COLOR: white; } NAME {BACKGROUND-COLOR: teal; COLOR: white; DISPLAY: inline; FONT-FAMILY: Verdana; FONT-SIZE: 10pt; FONT-STYLE: normal; FONT-WEIGHT: bold;} PRICE { BACKGROUND-COLOR: silver; float: right; FONT-SIZE: 8pt; FONT-WEIGHT: lighter } DESCRIPTION BACKGROUND-COLOR: white; COLOR: blue; FONT-STYLE: italic; FONT-WEIGHT: normal ENTREES BORDER-BOTTOM: black double; BORDER-LEFT: black double; BORDER-RIGHT: black double; BORDER-TOP: black double; FONT-SIZE: 18pt; FONT-WEIGHT: 700 DESSERTS BORDER-BOTTOM: blue thin groove; BORDER-LEFT: blue thin groove; BORDER-RIGHT: blue thin groove; BORDER-TOP: blue thin groove; FONT-SIZE: 12pt XML - Guido Boella

131 BACKGROUND-COLOR: white; COLOR: blue; FONT-FAMILY: Verdana;
DESCRIPTION { BACKGROUND-COLOR: white; COLOR: blue; FONT-FAMILY: Verdana; FONT-SIZE: 10pt; FONT-STYLE: italic; FONT-WEIGHT: normal } ENTREES { BORDER-BOTTOM: black double; BORDER-LEFT: black double; BORDER-RIGHT: black double; BORDER-TOP: black double; COLOR: black; DISPLAY: block; FONT-SIZE: 18pt; FONT-WEIGHT: 700 } DESSERTS { BORDER-BOTTOM: blue thin groove; BORDER-LEFT: blue thin groove; BORDER-RIGHT: blue thin groove; BORDER-TOP: blue thin groove; FONT-SIZE: 12pt } XML - Guido Boella

132 DISPLAY e FLOAT block block block float left block block block block
inline inline block inline block block float left block block block block block XML - Guido Boella

133 in a BOX margin top border padding left content right bottom
XML - Guido Boella

134 XML in HTML DATA ISLANDS

135 Data island Due modi per includere XML dentro una pagina html
<XML ID="XMLID"> <XMLDATA> <DATA>TEXT</DATA> </XMLDATA> </XML> <XML SRC=" XML - Guido Boella

136 Data binding Oppure il contenuto è accessibile in DHTML tramite gli attributi DATASRC e DATAFLD DATASRC fa riferimento all'ID del data island preceduto da # DATAFLD si riferisce ad un elemento XML DATASRC può essere associato ad una TABLE, ma DATAFLD non può essere associato a TD direttamente: solo tramite altro tag come DIV XML - Guido Boella

137 Esempio <HTML> <BODY> <XML ID="xmlMeetings"> <?xml version="1.0" ?> <meetings> <meeting> <date>1/1/99</date> <time>9:00</time> <location>104</location> </meeting> <meeting> <date>2/1/99</date> <time>13:00</time> <location>34</location> </meeting> </meetings> </XML> <table datasrc="#xmlMeetings"> <tr> <td><div datafld="date"></div></td> <td><div datafld="time"></div></td> <td><div datafld="location"></div></td> </tr> </table> </BODY> </HTML> XML - Guido Boella

138 XML in HTML <XML ID="dsoData" SRC="authorsasxml.xml"></XML> <TABLE DATASRC="#dsoData"> <TR> <TD> <INPUT TYPE="TEXT" DATAFLD="au_id"></INPUT> </TD> <INPUT TYPE="TEXT" DATAFLD="au_fname"></INPUT> </TR> </TABLE> XML - Guido Boella

139 authors author author name id name id
<authors> <author> <name>Graham Greene</name> <id> </id> </author> <author> <name>James Joyce</name> <id> </id> </author> </authors> authors author author name id name id XML - Guido Boella

140 documentelement authors lastchild firstchild childNodes author author
parentNode firstchild name id name id nextSibling previousSibling XML - Guido Boella

141 authors author name id documentelement.firtchild author (1) documentelement.childnodes.item(1) author (1) documentelement.firtchild.parentNode document namednodemap("name").item(1) name (1) documenteelement.firtchild.firstchild.text G. Greene documentelement.firtchild.nextsibling author (2) documentelement.lastchild.previousSibling author (1) XML - Guido Boella

142 XSLT

143 XSL: un linguaggio di stylesheet
Poiché nessun elemento di XML possiede un significato predefinito, il linguaggio di stylesheet si occupa di dare un significato agli elementi di un documento XML. XSL (Extended Stylesheet Language) è un working group di W3C che si occupa di attribuire significati “ben noti” (come caratteri, font, ecc.) agli elementi di un documento XML. La proposta è divisa in due parti: un linguaggio di trasformazione da documenti XML a documenti XML (chiamato XSLT), ed un vocabolario di elementi XML con semantica di formattazione (chiamato XSL-FO, o anche solo XSL). Il linguaggio XSL non ha ancora uno stato concluso. XSLT è una recommendation W3C del novembre 1999, mentre XSL-FO è ancora in fase di discussione. XML - Guido Boella

144 Il modello di XSLT -> “html”,”h1”, “h2”, ecc.
<book> <title>…</title> <chapter n=“1”> <title> …</title> </chapter> </book> -> “html”,”h1”, “h2”, ecc. XSL -> “fo:block”,”fo:inline”, ecc. XSL XSL -> “libro”,”capitolo”, ecc. <libro> <titolo>…</titolo> <capitolo n=“1”> <titolo> …</titolo> </capitolo> </libro> XML - Guido Boella

145 Come funziona XSLT XSLT è un linguaggio di trasformazione: dato un documento XML, è possibile generare un altro documento XML derivato applicando delle regole di trasformazione specificate nello stylesheet. Se poi nel documento XML di destinazione abbiamo scritto elementi i cui nomi ed attributi sono noti ad un browser (ad esempio, HTML o XSL-FO), allora il documento può essere visualizzato da un browser. XSLT, quindi, è molto più di un linguaggio di visualizzazione di documenti XML: è un linguaggio per trasformare un documento XML in un altro documento XML secondo regole predefinite. XML - Guido Boella

146 I fogli di stile XSLT Un foglio di stile XSL è un documento XML che utilizza un DTD i cui elementi hanno senso noto al motore XSLT. Un foglio di stile XSL è composto sostanzialmente di template di costruzione, che permettono di riscrivere una selezione elementi del documento XML d’origine in altri elementi del documento destinazione. Ogni template individua un pattern da ricercare nel documento di partenza, e vi associa un blocco di elementi e testo da inserire nel documento di destinazione XSLT si basa fondamentalmente su XPath per questi pattern. L’inclusione di XPath (del gruppo di lavoro XLink) ha costituito una notevole modifica rispetto alle prime proposte. XML - Guido Boella

147 Da XML... <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="agenda.xsl" ?> <agenda data="01/02/00"> <contatto> <nome>Guido</nome> <cognome>Boella</cognome> <via>Svizzera</via><numero>185</numero> <tel> </tel> <tel tipo="cellulare"> </tel> </contatto> <contatto> <nome>john</nome> <cognome>Doe</cognome> </agenda> XML - Guido Boella

148 ...a HTML... <html><head><title>agenda</title></head> <body bgcolor="#FFFFFF"> <table border=”2"> <tr><th align="left">nome</th><th align="left">cognome</th> <th align="left">via</th><th align="left">telefono</th> <th align="left">cellulare</th></tr> <tr><td><I>Guido</I></td><td><b>Boella</b></td><td>svizzera 185</td> <td style=“color:red”> </td><td> </td></tr> <tr><td>John</td><td>Doe</td><td>kansas</td> <td> </td><td> </td></tr> </table> </body> </html> XML - Guido Boella

149 Regole di traduzione II
Il cognome va riscritto in grassetto, il nome in italico. Il nome nella prima colonna il cognome nella seconda. <tr><td><I>Guido</I></td><td><b>Boella</b></td> Si’, ma colonna implica una tabella! XML - Guido Boella

150 Regole di traduzione III
Costruisci una tabella vuota. Il cognome va riscritto in grassetto, il nome in italico: cioe’ il contenuto del tag cognome va circondato da un tag boldface di HTML Il nome nella prima colonna il cognome nella seconda. Si’, ma se ho costruito la tabella come faccio a dire dove mettere le cose: <table border=”2"> </table> <tr><td><I>Guido</I></td><td><b>Boella</b></td> XML - Guido Boella

151 Regole di traduzione IV
Chiama la regola di traduzione delle tabelle: Inserisci il tag di inizio tabella. Il cognome va riscritto in grassetto, il nome in italico. Il nome nella prima colonna il cognome nella seconda. Chiudi la tabella <table border=”2"> <tr><td><I>Guido</I></td><td><b>Boella</b></td> </table> E John Doe? XML - Guido Boella

152 Regole di traduzione V Chiama la regola di traduzione delle tabelle:
Inserisci il tag di inizio tabella. Per ogni contatto dell’agenda: Il cognome va riscritto in grassetto, il nome in italico. Il nome nella prima colonna il cognome nella seconda. Chiudi la tabella <table border=”2"> <tr><td><I>Guido</I></td><td><b>Boella</b></td> <tr><td><I>John</I></td><td><b>Doe</b></td> </table> E se ho un altro tipo di tabella? (ad es. elenco libri) XML - Guido Boella

153 Regole di traduzione VI
Chiama la regola di traduzione delle tabelle: Inserisci il tag di inizio tabella. Chiama le regole per tradurre gli elementi che incontra. Chiudi la tabella. Regola per le agende: Per ogni contatto dell’agenda: Il cognome va riscritto in grassetto, il nome in italico. Il nome nella prima colonna il cognome nella seconda. <table border=”2"> <tr><td><I>Guido</I></td><td><b>Boella</b></td> <tr><td><I>John</I></td><td><b>Doe</b></td> </table> Cosa manca? XML - Guido Boella

154 Regole di traduzione VII
Regola per tradurre un documento XML: Metti tag HTML, intestazione e body Chiama la regola di traduzione delle tabelle: Inserisci il tag di inizio tabella. Chiama le regole per tradurre gli elementi che incontra. Chiudi la tabella. Chiudi il tag body e HTML Regola per le agende: … <html><body> <table border=”2"> <tr><td><I>Guido</I></td><td><b>Boella</b></td> <tr><td><I>John</I></td><td><b>Doe</b></td> </table> </body></html> XML - Guido Boella

155 Regole di traduzione VII
Regola per tradurre la radice di un documento XML: / Metti tag HTML, intestazione e body Chiama la regola di traduzione delle tabelle: Inserisci il tag di inizio tabella. Chiama le regole per tradurre gli elementi che incontra. Chiudi la tabella. Chiudi il tag body e HTML Regola per le agende: … <html><body> <table border=”2"> <tr><td><I>Guido</I></td><td><b>Boella</b></td> <tr><td><I>John</I></td><td><b>Doe</b></td> </table> </body></html> XML - Guido Boella

156 XML - Guido Boella

157 via XSLT <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=" <xsl:template match="/"> ... </xsl:template></xsl:stylesheet> XML - Guido Boella

158 via XSLT <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=" <xsl:template match="/"> <html><head><title>agenda</title></head> <body> ... </body></html> </xsl:template></xsl:stylesheet> XML - Guido Boella

159 via XSLT <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=" <xsl:template match="/"> <html><head><title>agenda</title></head> <body> <table border="2> ... </table></body></html> </xsl:template></xsl:stylesheet> XML - Guido Boella

160 via XSLT <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=" <xsl:template match="/"> <html><head><title>agenda</title></head> <body> <table border="2"><tr><th align="left">nome</th></tr> ... </table></body></html> </xsl:template></xsl:stylesheet> XML - Guido Boella

161 via XSLT <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=" <xsl:template match="/"> <html><head><title>agenda</title></head> <body> <table border="2><tr><th align="left">nome</th></tr> <agenda data="01/02/00"> <contatto> <nome>Guido</nome> <cognome>Boella</cognome> </contatto> <contatto>...</contatto> </agenda> </table></body></html> </xsl:template></xsl:stylesheet> XML - Guido Boella

162 via XSLT <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=" <xsl:template match="/"> <html><head><title>agenda</title></head> <body> <table border="2"><tr><th align="left">nome</th></tr> <xsl:for-each select="//contatto"> <contatto> <nome>Guido</nome> <cognome>Boella</cognome> </contatto> </xsl:for-each> </table></body></html> </xsl:template></xsl:stylesheet> XML - Guido Boella

163 via XSLT <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=" <xsl:template match="/"> <html><head><title>agenda</title></head> <body> <table border="2"><tr><th align="left">nome</th></tr> <xsl:for-each select="//contatto"> <tr><td> <nome>Guido</nome> </td> <td> <cognome>Boella</cognome> </td></tr> </xsl:for-each> </table></body></html> </xsl:template></xsl:stylesheet> XML - Guido Boella

164 via XSLT <?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl=" <xsl:template match="/"> <html><head><title>agenda</title></head> <body> <table border="2"><tr><th align="left">nome</th></tr> <xsl:for-each select="//contatto"> <tr><td><xsl:value-of select="nome"/></td> <td><xsl:value-of select="cognome"/></td></tr> </xsl:for-each> </table></body></html> </xsl:template></xsl:stylesheet> XML - Guido Boella

165 file xml <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="hello.xsl"?> <greeting>Hello world.</greeting> file xsl <?xml version="1.0"?> <html xmlns:xsl=" xsl:version="1.0"> <head><title>Greeting</title></head> <body><p>Words of greeting:<br/> <b><i><u><xsl:value-of select="greeting"/></u></i></b> </p></body> </html> XML - Guido Boella

166 Risultato: <html> <head>
<title>Greeting</title> </head> <body> <p>Words of greeting:<br> <b><i><u>Hello world.</u></i></b> </p> </body> </html> XML - Guido Boella

167 I fogli di stile XSLT Nel documento XSLT si usano dunque elementi provenienti da almeno due namespace: quello di XSLT e quello del modello di documenti di destinazione. Esistono due filosofie di riscrittura disponibili in XSLT, che vengono dette pull e push. Pull: basata su template, viene usata tipicamente per trasformare dati. In un documento pre-formattato per l’output, si vanno ad inserire le parti di documento tratte dal file XML d’origine. Si ispirano sostanzialmente ai linguaggi di inclusione (ad es. server-side include tipo PHP e simili). Push: basata su regole, usata tipicamente per trasformare documenti. Per ogni elemento del documenti di input, si cerca la regola più appropriata e la si usa per scrivere il risultato. Si ispirano ai linguaggi di riscrittura basati su regole (tipo DSSSL) XML - Guido Boella

168 Un esempio di pull (1) <?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="SalesToHTML.xsl" type="text/xsl" ?> <!-- SalesReport.cml --> <SalesReport> <Company>XMML.com</Company> <Period> </Period> <Sales Region="EU">50,000</Sales> <Sales Region="NA">150,000</Sales> <Sales Region="AU">10,000</Sales> </SalesReport> XML - Guido Boella

169 Un esempio di pull (2) <?xml version='1.0'?> <xsl:stylesheet xmlns:xsl=" <xsl:template match="/"><html><head><title>Sales Report, <xsl:value-of select="/SalesReport/Company" />: <xsl:value-of select="/SalesReport/Period" /></title> </head><body><br /> <table width="50%"><tr><th>Region</th></tr> <xsl:for-each select="/SalesReport/Sales"><tr> <td align="center"><xsl:value-of <td align="center"><xsl:value-of select="."/></td></tr> </xsl:for-each></table></body></html> </xsl:template> </xsl:stylesheet> XML - Guido Boella

170 Il foglio di stile per il pull
Questo è sostanzialmente un documento HTML con qualche tag strano: xsl:for-each va a cercare uno ad uno una sequenza di elementi ed applica le istruzioni al suo interno per ciascun elemento xsl:value-of va a cercare il valore (cioè il contenuto) di ogni elemento all’interno di xsl:foreach, e lo inserisce al suo posto. xsl:template dice che questa regola è un template da applicare all’elemento radice del documento XML di partenza (match=“/”). E’ quindi possibile applicare la stessa regola anche a sottoparti di un documento XML. xsl:stylesheet è l’elemento radice del foglio di stile e specifica i namespace che vengono utilizzati nel foglio di stile stesso (nel nostro caso, uno per le istruzioni XSL ed uno per il set di tag di destinazione, cioè HTML. XML - Guido Boella

171 Un esempio di push (1) <document>
<title>To the Pole and Back</title> <section> <title>The First Day</title> <para>It was the <emph>best</emph> of days, it was the <emph>worst </emph> of days.</para> <para><emph>Best</emph> in that the sun was out, but <emph>worst</emph> in that it was 39 degrees below zero.</para> </section> ... </document> XML - Guido Boella

172 Un esempio di push (2) <xsl:stylesheet>
<xsl:template match="/"> <HTML> <BODY> <H1><xsl:value-of select="document/title"/></H1> <xsl:apply-templates select="document/section"/> </BODY> </HTML> </xsl:template> <xsl:template match="section"> <HR/> <H2><xsl:value-of select="title"/></H2> <xsl:apply-templates /> <xsl:template match="para"> <P><xsl:apply-templates /></P> <xsl:template match="emph"> <I><xsl:apply-templates /></I> </xsl:stylesheet> XML - Guido Boella

173 Il foglio di stile per il push
Questo non assomiglia ad un documento HTML, ma ad una serie di istruzioni di riscrittura separate: xsl:template è la regola da applicare se l’elemento in esame corrisponde al valore dell’attributo match. Di volta in volta applicherò il template della radice (“/”), dell’elemento “section”, dell’elemento “para”, dell’elemento “emph”, ecc. xsl:apply-templates spinge a cercare, all’interno dell’elemento che stiamo considerando, se esistono altri template applicabili.E’ il modo per far ripartire ricorsivamente la ricerca di altri template. XML - Guido Boella

174 Modello di processing (1)
Il parser costruisce una lista di nodi correnti e per default gli inserisce il nodo radice. Quindi cerca tutti i template che possono essere applicati alla testa della lista di nodi correnti e seleziona il più importante sulla base di criteri espliciti di preferenza L’applicazione del template può creare dei frammenti di albero di destinazione e può anche inserire altri nodi nella lista di nodi correnti. Poi il ciclo si ripete fino ad esaurimento della lista di nodi correnti. XML - Guido Boella

175 Modello di processing (2)
Style sheet Source document Destination document Current node list XML - Guido Boella

176 I template (1) Ogni foglio di stile contiene uno o più template. Un template ha o un nome o un pattern di attivazione Se ha un nome, può essere esplicitamente attivato da un’altra azione Se ha un pattern, può essere attivato se il pattern fa match con il nodo corrente Un template è indicato dall’elemento <template>: <xsl:template match=pattern name=qname priority=number mode=qname > <!-- azione --> </xsl:template> XML - Guido Boella

177 I template (2) Ad esempio, dato il frammento: Il seguente template:
Questo deve essere <emph>importante</emph> Il seguente template: <xsl:template match=“emph”> <html:b> <xsl:apply-templates/> </html:b> </xsl:template> Fa match con l’elemento emph e scrive un elemento B di HTML ed inserisce tutti i nodi figlio del nodo di match nella lista dei nodi correnti. XML - Guido Boella

178 Dentro ad un template All’interno dell’elemento template vi sono una varietà di istruzioni che servono o per modificare la lista di nodi o per scrivere frammenti dell’albero di destinazione. Modificare l’albero di destinazione • elementi letterali • <xsl:value-of> • <xsl:element> • <xsl:attribute> • <xsl:text> • <xsl:processing-instruction> • <xsl:comment> • <xsl:namespace-alias> • <xsl:copy> • <xsl:number> Modificare la lista di nodi correnti • <xsl:apply-templates> • <xsl:for-each> • <xsl:if> • <xsl:choose> • <xsl:sort> XML - Guido Boella

179 Scrivere l’albero di destinazione (1)
Poiché l’albero di destinazione è esso stesso un documento XML, debbo poter creare nodi elemento, attributi e testo in maniera sofisticata. Nodi risultato letterali Sono il modo più semplice: dentro al template scrivo direttamente il frammento XML richiesto. Ogni elemento che non appartiene al namespace di xsl viene direttamente scritto nell’albero di destinazione così come appare nel template. Analogamente viene fatto per ogni nodo di testo <xsl:template match=“pippo”> <b>Viva Pippo</b> </xsl:template> XML - Guido Boella

180 Scrivere l’albero di destinazione (2)
<xsl:value-of> <xsl:value-of> crea un nodo di testo nell’albero di destinazione. L’attributo select (obbligatorio) contiene un espressione XPath che viene valutata e convertita in stringa. La stringa viene combinata con gli altri nodi di testo intorno. L’uso tipico è per convertire markup in testo (ad esempio il valore di attributi in contenuto). Dato il frammento <persona nome=”Guido” cognome=”Boella”/> e il template <xsl:template match=“persona”> <p><xsl:value-of <xsl:text> </xsl:text> <xsl:value-of </xsl:template> ottengo il frammento <p>Guido Boella</p> XML - Guido Boella

181 Scrivere l’albero di destinazione (3)
Parentesi graffe {} Laddove non sia possibile usare del markup (ad esempio come valore di un attributo, è possibile usare le parentesi graffe, che hanno in questo senso lo stesso significato di <xsl:value-of> L’uso tipico è per convertire markup in altro markup (ad esempio il valore di un attributo nel nome di un tag). Dato il frammento <persona nome=”Fabio” cognome="Vitali”/> e il template <xsl:template match=“persona”> <mail </xsl:template> ottengo il frammento <mail to=“Fabio Vitali”/> XML - Guido Boella

182 Scrivere l’albero di destinazione (4)
<xsl:element> Se è necessario scrivere un elemento complesso o calcolato uso <xsl:element> Ad esempio può servire per trasformare nel nome di un tag nel documento destinazione il valore di un attributo del dcumento di partenza. Dato il frammento <persona tipo=”studente” nome=”Mario Rossi”/> e il template <xsl:template match=“persona”> <xsl:element <xsl:value-of </xsl:element> </xsl:template> ottengo il frammento <studente>Mario Rossi</studente> XML - Guido Boella

183 Scrivere l’albero di destinazione (5)
<xsl:attribute> All’interno di un elemento (sia letterale che <xsl:element>) è possibile specificare degli attributi in maniera esplicita con il tag <xsl:attribute> E’ più chiaro e più potente delle parentesi graffe. Lo si può usare per stabilire con espressione anche il nome dell’attributo. Dato il frammento <persona id=” ” nome=”Mario Rossi”/> e il template <xsl:template match=“persona”> <A><xsl:attribute name=“HREF”> <xsl:value-of </xsl:attribute> <xsl:value-of </xsl:template> ottengo il frammento <A HREF=“ html”>Mario Rossi</A> XML - Guido Boella

184 Scrivere l’albero di destinazione (6)
<xsl:attribute> All’interno di un elemento (sia letterale che <xsl:element>) è possibile specificare degli attributi in maniera esplicita con il tag <xsl:attribute> E’ più chiaro e più potente delle parentesi graffe. Lo si può usare per stabilire con espressione anche il nome dell’attributo. Dato il frammento <persona id=” ” nome=”Mario Rossi”/> e il template <xsl:template match=“persona”> <A><xsl:attribute name=“HREF”> <xsl:value-of </xsl:attribute> <xsl:value-of </xsl:template> ottengo il frammento <A HREF=“ html”>Mario Rossi</A> XML - Guido Boella

185 Scrivere l’albero di destinazione (7)
<xsl:text> Inserisce esplicitamente il testo contenuto dentro al documento. E’ vantaggioso rispetto a mettere il testo letterale perché rispetta il white space ed i caratteri speciali (“&” e “<“, per esempio). <xsl:processing-instruction> Le processing instruction dentro al foglio di stile vengono ignorate, non trasferite. Per scriverle esplicitamente nel documento di arrivo debbo usare <xsl:processing-instruction> Ad esempio, <xsl:processing-instruction name="xml-stylesheet"> href="book.css" type="text/css” </xsl:processing-instruction> genera il seguente output: <?xml-stylesheet href="book.css" type="text/css"?> <xsl:comment> Inserisce esplicitamente del commento dentro al documento. XML - Guido Boella

186 Scrivere l’albero di destinazione (8)
<xsl:namespace-alias> Permette di specificareesplicitamente il namespace di arrivo <xsl:copy> Copia nell’output il nodo di riferimento, insieme al suo namespace, ma non al suo contenuto e ai suoi attributi, che vanno copiati esplicitamente. <xsl:number> Viene usato per inserire esplicitamente numeri formattati dentro all’albero dei risultati. Ha vari attributi, tra cui: Level: quanti livelli dell’albero sorgente vanno considerati Count: quale pattern di nodi vanno contati per trovare il numero From: da dove partire nel conto Value: come identificare il numero (se diverso dalla posizione) Format: il formato del numero (1, 2, 3 oppure A, B, C, ecc.) XML - Guido Boella

187 Cambiare la lista di nodi correnti (1)
Nel corso del processing di un nodo, debbo alimentare la lista dei nodi correnti con altri nodi, figli o altro. Qualunque nodo può essere inserito, anche più volte, nel documento, e in qualunque ordine (non è uno stack!). Alcuni tag XSL permettono di controllare la lista: <xsl:apply-templates> <xsl:apply-templates inserisce nella lista dei nodi corrent i figli diretti dell’elemento considerato, nell’ordine in cui appaiono. Se usato con l’attributo select, inserisce solo i figli diretti che fanno match con il pattern. Nel momento in cui incontra un elemento <xsl:apply-templates>, il parser sospende il processing del template in corso e procede ricorsivamente ad esaminare i figli. XML - Guido Boella

188 Cambiare la lista di nodi correnti (2)
<xsl:apply-templates> - segue Questo template trasforma un “para” in un “p” di HTML: <xsl:template match=”PARA"> <P><xsl:apply-templates/></P> </xsl:template> Questo template crea un indice delle intestazioni di primo livello di un documento HTML e lo pone prima del testo: <xsl:template match=”BODY"> <xsl:apply-templates select=“H1” /> <HR/> <xsl:apply-templates /> </xsl:template> XML - Guido Boella

189 Cambiare la lista di nodi correnti (3)
<xsl:for-each> <xsl:apply-templates> mette i nodi figlio dentro alla lista dei nodi correnti e procede cercando template da applicare. Se invece voglio che un comportamento specifico venga applicato ad ognuno dei figli direttamente dentro al template, uso <xsl:for-each>. Ad esempio il template: <xsl:template match=”BODY"> <xsl:apply-templates select=“H1”/> </xsl:template> <xsl:template match=”H1"> <P><xsl:value-of select=“.”/></P> </xsl:template> viene più facilmente realizzato così: <xsl:template match=”BODY"> <xsl:for-each select=“H1”/> <P><xsl:value-of select=“.”/></P> </xsl:for-each> </xsl:template> XML - Guido Boella

190 Cambiare la lista di nodi correnti (4)
<xsl:if> <xsl:if> attiva condizionalmente dei comportamenti a seconda della verità di un XPath di test. Ad esempio il template seguente colora di giallo lo sfondo di una riga ogni due di una tabella HTML: <xsl:template match="item"> <tr> <xsl:if test="position() mod 2 = 0"> <xsl:attribute name="bgcolor"> yellow </xsl:attribute> </xsl:if> <xsl:apply-templates/> </tr> </xsl:template> XML - Guido Boella

191 Cambiare la lista di nodi correnti (5)
<xsl:choose>, <xsl:when>, <xsl:otherwise> <xsl:choose> seleziona una tra molte alternative (la funzione di switch in C). <xsl:template match="item"><tr> <xsl:choose> <xsl:when test="position() mod 3 = 0"> <xsl:attribute name="bgcolor">blue</xsl:attribute> </xsl:when> <xsl:when test="position() mod 3 = 1"> <xsl:attribute name="bgcolor">green</xsl:attribute> </xsl:when> <xsl:otherwise> <xsl:attribute name="bgcolor">red</xsl:attribute> </xsl:otherwise> </xsl:choose> <xsl:apply-templates/> </tr> </xsl:template> XML - Guido Boella

192 Cambiare la lista di nodi correnti (4)
<xsl:sort> <xsl:sort> ordina i nodi nella lista dei nodi correnti. Esso può essere soltanto figlio di un <xsl:apply-templates> o di un <xsl:for-each>. Gli elementi <xsl:sort> possono annidarsi per realizzare chiavi primarie, secondarie, ecc. per il sort. <xsl:sort> ha vari attributi: Select: l’espressione in base alla quale fare il sort Data-type: il tipo di dato da ordinare (numero o testo o altro) Order: il tipo ascendete o discendente di ordine Case-order: come trattare le maiuscole e le minuscole. XML - Guido Boella

193 Cambiare la lista di nodi correnti (5)
<xsl:sort> - segue <xsl:template match=”persona"> <ul> <xsl:apply-templates select=“.”> <xsl:sort select=”cognome"/> <xsl:sort select="nome"/> </xsl:apply-templates> </ul> </xsl:template> <xsl:template match=”persona"> <li> <xsl:value-of select=”nome"/> <xsl:text> </xsl:text> <xsl:value-of select=”cognome"/> </li> </xsl:template> XML - Guido Boella

194 Indirezioni (1) E’ possibile raccogliere intere azioni o almeno bocchi di attributi riutilizzabili varie volte in maniera indiretta. Variabili Posso definire delle variabili. Il valore di una variabile è quello di qualunque espressione. La variabile può essere usata nel sottoalbero in cui è definita e deve essere richiamata con l’uso delle graffe e del segno $ <xsl:variable name=”fs">12pt</xsl:variable> <xsl:template match="para"> <fo:block font-size="{$fs}"> <xsl:apply-templates/> </fo:block> </xsl:template> XML - Guido Boella

195 Indirezioni (2) Template nominali
Se in un elemento template uso l’attributo name, invece che match, ottengo un template nominale che viene esplicitamente attivato con il tag <xs:call-template> Posso specificare anche dei parametri per ottimizzare l’uso dei template nominali <xsl:template name="numbered-block"> <xsl:param name="format">1. </xsl:param> <p> <xsl:number format="{$format}"/> <xsl:apply-templates/></p> </xsl:template> <xsl:template match="ol//ol/li"> <xsl:call-template name="numbered-block"> <xsl:with-param name="format">a. </xsl:with-param> </xsl:call-template> </xsl:template> XML - Guido Boella

196 Indirezioni (3) <xsl:attribute-set>
Posso avere una lista nominale di attributi con l’elemento <xsl:attribute-set>. Con l’attributo <xsl:use-attribute-sets> di elementi testuali e nei tag <xsl:element> e <xsl:copy> uso la lista predefinita di attributi. <xsl:attribute-set name=“ts”> <xsl:attribute name="font-size">12pt</xsl:attribute> <xsl:attribute name="font-weight">bold</xsl:attribute> </xsl:attribute-set> <xsl:template match=“heading”> <fo:block xsl:use-attribute-sets=“ts”> <xsl:apply-templates/> </fo:block> </xsl:template> XML - Guido Boella

197 Altri aspetti di XSLT (1)
Modi Permettono di avere template diversi se uso gli stessi nodi di input in più posti diversi. Per esempio, uno stile per le intestazioni negli indici e un altro nel corpo del testo. L’attributo “mode” di <xsl:apply-templates> e di <xsl:template> crea questo binding. Merging E’ possibile porre frammenti di folgi di stile in file esterni. Con gli elementi <xsl:import> e <xsl:include> è possibile inserire frammenti esterni con due significati leggermente diversi: <xsl:import> aumenta la priorità degli elementi inclusi, mentre <xsl:include> la mantiene. Metodi di output E’ possibile specificare che il documento risultante è XML, HTML o testo con l’elemento <xsl:output>. Se l’output è HTML o testo, il processore è meno rigoroso nel valutare la buona forma del documento risultante XML - Guido Boella

198 Altri aspetti di XSLT (2)
White space E’ possibile specificare quali elementi debbano preservare e quali debbano collassare il white space con due appositi elementi, <xsl:preserve-space> e <xsl:strip-space>. Template di default Esistono delle regole di default che vengono applicate in mancanza di template più specifici. Esse ricopiano semplicemente l’input nell’output. <xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template> <xsl:template <xsl:value-of select="."/> </xsl:template> <xsl:template match="processing-instruction()”/> <xsl:template match=" comment()"/> XML - Guido Boella

199 Specificare il foglio di stile XSLT
E’ necessario indicare al browser dove trovare lo stylesheet da usare. Questo può essere fatto in tre modi: Specificando nell’intestazione MIME del collegamento HTTP la locazione del foglio di stile Specificando un gruppo di documenti XLink, uno dei quali è il foglio di stile Specificando con una Processing Instruction (PI) il collegamento: <?xml-stylesheet type=“text/xml” href=“style.xsl”?> <doc> … </doc> XML - Guido Boella

200 Internet Explorer 5.0 e XSLT
Ci sono varie differenze tra XSLT pubblicato nel novembre 1999 e il supporto di Internet Explorer 5.0 ad esso. Namespace XSLT prevede la dicitura: “ mentre Explorer richiede la precedente: “ Tipo MIME Il documento dello stylesheet deve essere dichiarato nella PI <?xml-stylehseet?> di tipo “text/xsl”, invece che “text/xml” Template di default Non esiste nessun template di default per Explorer. In particolare, è necessario fornire template sia per la radice che per l’elemento radice. XML - Guido Boella

201 Conclusioni Oggi abbiamo parlato di XSLT, concentrandoci su:
I template Il meccanismo di processing Come modificare il documento di uscita Come modificare la lista di nodi correnti XML - Guido Boella

202 Riferimenti James Clark, XSL Transformations (XSLT) Version 1.0, W3C Recommendation 16 November 1999, E.R. Harold, XSL Transformations (XSLT), capitolo 14 del libro XML Bible, disponibile in rete: James Clark, XSLT in Perspective, XML - Guido Boella

203 Descrizionexsl:apply-templates
Elemento XSL Descrizionexsl:apply-templates Indica all’elaboratore XSL di cercare il modello corretto da applicare, in base al pattern specificato. xsl:attribute Genera un nodo di attributo e lo applica all’elemento di output. xsl:cdata Genera una sezione CDATA nell’output. xsl:choose Consente di eseguire test condizionali. Questo elemento viene utilizzato in combinazione con gli elementi xsl:otherwise e xsl:when. xsl:comment Crea un commento nella struttura di output. xsl:copy Crea una copia del nodo di destinazione dalla fonte da includere nell’output. xsl:define-template-set Definisce un insieme di modelli a un specifico livello di validità. xsl:element Genera un elemento nell’output con il nome specificato. xsl:entity-ref Genera un riferimento all’entità nell’output con il nome specificato. xsl:eval Valuta una stringa di testo, solitamente codice script. xsl:for-each Applica lo stesso modello a più nodi del documento. xsl:if Consente test condizionali in un modello. xsl:node-name Inserisce il nome del nodo corrente nell’output come stringa di testo. xsl:otherwise Fornisce test condizionali. Questo elemento viene utilizzato in combinazione con gli elementi xsl:choose e xsl:when. xsl:pi Genera un istruzione di elaborazione nell’output. xsl:script Definisce dichiarazioni e funzioni di variabili globali. xsl:stylesheet Definisce l’insieme di modelli che vengono applicati alla struttura del documento di origine per generare il documento di output. xsl:template Definisce un modello per l’output basato su un pattern specifico. xsl:value-of Valuta un pattern XSL specificato nell’attributo select e restituisce il valore del nodo identificato come testo, che verrà poi inserito nel modello. xsl:when Fornisce test condizionali. Questo elemento viene utilizzato in combinazione con gli elementi xsl:choose e xsl:otherwise. XML - Guido Boella

204 DescrizioneAbsoluteChildNumber
METODI XSL Oltre agli elementi, nell’XSL sono inclusi anche metodi. Questi metodi possono essere chiamati dall’elemento xsl:eval o da un normale codice script. Ad esempio, il metodo formatIndex potrebbe essere utilizzato come di seguito: <xsl:template match="NAME"> <TD STYLE="font-style:italic; font-size:20"> <xsl:value-of select="COMMON"/> item number: <xsl:eval> formatIndex(childNumber(this),"1") </xsl:eval> </TD> </xsl:template>Ecco un elenco dei metodi supportati: Metodo XSL DescrizioneAbsoluteChildNumber Restituisce il numero del nodo specificato relativo a tutti gli elementi di pari livello. AncestorChildNumber Restituisce il numero del predecessore di un nodo con il nome specificato. ChildNumber Restituisce il numero del nodo relativo agli elementi di pari livello. Depth Restituisce, per il nodo specificato, il livello gerarchico all’interno della struttura del documento. ElementIndexList Restituisce una matrice di numeri secondari per il nodo specificato e per tutti i nodi principali. Questo elemento è ricorsivo fino al nodo principale. FormatDate Formatta la data mediante le opzioni di formattazione specificate. FormatIndex Formatta il numero intero fornito utilizzando il sistema numerico specificato. FormatNumber Formatta il numero fornito utilizzando il formato specificato. FormatTime Formatta l’ora mediante le opzioni di formattazione specificate. UniqueID Restituisce l’unico identificatore per il nodo specificato. XML - Guido Boella

205 Link in XML

206 XPath, XPointer e XLink XPath, XLink e XPointer sono tre documenti di W3C per la specifica di link ipertestuali sui documenti XML. Originariamente erano un’unica proposta chiamata XLL (da cui la terna XML, XLL e XSL), poi divisa in tre per semplicità. XPath specifica i meccanismi per indicare percorsi all’interno di un documento XML. E’ usato anche da XSLT. E’ una raccomandazione W3C XPointer specifica i meccanismi per riferirsi a parti del documento XML (SGML permette di riferirsi solo ad elementi con l’attributo “ID”, HTML solo ad elementi con l’attributo “NAME”). E’ un Working Draft (6/12/99) XLink usa i meccanismi di indirizzamento di XPointer per descrivere link anche sofisticati tra documenti XML. E’ un Working Draft (21/2/2000) XML - Guido Boella

207 XPointer Gli XPointer sono indirizzi di locazioni interne a documenti XML. Possono essere usati per indicare link da o a specifiche parti di documenti XML. Gli XPointer sono una elaborazione dell’identificativo di frammento in un URL: Gli XPointer sono dunque usati in un locatore, tipicamente un URI o URL, per indicare un frammento di quella risorsa. Gli XPointer sono un’estensione degli XPath, di cui estendono leggermente la sintassi. XML - Guido Boella

208 XPath Gli XPath sono una sintassi comune per XSL e XPointer per esprimere locazioni all’interno di documenti XML. XPath opera sulla struttura logica del documento, non su quella sintattica, usando una sintassi non XML accettabile all’interno di URI e attributi. Un XPath è un espressione che restituisce un oggetto di uno di questi quattro tipi: Un booleano Una stringa Un numero Un insieme di nodi (nodi elemento, nodi attributi, nodi testo) XML - Guido Boella

209 Location Path Il tipo più importante di XPath è il Location Path. Questo può essere o assoluto o relativo. Un Location Path assoluto inizia con ‘/’. Un Location Path è composto di una sequenza di passi di locazione (Location Steps) separati da ‘/’, e letti da sinistra a destra. Ogni termine individua più precisamente un frammento della risorsa individuata in precedenza. Es.: /child::chapter/descendant::para identifica gli elementi “para” che discendano da un elemento “chapter” che sia figlio diretto della radice del documento XML. XML - Guido Boella

210 axis::test[pred1][pred2]…[pred N]
Location Step Un location step ha tre parti: Un asse, che individua la direzione di specifica del location step nell’albero e rispetto al contesto. Un test, che individua il tipo e il nome completo del nodo identificato dal location step Zero o più predicati che raffinano ulteriormente l’insieme di nodi selezionati dal location step La sintassi è: axis::test[pred1][pred2]…[pred N] XML - Guido Boella

211 Assi Gli assi identificano la direzione rispetto alla struttura del documento in cui andare a cercare l’oggetto da restituire rispetto al nodo contesto (NC). Tra gli assi possibili troviamo: child, descendant: figlio diretto e a quelaunque livello del NC parent, ancestor: il genitore immediato e a qualunque livello del NC self: il NC; attribute: gli attributi del NC preceding-sibling, following-sibling: i nodi allo stesso livello ma precedenti o seguenti il NC. preceding, following: i nodi a qualunque livello (ma fuori al NC) che precedono o seguono il NC. XML - Guido Boella

212 Test Il test di un nodo identifica attraverso il nome o il tipo l’oggetto da restituire. Se si specifica un nome solo i nodi con quel nome vengono selezionati. Altrimenti si possono utilizzare: text(): il nodo testo contenuto nel nodo indicato dall’asse comment(): il nodo commento *: tutto il contenuto del nodo indicato dall’asse Esempi: child::text(): il testo di un elemento (il nodo testo figlio del nodo contesto) attribute::* tutti gli attributi del nodo contesto XML - Guido Boella

213 Predicati Un predicato filtra l’insieme dei nodi rispetto alla direzione indicata dall’asse per produrre un nuovo insieme di nodi. Il filtro può essere attuato sulla posizione, o valutando un’espressione booleana Ad esempio, child::para[3] individua il terzo nodo di nome “para” dentro al NC. child::para[last()] individua l’ultimo nodo di nome “para” nel NC. N.B.: child::para[3] è equivalente a child::para[position()=3] Altre funzioni: count() - il numero di nodi id() - l’ID univoco di un nodo name() - il nome qualificato del nodo XML - Guido Boella

214 Sintassi abbreviata In molti casi esistono delle forme abbreviate usabili invece della sintassi completa: Child::x si può abbreviare con x Attribute::x si può abbreviare Descendant si può abbreviare con ‘//’, self con ‘.’, parent con ‘..’ Esempi: /doc/chapter[5]/section[2]: la seconda sezione del quinto capitolo dell documento. Chapter//para: tutti i para discendenti a qualunque livello del nodo chapter figlio del NC //para: tutti i para discendenti a qualunque livello della radice del documento. XML - Guido Boella

215 Altri esempi di XPath tutti i para figli del NC che abbiano l’attributo “warning”. il quinto para figlio di NC ad avere l’attributo typeuguale a “warning”. il quinto para figlio di NC, ma solo se ha l’attributo type uguale a “warning”. Chapter[title]: il “chapter” figlio del NC che contenga uno o più elementi “title” XML - Guido Boella

216 XPointer XPointer permettono di specificare la parte fragment di un URL. Essi sono di tre tipi: Un nome (che identifica l’elemento il cui ID è il nome dato) Equivalente a: …#xpointer(id(”pippo”)) Una sequenza di attraversamento Equivalente a: …#xpointer(*[2]/*[5]/*[3]) Uno o più forme generali di frammento (General Fragment part) XML - Guido Boella

217 Estensioni a XPath XPointer estende il concetto di node in quello di locazione. Una locazione è un nodo, o un punto, o un range di un documento XML. Quindi XPointer definisce due nuovi location types: Point: è definito da un nodo ed un indice, e rappresenta una posizione descritto dall’indice al’interno del nodo. Se il nodo non ha nodi figli, allora l’indice si riferisce alla stringa contenuta nel nodo. Range: è definito come due punti, il primo precedente al secondo. XPointer(id("sec2.1")/descendant::P[last()] to id("sec2.2")/descendant::P[last()]) XML - Guido Boella

218 XLink Gli XLink sono elementi di un documento XML che hanno significato e comportamento di link ipertestuale. Un elemento XML è identificato come un XLink se possiede degli attributi riservati. Stiamo sfruttando il concetto di architectural form introdotto da HyTime Questa è una soluzione di compromesso tra il riservare nomi specifici di elementi (che avrebbe limitato la libertà di creazione dei DTD) e il lasciare tutta la gestione dei link ai fogli di stile (che avrebbe negato di attribuire inequivocabilmente agli elementi la natura di link). Gli XLink sono di due tipi: Link semplici: elementi inline e uni-direzionali Link estesi: inline o out-of-line, spesso multi-direzionali. XML - Guido Boella

219 Funzionamento di XLink
XLink definisce un namespace e alcuni attributi globali in questo namespace. Includere il namespace equivale ad ammettere XLink nel proprio documento. Qualunque namespace definito come " definisce degli XLink Ad esempio: <b:doc xmlns:a=" xmnls:b=“ <b:para> Clicca <b:link a:type=“simple” a:href=“dest.xml”> qui! </b:link> </b:para> </b:doc> XML - Guido Boella

220 XLink semplici La presenza dell’attributo xml:type con valore “simple” identifica l’elemento come un XLink semplice. Un link semplice ha esattamente due risorse collegate, di cui una è locale ed una è remota. Dunque il link è sempre inline. <A xl:type=“simple” xl:href=“ W3C </A> L’attributo href identifica il o i locatori coinvolti. Un locatore è un URL. Il modo più semplice di definire elementi è specificare in un DTD (o nel subset inline di DTD) la presenza dell’attributo: <!DOCTYPE mydoc [ <!ATTLIST A xl:type CDATA #FIXED “simple”> ]> ... <A xl:href=“ W3C </A> XML - Guido Boella

221 XLink estesi Un XLink esteso associa un numero arbitrario di risorse, alcune locali, altre remote. Un link si dice inline se c’è almeno una risorsa locale. Un link esteso deve contenere elementi tratti dai seguenti: L’elemento locator, che indica l’indirizzo di una risorsa remota) L’elemento arc che specifica regole di attraversamento tra le risorse del link L’elemento resource che indica una risorsa locale (e quindi inline) del documento. I link estesi sono utili per: Creare link in uscita da documenti che non possono essere modificati (e quindi non permettono link inline) Creare link da o per documenti in formati non XML. Eseguire l’attivazione di collezioni di link a richiesta. Specificare link mutli-direzionali e multi-destinazione. XML - Guido Boella

222 Link inline e out-of-line
Un link HTML è un link inline: il testo linkante o linkato è il contenuto dell’elemento A, e il link appartiene al documento in cui appare. I link out-of-line sono link che vengono memorizzati in un documento, e appaiono in un altro. Questo è molto comodo per creare link a o da risorse read-only (CD-ROM) o su cui non si hanno permessi di modifica (documenti altrui). XLink determina il tipo di link tramite la presenza dell’elemento resource XML - Guido Boella

223 Un esempio di link esteso
<extlink xl:type=“extended” xl:role=“extlink” xl:title=“prova”> <ruolo xl:type=“arc” xl:from=“uno” xl:to=“due”/> <ruolo xl:type=“arc” xl:from=“uno” xl:to=“tre”/> <local xl:type=“resource” xl:role=“uno”> Clicca qui </local> <url xl:type=“locator” xl:role=“due” xl:href=“ <url xl:type=“locator” xl:role=“tre” xl:href=“ </extlink> XML - Guido Boella

224 Lo stesso esempio <!DOCTYPE [ <!ATTLIST extlink xl:type CDATA #FIXED “extended”> <!ATTLIST ruolo xl:type CDATA #FIXED “arc”> <!ATTLIST local xl:type CDATA #FIXED “resource”> <!ATTLIST url xl:type CDATA #FIXED “locator”> ]> <extlink xl:role=“extlink” xl:title=“prova”> <ruolo xl:from=“uno” xl:to=“due”/> <ruolo xl:from=“uno” xl:to=“tre”/> <local xl:role=“uno”> Clicca qui </local> <url xl:role=“due” xl:href=“ <url xl:role=“tre” xl:href=“ </extlink> XML - Guido Boella

225 O perfino... <!DOCTYPE [ <!ATTLIST extlink xl:type CDATA #FIXED “extended”> <!ATTLIST andata xl:type CDATA #FIXED “arc” xl:from CDATA #FIXED “uno” xl:to CDATA #FIXED “due”> <!ATTLIST ritorno xl:type CDATA #FIXED “arc” xl:from CDATA #FIXED “due” xl:to CDATA #FIXED “uno”> <!ATTLIST primo xl:type CDATA #FIXED “locator” xl:role CDATA #FIXED “uno”> <!ATTLIST secondo xl:type CDATA #FIXED “locator” xl:role CDATA #FIXED “due”> ]> <extlink> <andata/> <primo xl:href=“ <secondo xl:href=“ </extlink> XML - Guido Boella

226 Linkset esterni Visto che molti link finiscono con l’essere esterni al documento, come si fa ad associare un documento con l’elenco dei link definiti su di esso? Il metodo migliore è usando un metodo out-of-band: per esempio, un header della trasmissione HTTP Altrimenti, esiste un valore riservato per l’attributo role, external-linkset, per creare un link esteso che punti alla locazione del set di link relativo al documento: <extendedlink xmlns:xl=" xl:role="xl:external-linkset"> <loc xl:href=“ /> </extendedlink> XML - Guido Boella

227 Altri attributi Altri importanti attributi sono:
title: contiene una stringa intelligibile all’utente di spiegazione del senso della risorsa (usabile su simple, locator, resource e arc) show (valori possibili: “embed”, “replace”, “new”): specifica come visualizzare o elaborare la risorsa specificata. “new” indica che la risorsa va visualizzata in un contesto nuovo, come una finestra nuova; “replace” indica che la risorsa nuova sostituisce la vecchia nel contesto esistente. “embed” indica che il contesto della risorsa nuova è la risorsa locale, a cui va sostituita. Per esempio, rimpiazzando il testo del link con il testo della destinazione. (usabile su simple e arc) actuate (valori possibili: “onLoad” e “onRequest”): specifica quando l’attivazione del link debba avvenire. “user” indica che deve essere l’utente ad attivare l’azione, per esempio facendo click su un pulsante. “auto” significa che il link deve essere attivato appena la risorsa locale viene caricata. (usabile su simple e arc) XML - Guido Boella

228 Riferimenti S. DeRose, E. Maler, D. Orchard, B. Trafford, XML Linking Language (XLink), W3C Working Draft , 21 February 2000, J. Clark, S. DeRose, XML Path Language (XPath), Version 1.0, W3C Recommendation 16 November 1999, S. DeRose, R. Daniel Jr., E. Maler, XML Pointer Language (XPointer), W3C Working Draft 6 December 1999, XML - Guido Boella

229 PROPRIETA' di XMLDOM async* Indicates whether asynchronous download is permitted. Read/write. attributes Contains the list of attributes for this node. Read-only. baseName* Returns the base name for the name qualified with the namespace. Read-only. childNodes Contains a node list containing the children (for nodes that can have children). Read-only. dataType* Specifies the data type for this node. Read/write. definition* Returns the definition of the node in the DTD or schema. Read-only. doctype Contains the document type node that specifies the DTD for this document. Read-only. documentElement Contains the root element of the document. Read/write. firstChild Contains the first child of this node. Read-only. XML - Guido Boella

230 lastChild Returns the last child node. Read-only.
implementation Contains the XMLDOMImplementation object for this document. Read-only. lastChild Returns the last child node. Read-only. namespaceURI* Returns the URI for the namespace. Read-only. nextSibling Contains the next sibling of this node in the parent's child list. Read-only. nodeName Contains the qualified name of the element, attribute, or entity reference, or a fixed string for other node types. Read-only. nodeType Specifies the XML DOM node type, which determines valid values and whether the node can have child nodes. Read-only. nodeTypedValue* Contains this node's value, expressed in its defined data type. Read/write. nodeTypeString* Returns the node type in string form. Read-only. nodeValue Contains the text associated with the node. Read/write. ondataavailable* Specifies the event handler for the ondataavailable event. Read/write. XML - Guido Boella

231 prefix* Returns the namespace prefix. Read-only.
onreadystatechange* Specifies the event handler to be called when the readyState property changes. Read/write. ontransformnode* Specifies the event handler for the ontransformnode event. Read/write. ownerDocument Returns the root of the document that contains this node. Read-only. parentNode Contains the parent node (for nodes that can have parents). Read-only. parsed* Contains True if this node and all descendants have been parsed and instantiated; False if any nodes remain to be parsed. Read-only. parseError* Returns an XMLDOMParseError object that contains information about the last parsing error. Read-only. prefix* Returns the namespace prefix. Read-only. preserveWhiteSpace* Contains True if default processing preserves white space; False otherwise. Read/write. previousSibling Contains the left sibling of this node. Read-only. XML - Guido Boella

232 * denotes an extension to the W3C DOM.
readyState* Indicates the current state of the XML document. Read-only. resolveExternals* Indicates whether external definitions (resolvable namespaces, DTD external subsets, and external entity references) are to be resolved at parse time, independent of validation. Read/write. specified* Indicates whether the node (usually an attribute) is explicitly specified or derived from a default value in the DTD or schema. Read-only. text* Contains the text content of the node and its subtrees. Read/write. url* Returns the canonicalized URL for the last loaded XML document. Read-only. validateOnParse* Indicates whether the parser should validate this document. Read/write. xml* Contains the XML representation of the node and all its descendants. Read-only. * denotes an extension to the W3C DOM. XML - Guido Boella

233 Metodi di XMLDOM abort* Aborts an asynchronous download in progress.
appendChild Appends newChild as the last child of this node. cloneNode Creates a new node that is an exact clone of this node. createAttribute Creates a new attribute with the specified name. createCDATASection Creates a CDATA section node that contains the supplied data. createComment Creates a comment node that contains the supplied data. createDocumentFragment Creates an empty DocumentFragment object. createElement Creates an element node using the specified name. createEntityReference Creates a new EntityReference object. createNode* Creates a node using the supplied type, name, and namespace. createProcessingInstruction Creates a processing instruction node that contains the supplied target and data. XML - Guido Boella

234 createTextNode Creates a text node that contains the supplied data.
getElementsByTagName Returns a collection of elements that have the specified name. hasChildNodes Returns True if this node has children. insertBefore Inserts a child node to the left of the specified node or at the end of the list. load* Loads an XML document from the specified location. loadXML* Loads an XML document using the supplied string. nodeFromID* Returns the node whose ID attribute matches the supplied value. removeChild Removes the specified child node from the list of children and returns it. replaceChild Replaces the specified old child node with the supplied new child node in the set of children of this node, and returns the old child node. save* Saves an XML document to the specified location. XML - Guido Boella

235 selectNodes* Applies the specified pattern-matching operation to this node's context and returns the list of matching nodes. selectSingleNode* Applies the specified pattern-matching operation to this node's context and returns the first matching node. transformNode* Processes this node and its children using the supplied XSL style sheet and returns the resulting transformation. transformNodeToObject* Processes this node and its children using the supplied XSL style sheet and returns the resulting transformation in the supplied object. Eventi di XMLDOM ondataavailable* Indicates that XML document data is available. onreadystatechange* Indicates when the readyState property changes. ontransformnode* Fires before each node in the style sheet is applied to each node in the XML source. XML - Guido Boella

236 XMLDOM DOMDocument Represents the top node of the XML DOM tree.
XMLDOMNode Represents a single node in the document tree; the base interface for accessing data in the XML object model. Valid node types are defined in the DOMNodeType enumeration. This interface includes support for data types, namespaces, DTDs, and XML schemas. XMLDOMNodeList Supports iteration and indexed access operations on the live collection of XMLDOMNode objects. XMLDOMNamedNodeMap Provides iteration and access by name to the collection of attributes. This interface includes support for namespaces. XMLDOMParseError Returns detailed information about the last error, including the error number, line number, character position, and a text description. XML - Guido Boella

237 XMLHttpRequest Provides client-side protocol support for communication with HTTP servers.
XTLRuntime Implements methods that can be called from XSL style sheets. DOM Objects XMLDOMAttribute Represents an attribute object. XMLDOMCDATASection Quotes or escapes blocks of text so that text is not interpreted as markup language. XMLDOMCharacterData Provides text manipulation methods used by several objects. XMLDOMComment Represents the content of an XML comment. XMLDOMDocumentFragment Represents a lightweight object that is useful for tree insert operations. XML - Guido Boella

238 XMLDOMElement Represents the element object.
XMLDOMDocumentType Contains information associated with the document type declaration. XMLDOMElement Represents the element object. XMLDOMEntity Represents a parsed or unparsed entity in the XML document. XMLDOMEntityReference Represents an entity reference node. XMLDOMImplementation Provides methods that are independent of any particular instance of the document object model. XMLDOMNotation Contains a notation declared in the DTD or schema. XMLDOMProcessingInstruction Represents a processing instruction, which XML defines to keep processor-specific information in the text of the document. XML - Guido Boella

239 XMLDOMText Represents the text content of an element or attribute.
The DOMNodeType enumeration lists all valid node types. XML - Guido Boella

240 SCHEMAs L'alternativa al DTD

241 XML Schema Microsoft ha (giustamente) proposto una alternativa al formalismo DTD (document type definition) per specificare documenti XML perchè un DTD non è un documento XML Uno Schema XML specifica gli elementi che possono essere presenti in un documenti e gli attributi a loro associati usando XML come sintassi Uniformità e possibile utilizzo di XSL XML - Guido Boella

242 DTD e XML <!DOCTYPE PGROUP [
<!ELEMENT PGROUP (PERSONA+, GRPDESCR) > <!ELEMENT PERSONA (#PCDATA) > <!ELEMENT GRPDESCR (#PCDATA) > ]> <?xml version="1.0" ?> <PGROUP> <PERSONA>MACBETH</PERSONA> <PERSONA>BANQUO</PERSONA> <GRPDESCR>generals of the king's army.</GRPDESCR> </PGROUP> XML - Guido Boella

243 Schema e XML <?xml version="1.0"?>
<Schema name="schema_sample_1" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="PERSONA" content="textOnly" model="closed"/> <ElementType name="GRPDESCR" content="textOnly" model="closed"/> <ElementType name="PGROUP" content="eltOnly" model="closed"> <element type="PERSONA" minOccurs="1" maxOccurs="*"/> <element type="GRPDESCR" minOccurs="1" maxOccurs="1"/> </ElementType> </Schema> XML - Guido Boella

244 Content model di un elemento
Definizione di elementi e attributi: <elementType name="nometag"> <attributeType name="nomeatt"> Occorrenza di elementi e attributi come parte di altri: <elementType name="autore"> <element type="nome"/> <attribute type="elenco"/> </elementType> attributeType può essere locale o globale per essere condiviso TYPE, non NAME XML - Guido Boella

245 ElementType ed element
Attributi ElementType: content: textonly, eltonly, mixed (default), empty (mixed: <nome>Bill <tag/> Gates</nome>) order: seq (default), one (solo uno dei figli), many (duplicazioni) model (novità): open (default), closed se un content model è open, può contenere elementi e attributi appartenenti ad altri namespace senza che siano dichiarati localmente XML - Guido Boella

246 Attributi ElementType:
content: textonly, eltonly, mixed (default), empty (mixed: <nome>Bill <tag/> Gates</nome>) order: seq (default), one (solo uno dei figli), many (duplicazioni) model (novità): open (default), closed se un content model è open, può contenere elementi e attributi appartenenti ad altri namespace senza che siano dichiarati localmente (diventa possibile riutilizzare schemi standard senza ridefinirli, vedi SOAP e Biztalk) XML - Guido Boella

247 ELEMENTO DI ALTRO NAMESPACE
SCHEMA aperto <ElementType name="shipTo" xmlns:e-com=" <element type="e-com:Address"/> </ElementType> <PurchaseOrder xmlns:e-com=" <shipTo> <e-com:Address> <e-com:name>Alice Smith</e-com:name> <e-com:street>123 Maple Street</e-com:street> </e-com:Address> </shipTo> <orderDate> </orderDate> <shipDate> </shipDate> </PurchaseOrder> ELEMENTO DI ALTRO NAMESPACE DOCUMENTO aperto XML - Guido Boella

248 SOLO UNO DEI DUE ELEMENTI
Attributi di Element: minOccurs e maxOccurs: numero di occorrenze possibili dell'elemento nel content model 0,1, ..., * (infinite) Raggruppamento di Elementi (con proprietà "order", "minOccurs", "maxOccurs"): <elementType name="autore"> <element type="nome"/> <group order="one"> <element type="address"/> <element type=" "/> </group> </elementType> SOLO UNO DEI DUE ELEMENTI XML - Guido Boella

249 Attributi Gli attributi non possono contenere sottoelementi, non hanno ordinamento, nè si possono porre alternative, occorrono una sola volta Opzionalità od obbligatorietà: required = yes o no Range di valori e default: <AttributeType="number" default = "no" dt:values= "yes no" required=yes> NAMESPACE dei tipi XML - Guido Boella

250 Elementi e attributi si possono tipare namespace dei tipi: xmlns:dt="urn:schemas-microsoft-com:datatypes"> <Schema name="myschema" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="pages" dt:type="int"/> <AttributeType="number" required=yes> <datatype dt:type= "int"/> </ElementType> </Schema> NAMESPACE dt XML - Guido Boella

251 Estensione per vincoli semantici
<ElementType name="pages" xmlns:myExt="urn:myschema-extensions"> <datatype dt:type="int" /> <myExt:min>50</myExt:min> <myExt:max>100</myExt:max> </ElementType> RESTRIZIONI NON SINTATTICHE, CIOE' NON VERIFICATE DA XML MA DA APPLICAZIONE CHE USA XML XML - Guido Boella

252 <ElementType name="au_id" content="textOnly"/>
<Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="au_id" content="textOnly"/> <ElementType name="au_lname" content="textOnly"/> <ElementType name="au_fname" content="textOnly"/> <ElementType name="phone" content="textOnly"/> <ElementType name="Author" content="eltOnly"> <element type="au_id"/> <element type="au_lname"/> <element type="au_fname"/> <element type="phone"/> </ElementType> <ElementType name="Authors" content="eltOnly"> <element type="Author" maxOccurs="*"/> </Schema> XML - Guido Boella

253 <au_id>172-32-1176</au_id>
<Authors> <Author> <au_id> </au_id> <au_lname>White</au_lname> <au_fname>Johnson</au_fname> <phone> </phone> <address>10932 Bigge Rd.</address> </Author> <au_id> </au_id> <au_lname>Green</au_lname> <au_fname>Marjorie</au_fname> <phone> </phone> <address>309 63rd St. #411</address> </Author></Authors> XML - Guido Boella

254 <s:Schema id="RowsetSchema">
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <s:Schema id="RowsetSchema"> <s:ElementType name="row" content="eltOnly"> <s:AttributeType name="au_id" rs:number="1" rs:writeunknown="true"> <s:datatype dt:type="string" dt:maxLength="11" rs:maybenull="false" /> </s:AttributeType> <s:AttributeType name="au_lname" rs:number="2" rs:writeunknown="true"> <s:datatype dt:type="string" dt:maxLength="40" rs:maybenull="false" /> <s:AttributeType name="au_fname" rs:number="3" rs:writeunknown="true"> <s:datatype dt:type="string" dt:maxLength="20" rs:maybenull="false" /> ... <s:extends type="rs:rowbase" /> </s:ElementType> </s:Schema> XML - Guido Boella

255 XML e XSL <rs:data>
<z:row au_id=" " au_lname="White" au_fname="Johnson" phone=" " address="10932 Bigge Rd." city="Menlo Park" state="CA" zip="94025" contract="True" /> <z:row au_id=" " au_lname="Green" au_fname="Marjorie" phone=" " address="309 63rd St. #411" city="Oakland" state="CA" zip="94618" contract="True" /> <z:row au_id=" " au_lname="Carson" au_fname="Cheryl" phone=" " address="589 Darwin Ln." city="Berkeley" state="CA" zip="94705" contract="True" /> <z:row au_id=" " au_lname="O'Leary" au_fname="Michael" phone=" " address="22 Cleveland Av. #14" city="San Jose" state="CA" zip="95128" contract="True" /> <z:row au_id=" " au_lname="Straight" au_fname="Dean" phone=" " address="5420 College Av." city="Oakland" state="CA" zip="94609" contract="True" /> </rs:data> </xml> XML - Guido Boella

256 Salvare recordset in XML
<% strsql = request.querystring("sql") if NOT strsql="" then strFile="c:\asp\file2.xml" Set rsAuthors = Server.CreateObject("ADODB.Recordset") Set objFSO = CreateObject("Scripting.FileSystemObject") if objFSO.FileExists(strFile) then objFSO.deletefile strFile end if set objFSO = nothing XML - Guido Boella

257 .save strFile, 1 'adPersistent .close() end if End with
With rsAuthors .Open strsql, "Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\asp\Pro ASP 3.0\pubs.mdb" If (.state = 1) then .save strFile, 1 'adPersistent .close() end if End with Set objFSO = CreateObject("Scripting.FileSystemObject") set objFile = objFSO.getFile(strFile) set objStream = objFile.openAsTextStream() response.write "<textarea>"& objStream.readAll()&"</textarea>" objFile.close XML - Guido Boella

258 XML - Guido Boella

259 XML - Guido Boella

260 XML Schema Fabio Vitali 5 maggio 2000

261 Sommario Oggi esaminiamo in breve XML Schema Perché non bastano i DTD
Tipi ed elementi Definizione di elementi ed attributi Altri aspetti rilevanti di XML Schema XML - Guido Boella

262 Motivazione (1) Inizialmente si pensava che XML servisse solo per i documenti XML è più semplice di SGML, è più generale ed aperto di HTML, è lo strumento ideale per esprimere documenti di testo, siano essi libri, manuali o pagine Web. Quindi l’enfasi iniziale era su internazionalizzazione, strutturazione, facilità di conversione, ecc. Raccoglieva in pieno l’eredità di SGML. Lo sviluppo di XML era difatti condotto da membri della comunità SGML. XML - Guido Boella

263 Motivazione (2) Nasce poi l’idea che XML possa servire per qualcosa di più: XML è (anche) un linguaggio di markup per trasferire dati: un meccanismo per convertire dati dal formato interno dell’applicazione ad un formato di trasporto, facile da convertire in altri formati interni. Non pensato per la visione umana, ma per essere prodotto ed usato da programmi. XML è un’interfaccia (Adam Bosworth): Un’interfaccia tra autore e lettore, attraverso XSL e XLink, per portare significato tra creatore ed utente Un’interfaccia tra applicazione ed applicazione, attraverso XML Schema, per esprimere contratti sui formati, e verificarne il rispetto. XML - Guido Boella

264 Motivazione (3) Tutta la faccenda del trasferimento dei dati si semplifica: i documenti strutturati e gerarchici sono un formato ragionevole di sintassi praticamente per qualunque cosa: documenti di testo, record di database, ecc. Nella W3C Note di Agosto 1999 ( "Many data-oriented applications are being defined which build their own data structures on top of an XML document layer, effectively using XML documents as a transfer mechanism for structured data; ” XML - Guido Boella

265 Validazione e buona forma
La buona forma di un documento XML è una proprietà puramente sintattica. La validazione, viceversa, è la verifica di un impegno preso sopra al formato, ad un livello già semantico: Mi impegno a scrivere dei documenti che siano formati da capitoli, ciascuno con un titolo e vari paragrafi, e ogni immagine con la sua didascalia. Per esprimere documenti di testo, i DTD probabilmente bastano, ma per esprimere blocchi di dati strutturati, è necessario un meccanismo di verifica più raffinato. XML Schema è stato pensato per fornire quel supporto di validazione che i DTD permettono solo parzialmente, in particolare sul contenuto degli elementi e degli attributi del documenti XML. XML - Guido Boella

266 XML Schema e DTD I DTD non sono espressi con XML, così da dover creare strumenti appositi per la validazione. I DTD non distinguono tra nome del tag e tipo del tag, ed hanno solo due tipi: complesso (cioè strutturato) e semplice (cioè CDATA o #PCDATA). XML Schema, invece, fornisce un set complesso di tipi, a cui i tag e il loro contenuto debbono aderire. Inoltre permette di agire in maniera obect-oriented, permettendo di ampliare i tipi disponibili e di estenderne e precisarne le proprietà. Infine, XML Schema è scritto in XML, permettendo l’uso di applicazioni XML per la verifica della validità dei dati espressi. XML - Guido Boella

267 XML Schema E’ una delle attività del working group su XML. Ha prodotto 6 generazioni di working draft, di cui l’ultima, del 7 aprile, dovrebbe essere pressoché definitiva. E’ diviso in tre parti: XML Schema Part 0: Primer (un’introduzione) XML Schema Part 1: Structures (struttura del documento XML Schema) XML Schema Part 2: Datatypes (modello dei dati e meccanismi di estensione dei tipi) Recommendation W3C prima dell’estate? XML - Guido Boella

268 Formato di un XML Schema
Un documento di XML Schema è racchiuso in un elemento <schema>, e può contenere, in varia forma ed ordine, i seguenti elementi: <import> ed <include> per inserire, in varia forma, altri frammenti di schema da altri documenti <simpleType> e <complexType> per la definizione di tipi denominati usabili in seguito <element> ed <attribute> per la definizione di elementi ed attributi globali del documento. <attributeGroup> e <group> per definire serie di attributi e gruppi di content model complessi e denominati. <notation> per definire notazioni non XML all’interno di un documento XML <annotation> per esprimere commenti per esseri umani o per applicazioni diverse dal parser di XML Schema. XML - Guido Boella

269 I tipi in XML Schema XML Schema usa i tipi per esprimere vincoli sul contenuto di elementi ed attributi. Un tipo semplice è un tipo di dati che non può contenere markup e non può avere attributi. In pratica è una sequenza di caratteri. Un tipo complesso è un tipo di dati che può contenere markup e avere attributi. Esiste un grande numero di tipi predefiniti, di tipo semplice: string, decimal, float, boolean, uriReference, date, time, ecc. Ogni tipo è caratterizzato da alcune proprietà, dette facets, che ne descrivono vincoli e formati (permessi ed obblighi). E’ data possibilità di derivare nuovi tipi, sia per restrizione che per estensione di permessi ed obblighi. XML - Guido Boella

270 Un esempio <xsi:simpleType name='bodytemp’ base='decimal'> <xsi:precision value=’3'/> <xsi:scale value='1'/> <xsi:minInclusive value=’36.5'/> <xsi:maxInclusive value=’44.0'/> </xsi:simpleType> <xsi:complexType name='name'> <xsi:element name='forename' minOccurs='0' maxOccurs='*'/> <xsi:element name='surname'/> </xsi:complexType> XML - Guido Boella

271 Facets Per ogni tipo io posso precisare dei facets, delle caratteristiche indipendenti tra di loro che specificano aspetti del tipo: length, minLength, maxLength: numero richiesto, minimo e massimo di caratteri minExclusive, minInclusive, maxExclusive, maxInclusive: valore massimo e minimo, inclusivo ed esclusivo precision, scale: numero di cifre significative e di decimali significativi pattern: espressione regolare a cui deve soddisfare il valore enumeration: lista all’interno dei quali scegliere il valore. period, duration, encoding, ecc. XML - Guido Boella

272 Derivazione di tipi I tipi possono formare un albero complesso di derivazioni, permettendo a nuovi tipi di attingere a definizioni di altri tipi. E’ possibile estendere i tipi in due maniere: Per restrizione (derivedBy=“restriction”) ad esempio specificando facets aggiuntivi. Per estensione (derivedBy=“extension”) ad esempio estendendo il content model lecito. N.B.: l’estensione non ha senso per i tipi semplici. Inoltre è possibile specificare equivalenze tra gli elementi, con l’attributo equivClass, il che permette di specificare degli elementi come totalmente sostituibili nei content model. Attenzione: elementi, non tipi! XML - Guido Boella

273 Esempi di derivazione (1)
<xsi:simpleType name='bodytemp’ base='decimal'> <xsi:precision value=’3'/> <xsi:scale value='1'/> <xsi:minInclusive value=’36.5'/> <xsi:maxInclusive value=’44.0'/> </xsi:simpleType> <xsi:simpleType name=’healthbodytemp’ base=’bodytemp'> <xsi:maxInclusive value=’37.0'/> </xsi:simpleType> XML - Guido Boella

274 Esempi di derivazione (2)
<xsi:complexType name='name'> <xsi:element name='forename' minOccurs='0' maxOccurs='*'/> <xsi:element name='surname'/> </xsi:complexType> <xsi:complexType name=’fullname’ base=“name” derivedBy=“extension”> <xsi:element name='title' minOccurs='0'/> </xsi:complexType> XML - Guido Boella

275 Tipi complessi Oltre ai facets, nella definizione di un tipo complesso debbo anche poter precisare un content model ed una serie di attributi leciti. Per questo uso gli elementi <element>, <group> e <attribute>. Questi hanno vari attributi importanti: Name: il nome del tag o dell’attributo Ref: il nome di un elemento o attributo definito altrove (globale) Type: il nome del tipo, se non esplicitato come content maxOccurs, minOccurs: il numero minimo e massimo di occurrenze Fixed, default, nullable, ecc. XML - Guido Boella

276 Content model complessi (1)
Come nei DTD si usano virgole e caret per specificare obblighi e scelte tra gli elementi di un content model complesso, così in XML schema si usano <choice> e <sequence>. Questi sostituiscono anche le parentesi. (A, B) diventa <xsi:sequence> <xsi:element name=”A” /> <xsi:element name=”B” /> </xsi:sequence> (A | B) diventa <xsi:choice> <xsi:element name=”A” /> <xsi:element name=”B” /> </xsi:choice> XML - Guido Boella

277 Content model complessi (2)
(A, ( B | C)) diventa <xsi:sequence> <xsi:element name=”A” /> <xsi:choice> <xsi:element name=”B” /> <xsi:element name=”C” /> </xsi:choice> </xsi:sequence> Il content model misto aggiunge semplicemente l’attributo content con valore “mixed”. Altri valori: elementOnly (default), empty, textOnly. (#PCDATA | B | C )* diventa <xsi:complexType content='mixed'> <xsi:element name=”B” /> <xsi:element name=”C” /> </xsi:element> XML - Guido Boella

278 Attributi La dichiarazione di attributi può avvenire con l’elemento <attribute>, dentro alla dichiarazione dell’elemento <!ELEMENT A (B,C)> <!ATTLIST A p CDATA #IMPLIED q (uno|due|tre) #IMPLIED> corrisponde a: <xsi:element name=”A”> <xsi:element name=”B” /> <xsi:element name=”C” /> <xsi:attribute name=”p” type=”xsi:string”/> <xsi:attribute name=”q"> <xsi:simpleType base="xsi:string"> <xsi:enumeration value=”uno"/> <xsi:enumeration value=”due"/> <xsi:enumeration value=”tre"/> </xsi:simpleType> </xsi:attribute> </xsi:element> XML - Guido Boella

279 Gruppi di attributi E’ anche possibile raccogliere questi attributi esternamente in un gruppo: <xsi:element name=”A”> <xsi:element name=”B” /> <xsi:element name=”C” /> <xsi:attributeGroup ref=”attrsA” /> </xsi:element> <xsi:attributeGroup name=”attrsA"> <xsi:attribute name=”p” type=”xsi:string”/> <xsi:attribute name=”q"> <xsi:simpleType base="xsi:string"> <xsi:enumeration value=”uno"/> <xsi:enumeration value=”due"/> <xsi:enumeration value=”tre"/> </xsi:simpleType> </xsi:attribute> </xsi:attributeGroup> XML - Guido Boella

280 Annotazioni Nei DTD l’unico posto dove mettere note e istruzioni di compilazione sono i commenti. Però i commenti sono a perdere: possono essere mangiati in qualunque fase dell’elaborazione. In XML Schema, invece, esiste un posto specifico dove mettere note ed istruzioni, l’elemento <annotation>. L’elemento <annotation> può contenere elementi <documentation> (pensati per essere letti da esseri umani) oppure elementi <appInfo>, pensati per essere digeriti da applicazioni specifiche <xsi:element name=’pippo'> <annotation> <documentation>elemento pippo</documentation> </annotation> <xsi:element name=“pluto” /> </xsi:element> XML - Guido Boella

281 Altri aspetti Namespace Inclusioni e importazioni Unicità e chiavi
In XML schema ogni nome definito appartiene ad un namespace specificato. I tipi estendono tipi predefiniti o definiti nello schema. In ogni caso vanno specificati con il namespace appropriato. Inclusioni e importazioni In XML Schema, esistono meccanismi per dividere lo schema in più file, o per importare definizioni appartenenti ad altri namespace. Unicità e chiavi In XML Schema, è possibile richiedere che certi valori siano unici, o che certi valori siano chiavi di riferimenti, analoghi alla coppia ID/IDREF in XML “classico”. Tuttavia, è possibile specificare pattern molto complessi come elementi chiave. XML - Guido Boella

282 Riferirsi ad uno schema
<fv:pippo xmlns:fv =“ xmlns:xsi=“ xsi:schemaLocation=“ … </fv:pippo> Con l’attributo schemaLocation dentro all’istanza del documento XML diamo un suggerimento sulla posizione dello schema al validatore (ma la stessa informazione può essere data off-line, ad esempio perché predefinita, o in un header della connessione HTTP). XML - Guido Boella

283 Conclusioni Oggi abbiamo parlato di XML Schema: Motivazioni e status
Organizzazione dei tipi Definizione di elementi ed attributi Content model, gruppi ed altri aspetti XML - Guido Boella

284 Riferimenti D.C. Fallside XML Schema Part 0: Primer, W3C Working Draft, 7 April 2000, H. S. Thompson, D. Beech, M. Maloney, N. Mendelsohn, XML Schema Part 1: Structures, W3C Working Draft 7 April 2000, P. V. Biron, A. Malhotra, XML Schema Part 2: Datatypes, W3C Working Draft 07 April 2000, Henry S. Thompson, XML Schema: An Intensive One-Day Tutorial, WWW’99 Conference, ftp://ftp.cogsci.ed.ac.uk/pub/ht/tutorials/docs/Schema%20XML99.ppt R. L. Costello, XML Schemas, XML - Guido Boella

285 XSL-FO

286 Introduzione Oggi esaminiamo in breve:
XSLFO, ovvero un vocabolario di elementi che specificano una semantica di formattazione per documenti XML. XML - Guido Boella

287 Evoluzione di XSL 27 agosto 1997: prima nota del W3C che stabilisce la filosofia generale del linguaggio. 18 agosto 1998: primo Working Draft che separa nettamente la fase di trasformazione dalla fase di visualizzazione. Cambia la sintassi. Sono introdotti i namespace. 21 aprile 1999: separazione di XSL in due Draft distinti XSLT e XSL-FO. Situazione attuale: XSLT è recommendation. XSL-FO è ancora in fase di discussione. XML - Guido Boella

288 XSL-FO Scopi del linguaggio:
definire la fase di formattazione. definire un vocabolario di elementi di formattazione indipendenti dal tipo di supporto utilizzato per l’output. Il legame tra le due definizioni è ovviamente molto stretto in quanto la fase di formattazione interpreta l’albero che risulta dall’eventuale trasformazione in base alla semantica degli oggetti di formattazione che lo costituiscono. XML - Guido Boella

289 Introduzione alla formattazione
Nell’output su supporti visuali per astrarre dal tipo di scrittura usato (ad esempio occidentale o orientale) si introduce il writing-mode che definisce: Direzioni relative (block- e inline- progression-direction) Riferimenti relativi (before, after, start o end) XML - Guido Boella

290 Fasi della formattazione
La fase di formattazione è schematizzabile in 4 passi: Trasformazione dell’albero ottenuto attraverso un’ elaborazione XSLT del documento XML iniziale in uno costituito, non da elementi e attributi, ma da oggetti di formattazione e loro proprietà. Raffinamento dell’albero degli oggetti di formattazione ovvero mapping dalle proprietà nelle caratteristiche. Costruzione dell’albero delle aree. Rendering XML - Guido Boella

291 Costruzione dell’albero dei FO (1)
XML - Guido Boella

292 Costruzione dell’albero dei FO (2)
Scelta del modello: XMLC. XML - Guido Boella

293 Raffinamento dell’albero (1)
XML - Guido Boella

294 Raffinamento (2) Valori specificati, calcolati e applicabili.
Valore in % Valore assoluto Valore espresso in unità di misura utilizzate dal supporto di output (es. pixel) Proprietà espresse in forma breve Border: “10px solid blue” Mapping di proprietà relative Border-before = border-top se writing-mode è lr-tb XML - Guido Boella

295 Costruzione albero delle aree e rendering
XML - Guido Boella

296 Modello delle aree Il modello delle aree definisce: aree rettangolari e spazi. Le aree rettangolari, generate dagli oggetti di formattazione, riservano spazio e racchiudono contenuto. Gli spazi riservano spazio prima e dopo le aree rettangolari e non hanno contenuto. XML - Guido Boella

297 Aree Rettangolari Block-area Inline-area. La loro differenza principale sta nel modo in cui normalmente il formatter le posiziona. Esse vengono tipicamente posizionate seguendo rispettivamente la block-progression-direction e la inline-progression-direction, in alcuni casi però è possibile che siano posizionate esplicitamente (ad esempio in base alle absolute-position-properties). XML - Guido Boella

298 Aree Rettangolari, caratteristiche comuni
XML - Guido Boella

299 Caratteristiche comuni (2)
Content rectangle. Padding Rectangle. Border Rectangle. Allocation Rectangle: definisce la dimensione usata per allocare spazio quando l’area viene posizionata nell’area padre. XML - Guido Boella

300 Aree Rettangolari e writing-mode
XML - Guido Boella

301 Ordinamento delle aree Rettangolari
Ci serve per definire termini come area in testa, in coda, seguente o precedente. L’ordine non è univocamente definito ma dipende dal tipo di visita che si esegue sull’albero: Previsita Postvisita XML - Guido Boella

302 Ordinamento delle aree Rettangolari (2)
L’ordine delle aree può essere definito solo per quelle aree dell’albero che in fase di posizionamento rispettano: l’annidamento definito dall’albero stesso la direzione di posizionamento dipendente dal tipo di area (block-progression-direction o inline-progression-direction). Non ne sono coinvolte ad esempio le aree posizionate in maniera assoluta, le celle di una tabella o gli elementi di una lista. In questi casi l’area si definisce out-of-sequence. XML - Guido Boella

303 Aree rettangolari consecutive
Se A e B sono block-area non out-of-sequence si dice che A precede consecutivamente B (o B segue consecutivamente A) se: A precede B e non esistono aree non out-of-sequence tra A e B. Tutti gli antenati di A che precedono B hanno border-after e padding-after nullo. Tutti gli antenati di B che seguono A hanno border-before e padding-before nullo. La stessa definizione vale per le inline-area con la differenza che devono essere nulli border-, paddind-end e border-, padding-start. XML - Guido Boella

304 Aree consecutive (2) Se A e B sono block-area non out-of-sequence si dice che A è in testa a B se: A è il primo figlio di B. A è il primo figlio di C, C è in testa a B ed ha border- e padding-before nulli. Se A e B sono block-area non out-of-sequence si dice che A è in coda a B se: A è l’ultimo figlio di B. A è l’ultimo figlio di C, C è in coda a B ed ha border- e padding-after nulli. In entrambi i casi A e B sono considerate consecutive. XML - Guido Boella

305 Aree Rettangolari adiacenti
XML - Guido Boella

306 Spazi Gli spazi riservano spazio prima e dopo le aree rettangolari e non hanno contenuto. Essi vengono definiti attraverso un tipo di dato composto dalle seguenti informazioni: Space.minimum Space.maximum Space.optimum Space.conditionality Space.precedence In generale gli stessi formatting-object che generano aree rettangolari generano gli spazi ad esse associati. XML - Guido Boella

307 Regole di risoluzione degli spazi (1)
Dato uno spazio S, per calcolare il suo corrispondente spazio risolto, è necessario considerare la massima sequenza di spazi consecutivi contenenti S. Gli spazi sono consecutivi quando sono associati ad aree consecutive. XML - Guido Boella

308 Regole di risoluzione degli spazi (2)
Regola 1 Se qualcuno degli spazi nella sequenza è conditional ed è in testa ad una reference-area o line-area, allora tale spazio sarà soppresso. Tutti gli spazi conditional che lo seguono consecutivamente saranno altresì soppressi. Lo stesso dicasi per gli spazi conditional in coda ad una reference-area o line-area. XML - Guido Boella

309 Regole di risoluzione degli spazi (3)
Regola 2 Se qualcuno degli spazi rimanenti e forcing allora ogni spazio non forcing è soppresso dalla sequenza. In questo caso lo spazio risultante avrà le dimensioni optimum, minimum e maximum pari alla somma dei valori corrispondenti di ogni spazio rimasto nella sequenza. Tale spazio sarà non conditional. XML - Guido Boella

310 Regole di risoluzione degli spazi (4)
Regola 3 Se tutti gli spazi sono non forcing saranno selezionati gli spazi con valore precedence più alto e a parità di questo con più grande valore optimum tutti gli altri spazi saranno soppressi dalla sequenza. A questo punto se rimane un solo spazio nella sequenza esso sarà preso come spazio risultante. Altrimenti il risultato sarà un nuovo spazio con valori: optimum pari al valore comune, minimum pari al più grande dei valori minimi e maximum pari al più piccolo dei valori massimi. Tale spazio sarà non conditional. XML - Guido Boella

311 Esempio XML - Guido Boella

312 Tipi particolari di block-area
Reference-area Page-area Line-area XML - Guido Boella

313 Posizionamento delle block-area
Data un’area P i cui figli sono block-area, gli elementi in P si dicono propriamente posizionati se: Per ogni block-area B figlia di P sia ha che: I lati before e after dell’allocation-rectangle di B devono essere paralleli ai corrispondenti lati del content-rectangle di P. I lati start e end di B sono paralleli e coincidenti con i corrispondenti lati del content-rectangle dell’area P. Per ogni coppia di aree B e B’ figlie di P, la distanza tra esse (ovviamente nella block-progression-direction) è definita applicando le regole di risoluzione alla massima sequenza di spazi tra B e B’. XML - Guido Boella

314 Tipi particolari di inline-area
Reference-area Glyph-area XML - Guido Boella

315 Posizionamento delle inline-area
Data un’area P i cui figli sono inline-area, gli elementi in P si dicono propriamente posizionati se le seguenti condizioni sono verificate: Per ogni inline-area I in P, i lati start, end, after e before dell’allocation-rectangle di I sono paralleli ai corrispondenti lati del content-rectangle dell’area P. Per ogni coppia di aree I e I’ in P, la distanza tra esse (ovviamente nella inline-progression-direction) è definita applicando le regole di risoluzione alla massima sequenza di spazi tra I e I’. XML - Guido Boella

316 Viewport Ci sono situazioni in cui il contenuto di un’area non viene completamente visualizzato. Questo può accadere se tale contenuto genera un overflow e l’area che lo contiene ha la proprietà overflow uguale a hidden. Un altro caso può verificarsi se il designer riduce la zona visibile di un’area attraverso la proprietà clip. Date queste situazioni si definisce viewport la zona visibile di un area, ad esempio page-viewport-area o block-viewport-area. XML - Guido Boella

317 Esempio di albero delle aree
XML - Guido Boella

318 I formatting-object Ci sono tre tipi di formatting-object: quelli che generano aree, quelli che restituiscono aree modificandone eventualmente le caratteristiche e quelli usati da altri formatting-object per generare aree. I primi due tipi sono comunemente chiamati flow-object , il terzo tipo può essere detto layout-object o auxiliary-object. XML - Guido Boella

319 FO di impaginazione e layout
Permettono di definire sia la struttura di layout di una pagina o frame (dimensioni e posizione del body e sua eventuale suddivisione in colonne, header, footer, side-bar) sia le regole attraverso cui il contenuto XML di partenza è sistemato in questi contenitori attraverso: fo:simple-page-master fo:page-sequence XML - Guido Boella

320 Block-level FO Sono generalmente usati per la formattazione di titoli, paragrafi, didascalie di immagini, tabelle o liste. Generano block-area XML - Guido Boella

321 Esempio di Block-level FO
<xsl:template match="chapter"> <fo:block break-before="page"> <xsl:apply-templates/> </fo:block> </xsl:template> <xsl:template match="chapter/title"> <fo:block text-align="center" space-after="8pt" space-before="16pt" space-after.precedence="3"> XML - Guido Boella

322 Inline-level FO Il loro utilizzo più comune è per la gestione di immagini, la formattazione di elementi all’interno di linee come ad esempio assegnare bordi colorati a caratteri o parole e la formattazione di elementi di link. XML - Guido Boella

323 Esempio di Inline-level FO
<xsl:template match="p"> <fo:block> <fo:initial-property-set font-variant="small-caps"/> <xsl:apply-templates/> </fo:block> </xsl:template> XML - Guido Boella

324 Altri FO fo:wrapper Permette di attribuire un set di proprietà a tutti i suoi elementi figli. Utilizzo classico: <fo:wrapper font-style=“italic”> Testo in stile corsivo </fo:wrapper> XML - Guido Boella

325 Proprietà dei FO Absolute properties Aural properties
Border, padding and background properties Font properties Hyphenation properties Keeps and Break properties Margin properties block Margin properties inline XML - Guido Boella

326 Proprietà dei FO (2) Pagination and layout properties Table properties
Character properties Link properties Miscellaneous properties XML - Guido Boella

327 XSLFO e CSS I FO sono nati per essere applicati ad elementi privi di semantica, i CSS per essere applicati ad elementi HTML. I FO hanno introdotto un complesso meccanismo di impaginazione. I CSS nascono per la visualizzazione sul web. I FO hanno esteso i meccanismi di internazionalizzazione. XML - Guido Boella

328 Implementazioni esistenti
FOP James Tauber INDelv REXP Reperibili anche al sito XML - Guido Boella

329 XMLCFO Implementazione Java dei fo block-level e inline-level basata su displet. Amplia le caratteristiche delle tabelle e introduce la gestione per la sovrapposizione disgiunta di aree. Tratta le immagini sia a livello inline che di blocco. Non splitta ogni carattere ma delega gli oggetti fo:block e fo:inline alla gestione del testo. XML - Guido Boella

330 <?xml version='1.0' encoding='utf-8'?>
<!-- 'Chapter_03_01.xml' --> <Toysco xml:base=' xmlns:Addr='urn:ProXML2e: xmlns:Inv='urn:ProXML2e: xmlns:Per='urn:ProXML2e: xmlns='urn:ProXML2e: > <!-- Customers --> <Customer customerID='CU02'> <Per:Name> <Per:FirstName>Buffy</Per:FirstName> <Per:LastName>Summers</Per:LastName> </Per:Name> <Addr:BillingAddress> <Addr:Street>1630 Matilda Drive</Addr:Street> <Addr:City>Sunnyvale</Addr:City> <Addr:State>CA</Addr:State> <Addr:Zip>94086</Addr:Zip> <Addr:Country>USA</Addr:Country> </Addr:BillingAddress> <ContactDetails> <Phone phonetype='HOME'>408/ </Phone> <Phone phonetype='WORK'>650/ </Phone> </ContactDetails> </Customer> <Customer customerID='CU03'> <Per:FirstName>Willow</Per:FirstName> <Per:LastName>Rosenberg</Per:LastName> <Addr:Street>Fiend House</Addr:Street> <Addr:Street>23 University Ave</Addr:Street> <Customer customerID='CU04'> <Per:FirstName>Riley</Per:FirstName> <Per:LastName>Finn</Per:LastName> <Addr:MailingAddress> <Addr:Street>Spawn House</Addr:Street> <Addr:Street>25 University Ave</Addr:Street> </Addr:MailingAddress> <Phone phonetype='WORK'> </Phone> <Phone phonetype='CELL'> </Phone> <Customer customerID='CU05'> <Per:FirstName>Angel</Per:FirstName> <Per:LastName>Forgotten</Per:LastName> <Addr:Street>12345 Mullholland Drive</Addr:Street> <Addr:City>Los Angeles</Addr:City> <Addr:Zip>90666</Addr:Zip> <Phone phonetype='CELL'> </Phone> <Phone phonetype='WORK'> </Phone> <Customer customerID='CU06'> <Per:FirstName>Andy</Per:FirstName> <Per:LastName>DuFresne</Per:LastName> <Addr:Street>1 Prison Road</Addr:Street> <Addr:City>Bangor</Addr:City> <Addr:State>ME</Addr:State> <Addr:Zip>03533</Addr:Zip> <Addr:Street>34 Old Address</Addr:Street> <Phone phonetype='WORK'>55555</Phone> <!-- Products --> <Product productID='GH4544' hire='false' > <Inv:Name>Public Grokker</Inv:Name> <Inv:Description xmlns=' xml:lang='en' > <html> <head><title>Toysco Product Description</title></head> <body> <h1>Public Grokker</h1> <p>Allows grokking of a scale never before witnessed</p> </body> </html> </Inv:Description> <Price currency='USD'>9.99</Price> <Units>2</Units> <Stock>48</Stock> </Product> <Product productID='FG5645' hire='false' > <Inv:Name>Quake III</Inv:Name> <h1>Quake III</h1> <p>Great Game, Great Price</p> <Price currency='USD'>29.99</Price> <Units>1</Units> <Stock>99</Stock> <Product productID='ST4545' hire='false' > <Inv:Name>Hardwood Stake</Inv:Name> <h1>Hardwood Stake</h1> <p>Allows slaying of a hitherto unheard of scale</p> <Price currency='USD'>5.00</Price> <Units>5</Units> <Stock>540</Stock> <Product productID='SP4544' hire='true' > <Inv:Name>Spell Book</Inv:Name> <h1>Spell Book</h1> <p>All the best spells, including how to counter vengeance demons</p> <Price currency='USD'>19.99</Price> <Stock>58</Stock> <Product productID='BL4123' hire='false' > <Inv:Name>Blood Ball</Inv:Name> <h1>Blood Ball</h1> <p>Pretend blood squirts out when bitten on</p> <Price currency='USD'>40.00</Price> <Units>3</Units> <Stock>75</Stock> <Product productID='CV4533' hire='false' picture='prod.CV4533.png' > <Inv:Name>Scrabble</Inv:Name> <h1>Scrabble</h1> <p>The world&apos;s favorite word board game</p> <Price currency='USD'>24.99</Price> <Stock>31</Stock> <Product productID='SC4323' hire='false' picture='prod.SC4323.png' > <Inv:Name>Chess set</Inv:Name> <h1>Toysco Chess set</h1> <p>Beautiful ornate pieces, and an elegant inlaid board</p> <Price>9.99</Price> <Stock>45</Stock> <!-- Invoices --> <Invoice invoiceID='TC3422' customerID='CU06' date=' ' terms='Monthly' paid='false' > <InvoiceOrder productID='SC4323' units='1' /> </Invoice> <Invoice invoiceID='TC1232' customerID='CU04' date=' ' terms='Immediate' paid='true' > <InvoiceOrder invoiceID='TC1232' productID='CV4533' units='1' notes='Please pack carefully' /> <InvoiceOrder invoiceID='TC1232' productID='BL4123' units='3' /> <Invoice invoiceID='TC4543' customerID='CU03' date=' ' <InvoiceOrder productID='SP4544' units='1' /> <InvoiceOrder productID='ST4545' units='10' /> <Invoice invoiceID='TC2787' customerID='CU02' date=' ' <InvoiceOrder productID='CV4533' units='1' /> <InvoiceOrder productID='BL4123' units='10' /> </Toysco> <!-- End of 'Chapter_03_01.xml' --> XML - Guido Boella

331 <!ENTITY copy "©" >
<?xml version='1.0' ?> <!DOCTYPE Invoice [ <!ENTITY copy "©" > <!ENTITY Vendor "Toysco Inc. Ltd." > <!ENTITY Disclaimer "No warranty! © 2001 &Vendor;" > <!ELEMENT Invoice (Notice?) > <!ATTLIST Invoice name CDATA #REQUIRED > <!ELEMENT Notice (#PCDATA) > ]> <Invoice name="&Vendor;"> <Notice>&Disclaimer;</Notice> </Invoice> XML - Guido Boella

332 <!ENTITY copy "©" >
<?xml version='1.0' ?> <!DOCTYPE Invoice [ <!ENTITY copy "©" > <!ENTITY Vendor "Toysco Inc. Ltd." > <!ENTITY Disclaimer SYSTEM "ProXML2e.Disclaimer.txt" > <!ELEMENT Invoice (Notice?) > <!ATTLIST Invoice name CDATA #REQUIRED > <!ELEMENT Notice (#PCDATA) > ]> <Invoice name="&Vendor;"> <Notice>&Disclaimer;</Notice> </Invoice> XML - Guido Boella

333 <?xml version = "1.0" encoding = "UTF-8"?>
<!-- Conforms to w3c --> <xsd:schema xmlns:xsd = " targetNamepsace = " xmlns:tc = " > <xsd:annotation> <xsd:documentation>The toysco element is the root element of a document instance containing the daily summary info of sales from toysco. It contains three child elements: customer, product, and invoice. There is a relationship between customer details and orders to save repeating customer details should they place more than one order. </xsd:documentation> </xsd:annotation> <xsd:element name = "toysco"> <xsd:complexType> <xsd:sequence> <xsd:element ref = "customer" minOccurs = "1" maxOccurs = "unbounded"/> <xsd:element ref = "product" <xsd:element ref = "invoice" </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:documentation>The customer element contains four child elements: name (required), deliveryAddress, billingAddress(required), and contactDetails(required).</xsd:documentation> <xsd:element name = "customer"> <xsd:element name = "name"> <xsd:attribute name = "firstName" use = "required" type = "limitedString"/> <xsd:attribute name = "lastName" use = "required" <xsd:element name = "deliveryAddress" type="addressType" minOccurs = "1" maxOccurs = "unbounded" > <xsd:attribute name = "addressID" type = "xsd:ID" /> <xsd:element name = "billingAddress" type="addressType" /> <xsd:element name = "contactDetails"> <xsd:element name = " " type = "limitedString" /> <xsd:element name = "homePhone" type = "xsd:integer" /> <xsd:element name = "workPhone" type = "xsd:integer" /> <xsd:element name = "cellPhone" type = "xsd:integer" /> <xsd:element name = "fax" type = "xsd:integer" /> <xsd:attribute name = "customerID" use = "required" type = "xsd:ID"/> <xsd:unique name = "uniqueCustomerKey"> <xsd:selector xpath = "tc:customer" /> <xsd:field xpath = /> </xsd:unique> <xsd:key name = "customerKey"> </xsd:key> <xsd:complexType name = "addressType"> <xsd:element name = "Street" type = "limitedString"/> <xsd:element name = "City" type = "limitedString"/> <xsd:element name = "State" type = "limitedString"/> <xsd:element name = "Zip" type = "limitedString"/> <xsd:documentation>The product element is a single element with seven attributes that hold the details of the each product sold that month.</xsd:documentation> <xsd:element name = "product"> <xsd:attribute name = "productID" use = "required" type = "xsd:ID"/> <xsd:attribute name = "name" use = "required" type = "xsd:string"/> <xsd:attribute name = "description" use = "required" type = "xsd:string"/> <xsd:attribute name = "unit" type = "xsd:positiveInteger"/> <xsd:attribute name = "price" use = "required" type = "xsd:decimal"/> <xsd:documentation>The invoice element holds details of each individual invoice that is made for the day. It holds a repeatable lineItem element and eight attributes. <xsd:element name = "invoice"> <xsd:element name = "lineItem" minOccurs = "1" maxOccurs = "unbounded"> <xsd:attribute name = "productIDref" use = "required" type = "xsd:IDREF"/> <xsd:attribute name = "units" use = "required" type = "xsd:byte"/> <xsd:attribute name = "price" use = "required" type = "xsd:decimal"/> <xsd:attribute name = "invoiceID" use = "required" type = "xsd:ID"/> <xsd:attribute name = "customerRef" use = "required" /> <xsd:attribute name = "date" use = "required" type = "xsd:date"/> <xsd:attribute name = "notes" type = "xsd:string"/> <xsd:attribute name = "paymentTerms" type = "paymentOptions" /> <xsd:attribute name = "paid" use = "required" type = "xsd:boolean"/> <xsd:attribute name = "deliverTo" use = "required" <xsd:keyref name = "customerRef" ref = "customerKey"> <xsd:selector xpath = "tc:invoice" /> <xsd:field xpath = /> </xsd:keyref> <xsd:simpleType name = "limitedString"> <xsd:restriction base = "string"> <xsd:maxLength value = "100" /> </xsd:restriction> </xsd:simpleType> <xsd:simpleType name = "paymentOptions"> <xsd:enumeration value = "cashOnDelivery" /> <xsd:enumeration value = "30dayCredit" /> <xsd:enumeration value = "90dayCredit" /> </xsd:schema> XML - Guido Boella

334 XML-Namespace Nella visione XML, i tipi di documenti si mescolano e si fondono tra loro in maniera complessa. Lo stesso documento potrebbe avere alcuni elementi definiti in un tipo ed altri in un altro. Un esempio comune è un documento XML di valori di borsa che adopera i tag di HTML per definire gli elementi di testo, ed un insieme di tag specifico per gli elementi di borsa. I problemi sono conciliare la presenza di elementi non definiti nel l’uno nel set di tag dell’altro, e soprattutto conciliare la presenza di elementi definiti con lo stesso nome in entrambi i set. I namespace in XML si propongono per risolvere questi problemi. XML-Namespaces è una recommendation di W3C del 1999. XML - Guido Boella

335 Uso dei namespace Ogni nome (elementi, attributi, entità, ecc.) del documento XML è preceduto da un prefisso che specifica l’origine del nome stesso. Il prefisso è separato da il carattere ‘:’ dal nome dell’elemento o dell’attributo. Poiché ogni namespace userà un prefisso diverso,è possibile capire quali elementi appartengono all’uno e all’altro, e di evitare qualunque problema di collisione. L’attributo predefinito “xmlns” serve per introdurre i prefissi usati dai namespace del documento. Il valore dell’attributo è un URI che non ha nessun valore dichiarativo, ma solo informativo. Un nome (di elemento o di attributo) che contiene prefisso di namespace e nome locale viene detto “nome qualificato”. XML - Guido Boella

336 Namespace di default Nella dichiarazione xmlns si pone il nome del prefisso che si intende usare nel corso del documento per gli elementi definiti in quel namespace. L’assenza di tale prefisso in xmlns indica la presenza di un namespace di default, per cui tutti i nomi privi di prefisso di debbono intendere appartenenti a quel namespace. I namespace di default non si applicano agli attributi XML - Guido Boella

337 Default NS: precisazioni
La dichiarazione di namespace può essere fatta ovunque, e ha scope solo all’interno del’elemento in cui è stata fatta. Possono essere fatte più definizioni di namespace di default, quella interna ha ovviamente precedenza: <?xml version="1.0"?> <!-- il default namespace e’ "books" --> <book xmlns='urn:loc.gov:books' xmlns:isbn='urn:ISBN: '> <title>Cheaper by the Dozen</title> <isbn:number> </isbn:number> <notes> <!-- Adesso diventa HTML --> <p xmlns='urn:w3-org-ns:HTML'> This is a <i>funny</i> book! </p> </notes> </book> XML - Guido Boella

338 XMLDOM ASP parla XML

339 XMLDOM Asp offre una serie di metodi per gestire file XML
Il contenuto di un file XML diventa un oggetto di ASP e non solo una stringa di caratteri I recordset di un database possono essere trasformati in un file XML Necessari IE5, IIS5 con ADO2.5 per piena funzionalità XML - Guido Boella

340 ESEMPIO DTD <!ELEMENT Team (Manager , Members , Person+ )>
<!ATTLIST Team project ID #REQUIRED > <!ELEMENT Manager EMPTY> <!ATTLIST Manager person IDREF #REQUIRED > <!ELEMENT Members EMPTY> <!ATTLIST Members people IDREFS #REQUIRED > <!ELEMENT Person (Name )> <!ATTLIST Person sn ID #REQUIRED > <!ELEMENT Name (First , Last )> <!ELEMENT First (#PCDATA )> <!ELEMENT Last (#PCDATA )> XML - Guido Boella

341 ESEMPIO XML <?xml version="1.0"?><!DOCTYPE Team SYSTEM "team.dtd"> <Team project="a134"> <Manager person="a1"/> <Members people="b1 c2 c9"/> <Person sn="a1"> <Name> <First>John</First> <Last>Doe</Last> </Name> </Person> <Person sn="b1"> <First>Dudley</First> <Last>Doright</Last> </Person></Team> XML - Guido Boella

342 ESEMPIO XML con XSL <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="stylecontacts.xsl" ?> <CONTACT_INFO> <BUSINESS><CONTACT> <NAME>John Doe</NAME> <PHONE> </PHONE></CONTACT> </BUSINESS> <PERSONAL><CONTACT relation="family"> <NAME>Mary Jones</NAME> <PHONE> </PHONE></CONTACT> <CONTACT> <NAME>Mike Wilson</NAME> <PHONE> </PHONE></CONTACT> </PERSONAL></CONTACT_INFO> XML - Guido Boella

343 <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/"> <HTML> <BODY> <xsl:apply-templates /> </BODY></HTML> </xsl:template> XML - Guido Boella

344 PROVA DI STYLESHEETS <xsl:template match="CONTACT_INFO">
<xsl:for-each select="./*"> <xsl:choose> <xsl:when test="[!nodeName()='PERSONAL']"> <DIV STYLE="background-color:teal;"> Personal Contacts </DIV> </xsl:when> <xsl:otherwise> <DIV STYLE="background-color:black;"> Business Contacts</DIV> </xsl:otherwise></xsl:choose> <xsl:apply-templates /><P/></xsl:for-each> </xsl:template> PROVA DI STYLESHEETS XML - Guido Boella

345 <xsl:template match="CONTACT"> <xsl:for-each select=".">
<DIV> <xsl:if = 'family']"> <xsl:attribute name="STYLE">font-weight:bold</xsl:attribute> </xsl:if> <xsl:value-of select="NAME"/> <DIV STYLE="font-size:10pt;left:.25cm;position:relative;"> <xsl:value-of select="PHONE"/> </DIV> </xsl:for-each> </xsl:template> </xsl:stylesheet> XML - Guido Boella

346 NUOVO STYLESHEET <xsl:stylesheet xmlns:xsl=" <xsl:template match="/">Traduzione root element<br/> Elenco contatti: <xsl:apply-templates select="*" /></xsl:template> <xsl:template match="PERSONAL"> <xsl:apply-templates select="*" /> </xsl:template> <xsl:template match="CONTACT"><A> <xsl:attribute name="href">chiama.asp?<xsl:value-of select="./PHONE"> </xsl:value-of>"</xsl:attribute></A><br/> <xsl:value-of select="./NAME"></xsl:value-of> <xsl:value-of </xsl:template></xsl:stylesheet> XML - Guido Boella

347 XML DOM e ASP Il modello ad oggetti DOM permette di vedere un documento XML come una struttura dati di un linguaggio di programmazione (API) Il parser XML è il programma che permette di caricare il file XML, verificare la sua corrispondenza con il DTD e creare la struttura dati manipolabile da XML XML - Guido Boella

348 Traduzione tramite XSL in ASP sul server
La struttura dati è un albero dove la radice è la root del documento XML: / Comandi di ASP (ma anche Jscript o PHP4) permettono di accedere o modificare la struttura dati Traduzione tramite XSL in ASP sul server Creazione oggetto XML: Set source = Server.CreateObject("Microsoft.XMLDOM") source.async = false source.validateOnParse= true 'non necessario: è default Caricamento file source.load(sourceFile) XML - Guido Boella

349 APPLICAZIONE STILE ON SERVER
Language=VBScript %> (ON CLIENT) <% sourceFile = Request.ServerVariables("APPL_PHYSICAL_PATH") + "\Chapter 08\contacts_basic.xml" styleFile = Request.ServerVariables("APPL_PHYSICAL_PATH") + "\Chapter 08\stylecontacts_basic.xsl" Set source = Server.CreateObject("Microsoft.XMLDOM") source.async = false source.load(sourceFile) Set style = Server.CreateObject("Microsoft.XMLDOM") style.async = false style.load(styleFile) Response.Write(source.transformNode(style)) %> XML - Guido Boella

350 <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> <TITLE></TITLE> </HEAD> <BODY> <XML id="XMLdoc"> <CONTACT_INFO> <BUSINESS> <CONTACT> <NAME>John Doe</NAME> <PHONE> </PHONE> </CONTACT> </BUSINESS> <PERSONAL> <CONTACT relation="family"> <NAME>Mary Jones</NAME> <PHONE> </PHONE> <NAME>Mike Wilson</NAME> <PHONE> </PHONE> </PERSONAL> </CONTACT_INFO> </XML> <XML id="XSLstylesheet"> <xsl:stylesheet xmlns:xsl=" <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="/CONTACT_INFO"> </BODY> </HTML> <xsl:template match="CONTACT_INFO"> <xsl:for-each select="./*"> <xsl:choose> <xsl:when test=".[.!nodeName()='PERSONAL']"> <DIV STYLE="background-color:teal; color:white; font-family:Verdana,arial,helvetica,sans-serif; font-size:12pt; padding:2px"> Personal Contacts</DIV> </xsl:when> <xsl:otherwise> <DIV STYLE="background-color:black; color:white; font-family:Verdana,arial,helvetica,sans-serif; font-size:12pt; padding:2px"> Business Contacts</DIV> </xsl:otherwise> </xsl:choose> <xsl:for-each select="./CONTACT" order-by = "+ NAME"> <DIV> <xsl:if = 'family']"> <xsl:attribute name="STYLE">font-weight:bold</xsl:attribute> </xsl:if> <DIV cursor="hand" onclick="DoSort('NAME')"> <xsl:value-of select="NAME"/> </DIV> <DIV onclick="DoSort('PHONE')" STYLE="font-size:10pt;left:.25cm;position:relative;"> <xsl:value-of select="PHONE"/> </xsl:for-each> <P/> </xsl:stylesheet> <DIV id="displayarea"/> <SCRIPT language="Javascript"> <!-- var display = document.all("displayarea"); display.innerHTML= XMLdoc.documentElement.transformNode(XSLstylesheet.documentElement); function DoSort(sortParm) { var sortAttr = sortAttr.value = sortParm; } //--> </SCRIPT> XML - Guido Boella

351 Compatibilità con vecchi browser
Language="JavaScript" %><% var userAgent = new String(Request.ServerVariables("HTTP_USER_AGENT")); if (userAgent.indexOf("MSIE 5") >= 0) Response.Redirect("contacts.xml"); else Response.Write(OnServer()); function OnServer() { var doc, stylesheet; doc = Server.CreateObject("microsoft.xmldom"); stylesheet = Server.CreateObject("microsoft.xmldom"); if (doc != null && stylesheet != null){ doc.load(Server.MapPath("contacts.xml")); stylesheet.load(Server.MapPath("stylecontacts.xsl")); … XML - Guido Boella

352 authors author author name id name id
<authors> <author> <name>Graham Greene</name> <id> </id> </author> <author> <name>James Joyce</name> <id> </id> </author> </authors> authors author author name id name id XML - Guido Boella

353 documentelement authors lastchild firstchild childNodes author author
parentNode firstchild name id name id nextSibling previousSibling XML - Guido Boella

354 authors author name id documentelement.firtchild author (1) documentelement.childnodes.item(1) author (1) documentelement.firtchild.parentNode document namednodemap("name").item(1) name (1) documenteelement.firtchild.firstchild.text G. Greene documentelement.firtchild.nextsibling author (2) documentelement.lastchild.previousSibling author (1) XML - Guido Boella

355 Accesso a documento XML
Creazione oggetto set objXML = Server.CreateObject("Microsoft.XMLDOM") oppure Microsoft.FreeThreadedXMLDOM in global.asa come variabile di applicazione ATTENZIONE: bisogna fare riferimento alla libreria giusta <!-- METADATA TYPE="typelib"FILE="c:\Progammi\file comuni\system\msxml.dll" --> Caricamento oggetto da file: objXML.load(strSourceFile) e.g. strSourceFile = server.MapPath("asp") & "\file.xml" Selezione di un nodo: set objColor = objXML.selectSingleNode("color") restituisce un oggetto node XML - Guido Boella

356 Esempi <XML attributo1="valore1" attributo2="valore2">
<Team project="a134"> <Manager person="a1"/> <Members people="b1 c2 c9"> <Person sn="a1"> <Name> <First>John</First><Last>Doe</Last></Name> </Person> <Person sn="b1"> <First>Dudley</First><Last>Doright</Last></Name> </Person></Members></Team> </XML> XML - Guido Boella

357 Conteggio nodi XML <% var nodes = 0;
var doc = new ActiveXObject("microsoft.xmldom"); doc.async = false; doc.load(Server.MapPath("menu.xml")); if (doc.readyState == 4 && doc.parseError.errorCode == 0) {Traverse(doc.documentElement); Response.Write("Nodes in the DOM for menu.xml: " + nodes);} else Response.Write("Error: " + doc.parseError.reason); doc = null; function Traverse(node){ nodes += 1; if (node.attributes != null) nodes += node.attributes.length; for (var i = 0; i < node.childNodes.length; i++) Traverse(node.childNodes(i));} %> XML - Guido Boella

358 <au_id>172-32-1176</au_id>
<Authors> <Author> <au_id> </au_id> <au_lname>White</au_lname> <au_fname>Johnson</au_fname> <phone> </phone> <address>10932 Bigge Rd.</address> </Author> <au_id> </au_id> <au_lname>Green</au_lname> <au_fname>Marjorie</au_fname> <phone> </phone> <address>309 63rd St. #411</address> </Author></Authors> XML - Guido Boella

359 <s:Schema id="RowsetSchema">
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <s:Schema id="RowsetSchema"> <s:ElementType name="row" content="eltOnly"> <s:AttributeType name="au_id" rs:number="1" rs:writeunknown="true"> <s:datatype dt:type="string" dt:maxLength="11" rs:maybenull="false" /> </s:AttributeType> <s:AttributeType name="au_lname" rs:number="2" rs:writeunknown="true"> <s:datatype dt:type="string" dt:maxLength="40" rs:maybenull="false" /> <s:AttributeType name="au_fname" rs:number="3" rs:writeunknown="true"> <s:datatype dt:type="string" dt:maxLength="20" rs:maybenull="false" /> ... <s:extends type="rs:rowbase" /> </s:ElementType> </s:Schema> XML - Guido Boella

360 XML e XSL <rs:data>
<z:row au_id=" " au_lname="White" au_fname="Johnson" phone=" " address="10932 Bigge Rd." city="Menlo Park" state="CA" zip="94025" contract="True" /> <z:row au_id=" " au_lname="Green" au_fname="Marjorie" phone=" " address="309 63rd St. #411" city="Oakland" state="CA" zip="94618" contract="True" /> <z:row au_id=" " au_lname="Carson" au_fname="Cheryl" phone=" " address="589 Darwin Ln." city="Berkeley" state="CA" zip="94705" contract="True" /> <z:row au_id=" " au_lname="O'Leary" au_fname="Michael" phone=" " address="22 Cleveland Av. #14" city="San Jose" state="CA" zip="95128" contract="True" /> <z:row au_id=" " au_lname="Straight" au_fname="Dean" phone=" " address="5420 College Av." city="Oakland" state="CA" zip="94609" contract="True" /> </rs:data> </xml> XML - Guido Boella

361 Salvare recordset in XML
<% strsql = request.querystring("sql") if NOT strsql="" then strFile="c:\asp\file2.xml" Set rsAuthors = Server.CreateObject("ADODB.Recordset") Set objFSO = CreateObject("Scripting.FileSystemObject") if objFSO.FileExists(strFile) then objFSO.deletefile strFile end if set objFSO = nothing XML - Guido Boella

362 .save strFile, 1 'adPersistent .close() end if End with
With rsAuthors .Open strsql, "Driver={Microsoft Access Driver (*.mdb)}; DBQ=c:\asp\Pro ASP 3.0\pubs.mdb" If (.state = 1) then .save strFile, 1 'adPersistent .close() end if End with Set objFSO = CreateObject("Scripting.FileSystemObject") set objFile = objFSO.getFile(strFile) set objStream = objFile.openAsTextStream() response.write "<textarea>"& objStream.readAll()&"</textarea>" objFile.close XML - Guido Boella

363 XML da DB <?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="contatti1.xsl" ?> <rs:data xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema"> <z:row au_id=" " au_lname="White" au_fname="Johnson" phone=" " address="10932 Bigge Rd." city="Menlo Park" state="CA" zip="94025" contract="True" /> <z:row au_id=" " au_lname="Green" au_fname="Marjorie" phone=" " address="309 63rd St. #411" city="Oakland" state="CA" zip="94618" contract="True" /> <z:row au_id=" " au_lname="Carson" au_fname="Cheryl" phone=" " address="589 Darwin Ln." city="Berkeley" state="CA" zip="94705" contract="True" /> </rs:data> XML - Guido Boella

364 XSL per XML e DB <xsl:stylesheet xmlns:xsl=" <xsl:template match="/">Traduzione root element<br/> Elenco contatti: <xsl:apply-templates select="*" /></xsl:template> <xsl:template match="rs:data"><xsl:apply-templates select="*" /></xsl:template> <xsl:template match="z:row"><A> <xsl:attribute name="href">chiama.asp?<xsl:value-of </xsl:value-of>"</xsl:attribute></A><br/> <xsl:value-of <xsl:value-of </xsl:template></xsl:stylesheet> XML - Guido Boella

365 Extensible Stylesheet Language (XSL) Specification, W3C Working Draft,
Bibliografia Extensible Markup Language (XML) 1.0, W3C Recommendation 10 February 1998, Extensible Stylesheet Language (XSL) Specification, W3C Working Draft, Extensible Linking Language (XLL), W3C Working Draft, XML-Data Specification, W3C Recommendation, XML Namespace, W3C Working Draft, Synchronized Multimedia Integration Language (SMIL) 1.0 Specification, W3C Recommendation, XML in Action, William J.Pardi - Microsoft. XML Le Basi, Simon St.Laurent - Tecniche Nuove. Un sito interamente dedicato ad XML, L’università di XML, Il sito della Microsoft su XML, Prime informazioni, approfondimenti, domande, Software XML, Il consorzio W3C, Un enorme elenco di link a risorse relative a XML, Il sito di un noto esperto, Robin Cover, Le FAQ (Frequented Ask Question) dei membri dell’XML W3C, Interessante corso sull'XML sviluppato da tre studenti milanesi, Il newsgroup msnews.microsoft.com della Microsoft dedicato a XML, microsoft.public.xml. T. Bray, D. Hollander, A. Layman, Namespaces in XML, W3C Recommendation, 14 January 1999, T. Bray, XML Namespaces by Example, J. Clark, XML Namespaces, XML - Guido Boella

366 Neil Bradley, The XML companion, Addison Wesley 1998
Altri testi: Neil Bradley, The XML companion, Addison Wesley 1998 J. Bosak, XML, Java, and the future of the Web, T. Bray, J. Paoli, C.M. Sperberg-McQueen, Extensible Markup Language (XML) 1.0, W3C Recommendation, 10 February 1998, T. Bray, The annotated XML Specification,1998, XMLNews Specifications, XML - Guido Boella

367 In HTML... VEDI <html>
<head><title>agenda</title></head> <body bgcolor=”white"> <h1>Curriculum vitae</H1> <B><I>Nome</B> Cognome</I> <P>Indirizzo<br> via/corso numero<br> città <P>Dati personali </body> </html> VEDI XML - Guido Boella

368 La Banca ricorrente è proprietaria di un immobile sito in Siracusa, piazza Archimede, sede degli uffici della Banca, che è stato considerato dal Comune di come edificio di interesse storico e monumentale ed inserito nel piano particolareggiato di recupero del centro storico di Ortigia adottato con delibera consiliare del 30 aprile 1988 e approvato con decreto regionale del 27 marzo 1990, con conseguente imposizione di nuovo vincolo conservativo. italic Siracusa XML - Guido Boella

369 La <italic>Banca</italic> ricorrente è proprietaria di un immobile sito in Siracusa, piazza Archimede, sede degli uffici della <italic>Banca </italic>, che è stato considerato dal Comune di <new>Siracusa</new> come edificio di interesse storico e monumentale ed inserito nel piano particolareggiato di recupero del centro storico di Ortigia adottato con <underlined color=“black” points=“2”> delibera consiliare</underlined> del 30 aprile 1988 e approvato con <underlined> decreto regionale </underlined> del ... VEDI XML - Guido Boella

370 Perché passare dati al client?
Per avere applicazioni che rispondono in maniera più veloce Per alleggerire il carico di lavoro del server: one page web applications XML - Guido Boella

371 IE5 e XML Il browser IE5 (e forse Netscape 6) offrono la possibilità di incorporare file XML all'interno di una pagina HTML e di manipolarli con VBscript (come con ASP) o Jscript I dati XML (xml data island) possono essere visualizzati in tabelle o in singoli elementi XML tramite DATAFLD XMLHTTP permette di trasmettere oggetti XML al server e viceversa XML - Guido Boella


Scaricare ppt "eXtensible Markup Language"

Presentazioni simili


Annunci Google