Linguaggi per il web oltre HTML: XML Luca Console Con XML si arriva alla separazione completa tra il contenuto e gli aspetti concernenti la presentazione (visualizzazione). XML è in realtà un meta-formalismo che permette di definire dei linguaggi di tagging, specificando come possano essere composti (anndidati). L idea è che i tag debbano corrispondere al contenuto e che il linguaggio debba quindi descrivere la struttura della conoscenza (delle informazioni) che deve essere gestitita. Si potranno poi definire stili per la visualizzazione delle informazioni. OSSERVAZIONE: in effetti gli altri linguaggi di tagging (html, wml ) possono essere definiti in XML La possibilità di definire il sistema di tagging permette di definire dei tag e dei linguaggi in cui si specifica il significato delle diverse parti di un insieme di informazioni (conoscenza, documento) e quindi la sua struttura a livello di contenuto (verso un tagging semantico). In XML, nella definizione di un documento (insieme di documenti) si specificano tre cose: 1. DTD (Document Type Definition): con cui, attraverso un ben preciso linguaggio, si specifica quale è la struttura di tag di un documento: quali sono i tag e come si possano combinare (annidare) 2. Data una DTD, si possono definire vari documenti XML basati sulla DTD stessa, ossia che organizzano informazioni secondo la struttura di tag definita dalla DTD (sono conformi alla DTD). In questo modo viene evidenziato il ruolo delle diverse parti di conoscenza che costituiscono il documento. 3. Fogli di stile per la visualizzazione dei documenti. Possono essere specificati in due modi diversi: a. CSS b. XSL Definire una DTD corrisponde a definire un nuovo linguaggio di tagging, con tag che permettono di organizzare un documento in base al loro contenuto. DTD OSSERVAZIONE: Esistono già molte DTD per diversi tipi di informazioni, possono essere consultate in www.xml.org dove è possibile registrare una nuova DTD. Linguaggio attraverso cui si possono definire i tag e la struttura gerarchica (ad albero) secondo cui i tag possono essere organizzati. Questo corrisponde a definire la struttura concettuale di un documento. 1
Esempio: supponiamo di definire i tag per organizzare delle lettere; avremo, le seguenti componenti dal punto di vista della struttura dei documenti (in base al loro significato): - mittente, a sua volta composto da un nome e un indirizzo, a sua volta composto da via e città; - destinatario, a sua volta composto da un nome e un indirizzo, a sua volta composto da via e città; - testo, composto da un subject e quindi dei paragrafi (in numero variabile). Ossia, la seguente struttura ad albero: mittente nome indirizzo via città lettera destinatario nome indirizzo via città testo subject paragrafi Paragrafo* (* significa la possibilità di ripetere più volte un oggetto) In questo modo si distinguono le diverse parti di un documento e i ruoli ceh queste diverse parti hanno nel costituire un documento. Questa strutturazione può essere utilizzata in vari modi (in un certo senso è un modo disstrutturare l informazione quasi come in una tabella di una base di dati). Ad esempio, per definire sistemi di information retrieval che si basano sul contenuto (se devo cercare le lettere mandate a rossi, non cercherò genericamente le lettere che contengono il nome rossi, ma quelle che lo contengono nella parte nome, all interno della parte destinatario, evitando così le lettere in cui rossi è il mittente o compare nell indirizzo o compare nel testo). Sintassi DTD Definizione di un tag e della sua struttura di sottotag: <!ELEMENT nome-del-tag (definizione sottotag)> dove nella parte definizione sottotag vi sono varie alternative: - #PCDATA: ossia nel tag (tra il tag <nome-de-tag> e la sia chiusura </nome-detag>) sono contenute delle informazioni senza ulteriori sottotag 2
- TAG1, TAG2, a indicare che il tag <nome-de-tag> ha i sottotag TAG1 e TAG2 che devono esserci e devono essere usati nell ordine specificato - TAG1 TAG2, a indicare che il tag <nome-de-tag> ha i sottotag TAG1 e TAG2 che devono esserci e possono essere usati in qualunque ordine - TAG? a indicare che il tag <nome-de-tag> ha il sottotag opzionale TAG. NOTA: il punto interrogativo si può usare anche associato ad uno dei due TAG1 o TAG2 dei casi precedenti a indicare che uno o entrambi i tag sono opzionali - TAG* a indicare che il tag <nome-de-tag> ha il sottotag TAG che può essere ripeto zero o più volte (vi possono essere più occorrenze del sottotag). Come sopra, può essere combinato con i primi due casi - TAG+ a indicare che il tag <nome-de-tag> ha il sottotag TAG che può essere ripeto una o più volte (vi possono essere più occorrenze del sottotag). Come sopra può essere combinato con i primi due casi. Ossia uguale ad * ma DEVE esserci almeno una volta. ESEMPIO: lettera.dtd <!ELEMENT lettera (mittente, destinatario, testo)> <!ELEMENT mittente (nome, indirizzo)> <!ELEMENT indirizzo (via, città)> <!ELEMENT nome (#PCDATA)> <!ELEMENT via (#PCDATA)> <!ELEMENT città (#PCDATA)> <!ELEMENT testo (subject, paragrafi)> <!ELEMENT subject (#PCDATA)> <!ELEMENT paragrafi (paragrafo*)> <!ELEMENT paragrafo (#PCDATA)> Quindi si possono definire vari documenti strutturati secondo questa DTD. Se rispettano la struttura di tag della DTD si dicono conformi. La verifica di conformità viene effettuata da dei parser (analizzatori sintattici) XML che usano la DTD come definizione di una sintassi (regole sintattica grammaticali) e il documento come il testo da analizzare. I parser verificano se un documento è conforme e ne costruiscono la struttura, ossia mettono il documento in una forma ad albero, secondo la struttura definita dalla DTD. Ci sono molti parser, anche shareware. Ad esempio Explorer dalla versione 5.0 ha inglobato un parser XML ed esegue l analisi visualizzando il documento in forma ad albero. Il documento XML deve specificare quale è la DTD di riferimento. Esempio di documento XML conforme: <xml version= 1.0 > <!DOCTYPE lettera src= lettera.dtd > <lettera> <mittente> (osservazione: deve essere il tag radice dell albero, seguito - con src - dal file con la dtd; opp. si può specificare l URL della dtd) 3
<nome> pippo </nome> <indirizzo> <via> roma 1 </via><citta> torino </citta> </indirizzo> </mittente> <destinatario> <nome> pluto </nome> <indirizzo> <via> vittorio 1 </via><citta> milano </citta> </indirizzo> </ destinatario > <testo> <subject> aaaa </subject> <paragrafi> <paragrafo> cwcwcw </paragrafo> <paragrafo> wwf </paragrafo>. <paragrafo> cwcwcw </paragrafo> </paragrafi> </lettera> Esempi di documenti non conformi: 1) <lettera> <mittente> <indirizzo> <via> roma 1 </via><citta> torino </citta> </indirizzo> <nome> pippo </nome> </mittente> <destinatario>. ORDINE TAG SBAGLIATO 2) <lettera> <mittente> <nome> pippo </nome> </mittente> <destinatario>. MANCA TAG XML è comodo per definire dei formati standard per informazioni che devono essere scambiate da persone o da agenti software. Infatti i tag permettono di strutturare in modo semantico le diverse parti di un documento, rendendo non ambiguo il documento e le sue parti. XML si presta quindi a definire: - formati di interscambio; - formati di memorizzazione e retrieval (recupero) di documenti e conoscenza. 4
OSSERVAZIONE: oggi è comune dire di definire un XML ogni volta che si devono condividere o scambiare dei documenti o della conoscenza. Con questo si intende definire una DTD. Attributi In una DTD è possibile anche definire degli attributi per i tag, anche se questo non è di uso molto comune (per comodità spesso si preferisce definire dei sottotag, che possono essere gestiti facilmente con stili XSL, cosa non standard con gli attributi). OSSERVAZIONE: gli attributi sono come in HTML, ad esempio come HREF nel tag A: <A HREF= > Per ogni tag è quindi possibile specificare degli attributi, e per ogni attributo si specifica: - dominio; - il fatto che l attributo sia obbligatorio o opzionale (required/not required); - valore di default (opzionale) Sintassi <!ATTLIST nome-tag nome-attributo TIPO #required valore default > TIPO: - CDATA: un testo - NUMBER: un numero - (A B C) elenco, enumerazione dei valori possibili (in questo caso A, B e C) Ad esempio: dato un tag indirizzo, si potrebbero definire, via, numero e città come attributi: <!ELEMENT indirizzo (#PCDATA)> <!ATTLIST indirizzo via CDATA #required> <!ATTLIST indirizzo numero NUMBER> <!ATTLIST indirizzo citta CDATA default= torino > Il tag html: <INDIRIZZO via= roma numero =1, citta= milano > sarà conforme a tale definizione. Altro esempio di DTD <?xml version="1.0" encoding="utf-8"?> <!ELEMENT luoghi (alberghi, ristoranti)> <!ELEMENT alberghi (albergo)> <!ATTLIST alberghi categoria (lusso media bassa) #REQUIRED> <!ELEMENT albergo (id+, nome, stelle, indirizzo, descrizione, foto*)> 5
<!ELEMENT id (#PCDATA)> <!ELEMENT nome (#PCDATA)> <!ELEMENT stelle (#PCDATA)> <!ELEMENT indirizzo (citta, via, numero)> <!ELEMENT descrizione (#PCDATA)> <!ELEMENT ristoranti (ristorante)> <!ELEMENT ristorante (id+, nome, indirizzo, genere, voto, foto*)> <!ELEMENT genere (#PCDATA)> <!ELEMENT voto (#PCDATA)> <!ENTITY vale SYSTEM "vale1.txt"> Questo usa anche la direttiva ENTITY che permette di associare ad un tag un oggetto (ad esempio una immagine o un documento). FOGLI DI STILE XML non prevede alcuna direttiva per la visualizzazione delle informazioni. Ogni specifica di visualizzazione deve essere effettuata usando dei linguaggi per fogli di stile, per cui vi sono due alternative: - CSS (più semplice e rozzo); - XSL (più sofisticato). CSS Funziona esattamente come CSS per HTML, ossia per ogni tag si definiscono regole di stile: TAG {direttive di stile} Nel documento XML si specifica quindi quale è il file in cui ritrovano direttive di stile: <xml version =1.0> <!DOCTYPE lettera src= lettera.dtd > <?xml:stylesheet type= text/css href= pippo.css > (in generale è un URL) pippo.css: LETTERA {font-style:times, font-size:11} INDIRIZZO {font-size:10} OSSERVAZIONE: dovrebbe funzionare l ereditarietà degli stili secondo la struttura dei tag definita nella DTD. OSSERVAZIONE: non si riescono a fare grandi cose 6
XSL XSL è un sistema molto più sofisticato che permette di definire degli stili di visualizzazione o, più in generale, delle regole di traduzione in altri linguaggi, che includano direttive di visualizzazione. Ad esempio, è possibile specificare come tradurre un documento XML in HTML, mescolando nell HTML il contenuto, proveniente dal documento XML e delle direttive di visualizzazione. In modo analogo è possibile specificare traduzioni in altri linguaggi quali WML o anche RTF per documenti Word o Tex. In questo modo ad esempio è possibile aver una sola versione di un documento, che contiene solo il contenuto in XML e quindi generare al volo traduzioni in diversi altri linguaggi, per media o ambiti di visualizzazione diversi. XSL è basato sulla definizione di regole di traduzione per ogni tag, in cui la regola di traduzione può specificare: - comandi (frasi) nel linguaggio oggetto della traduzione; - richiamare regole di traduzione per dei sottotag del tag per cui si sta scrivendo la regola. Sintassi <xsl template match= tag per cui si sta definendo la regola> SCHEMA DI TRADUZIONE </xsl:template> In particolare, all interno di SCHEMA DI TRADUZIONE si possono chiamare regole di traduzione di sottotag secondo al seguente sintassi: <xsl: apply-templates select= nome tag /> per richiamare la regola di traduzione per il tag nome tag (che deve essere un sottotag di quello per cui si sta specificando lo SCHEMA DI TRADUZIONE <xsl:value-of select= noem tag /> per inserire nella traduzione il contenuto del tag nome tag, ossia l informazione compresa tra <nome tag> e </nome tag> <xsl.for each select= noem tag > schema di traduzione da applicare a tutte le occorrenze del tag (sottotag) nome tag [è una sorta di for da applicare per tag ripetitivi (con * o +)] </xsl: for-each> Esempio: consideriamo una DTD e un documento XML per un catalogo di prodotti, per cui poi vogliamo generare una pagina HTM contenente una tabella: DTD: 7
<!ELEMENT CATALOGO (PRODOTTI)> <!ELEMENT PRODOTTI (PRODOTTO*)> <!ELEMENT PRODOTTO (NOME, PREZZO)> <!ELEMENT NOME (#PCDATA)> <!ELEMENT PREZZO (#PCDATA)> XML: <CATALOGO> <PRODOTTI> <PRODOTTO> <NOME> pippo </NOME> <PREZZO> 1 </PREZZO> </PRODOTTO>. <PRODOTTO> <NOME> pluto </NOME> <PREZZO> 10 </PREZZO> </PRODOTTO> </PRODOTTI> </ CATALOGO> XSL, per produrre: ELENCO DEI PRODOTTI: nome prodotto prezzo pippo 1 pluto 10 <xsl:template match= catalogo > <HTML> <BODY.> <H1> ELENCO DEI PRODOTTI: </H1> <TABLE width= > <TR><TH> nome prodotto> <TH> prezzo </TR> <xsl:apply-templates match= prodotti /> </TABLE> </xsl:template > parte in linguaggio oggetto richiamo regola di traduzione ancora linguaggio oggetto <xsl:template match= prodotti > <xsl:for-each match= prodotto > <TR> <xsl:apply-templates match= nome > <xsl:apply-templates match= prezzo > </TR> </xsl:for-each> </xsl:template > <xsl:template match= nome > <B> 8
</B> </xsl:template > <xsl:value-of match= nome > <xsl:template match= prezzo > <xsl:value-of match= prezzo > </xsl:template > Per effettuare la traduzione: - esistono dei traduttori (per es. Saxon, Xalan,..) che effettuano la traduzione da file XML a file oggetto (per es. HTML); - i browser cominciano a supportare la traduzione e visualizzazione immediata dell HTML risultante (ma questo ovviamente vale solo se si traduce in HTML). 9