Utilizzo di XML con Javascript Moltissime applicazioni Web si scambiano i dati con l'utilizzo di un formato intelligibile e fruibile che non necessita di particolari autorizzazioni come ne necessitano i database. Il formato di dati di cui stiamo parlando è l'XML. All'XML in genere ci si interfaccia con linguaggi lato server come ASP, ASP.NET, PHP ed altri, ma è possibile interfacciarvisi anche con linguaggi lato client come VBScript e Javascript. Quest'ultimo è oggetto del presente Articolo. In effetti ci sono dei pro e dei contro nell'utilizzo di un linguaggio lato client piuttosto che lato server: i pro sono legati alla velocità di esecuzione ed al fatto che non è necessario che su un server siano installati i parser XML adatti, che (per contro) devono necessariamente essere installati sui client che visitano una pagina XTML che importa uno script che legge un XML, ovvero una cosa che non si può controllare. La scelta di implementare un'applicazione con Javascript ed XML è adatta ad un'applicazione Intranet, dove si sa per certo che solo determinati client accederanno alle pagine. Introduzione ad XML XML è l'acronimo di eXtensible Markup Language, ovvero linguaggio di marcatura che, a differenza dell'HTML, ha delle proprietà estensibili e non è atto a definire layout di pagine bensì a creare delle strutture di dati. Si crei il file database.xml semplicemente rinominando un normale file di testo Nuovo Documento di testo.txt e vi si inserisca il seguente codice: <?xml version="1.0"?> <biblioteca> <libro> <autore>J.R.R. Tolkien</autore> <titolo>Il Signore degli Anelli</titolo> <descrizione>Fantastica storia epica fantastica medievale</descrizione> <prezzo>100</prezzo> </libro> <libro> <autore>B. Stocker</autore> <titolo>Dracula</titolo> <descrizione>La storia del noto vampiro transilvano</descrizione> <prezzo>50</prezzo> </libro> <libro> <autore>D. Defoe</autore> <titolo>Moll Flanders</titolo> <descrizione>La storia di una ladra e prostituta</descrizione> <prezzo>35</prezzo> </libro> </biblioteca> E' possibile notare una struttura gerarchica di tipo padre.figlio e figlio.nipote; questi legami si chiamano nodi a cui è possibile accedere in via programmatica. Più avanti, nel corso dell'Articolo, vedremo come. L'oggetto XMLDOM Esistono diversi sistemi per accedere ai dati di un documento XML, uno dei quali, probabilmente il migliore, è di casa Microsoft e si chiama XMLDOM che sfrutta le potenzialità del Document Object Model. Utilizzato lato server l'XMLDOM permette anche di aggiornare file modificando nodi esistenti e creandone di nuovi, come se si trattasse di un database. Con Javascript il discorso cambia perchè un client riconoscerebbe una simile operazione come frutto di un ActiveX potenzialmente pericoloso. Il problema non si verifica in lettura. Per leggere un documento XML con l'XMLDOM è necessario creare un'istanza della libreria Microsoft.XMLDOM con la seguente sintassi: var objXml = new ActiveXObject("Microsoft.XMLDOM"); Si crei il file test.htm e si inserisca il seguente codice in un blocco di script: var errore = 0; try { var objXml = new ActiveXObject("Microsoft.XMLDOM"); errore = 0; alert("Componente supportato"); } catch (e) { errore = 1; alert("Componente NON supportato"); } finally { if (errore = 0) { objXml.Close(); } } Con l'istruzione try dichiaro l'istanza dell'oggetto; nell'istruzione catch gestisco un'eventuale eccezione dovuta ad un errore; nell'istruzione finally inserisco il codice che dovrà comunque essere eseguito, in questo caso la chiusura dell'istanza per non tenere la memoria del computer occupata. Ad ogni modo il costrutto try catch finally è proprietario di Javascript e serve per la gestione degli errori: non ha nulla a che vedere nativamente con XML o con XMLDOM. Leggere un file XML con Javascript Passiamo alla lettura del file database.xml all'interno del file leggi.htm di cui riporto il codice commentato: var errore = 0; try { var objXml = new ActiveXObject("Microsoft.XMLDOM"); // Carico il file XML objXml.async = false; objXml.load("database.xml"); // Leggo tutti i nodi del file col metodo getElementsByTagName() var autore = objXml.getElementsByTagName("libro/autore"); var titolo = objXml.getElementsByTagName("libro/titolo"); var descrizione = objXml.getElementsByTagName("libro/descrizione"); var prezzo = objXml.getElementsByTagName("libro/prezzo"); var i = 0; // Ciclo tutti i nodi utilizzando la proprietà text per la lettura with(document) { for (i=0; i<autore.length; i++) { write("Autore: " + write("Titolo: " + write("Decrizione: write("Prezzo: " + } autore[i].text + "<br>"); titolo[i].text + "<br>"); " + descrizione[i].text + "<br>"); prezzo[i].text + "€<br><br>"); } errore = 0; } catch (e) { document.write("Spiacenti, il tuo computer non supporta XML"); errore = 1; } finally { if (errore = 0) { objXml.Close(); } } Un sistema di login in Javascript ed XML Con un po di fantasia e con l'oggetto XMLDOM possiamo creare una serie di interessanti applicazioni basate su XML. L'oggetto di questo Articolo è un sistema di autenticazione, o che dir si voglia di login, basato su un file XML di cui presento la struttura, contenuta all'interno del file login.xml <?xml version="1.0"?> <database> <utente> <id>1</id> <password>pippo</password> </utente> <utente> <id>2</id> <password>pluto</password> </utente> <utente> <id>3</id> <password>paperino</password> </utente> </database> La struttura esplica chiaramente che ad ogni utente è assegnata una coppia di valori UserID e Password, ovvero le credenziali di accesso. Di seguito il codice HTML del modulo in cui inserire le proprie credenziali per l'autenticazione, contenuto nel file login.html <form name="modulo"> User ID:<br> <input type="text" name="u_id"><br> Password:<br> <input type="password" name="pass"><br> <input type="button" value="Login" onclick="XML_Login()"> </form> L'evento click del bottone di login fa riferimento alla funzione XML_Login() da inserire nell'header dello stesso file. Di seguito il codice commentato: <script language="javascript"> <!-function XML_Login() { // Recupero i dati dal modulo HTML var u_id = document.modulo.u_id.value; var pass = document.modulo.pass.value; // Imposto un'espressione regolare per verificare che // i caratteri inseriti nei campi UserID e Password // siano alfanumerici, in modo da non dar fastidio all'XML var re = /^[a-z0-9]/; // Verifico che i campi siano valorizzati (correttamente) if (re.test(u_id) == false || re.test(pass) == false) { alert("Inserire le credenziali di accesso!"); } else { // Una volta soddisfatte le condizioni... // Apro un oggetto XMLDOM var login = new ActiveXObject("Microsoft.XMLDOM"); // Carico il file XML login.async = false; login.load("login.xml"); // Recupero i nodi dal file XML var id = login.getElementsByTagName("utente/id"); var password = login.getElementsByTagName("utente/password"); // Creo un indice per individuare il nodo relativo // all'utente che sta effettuando il login var indice = u_id - 1; // Verifico che l'utente esista e gli concedo o meno l'accesso if (id[indice].text == u_id && password[indice].text == pass) { alert("Benvenuto!"); } else { alert("Accesso negato!"); } } } //--> </script> Non è tutto oro quel che luccica! Il sistema è semplice e funzionante e potrebbe risolvere i problemi di molti Webmaster che non utilizzano (o non ancora) linguaggi sicuri come ASP, ASP.NET o PHP. Tuttavia ci sono due controindicazioni: 1. utilizzare un file XML che contenga dati sensibili come delle credenziali di accesso non è una scelta sicura perchè ci si potrebbe arrivare via HTTP, conoscendo o immaginando come potrebbe chiamarsi il file; 2. utilizzare Javascript lato client mette in chiaro nel codice il nome ed il percorso del file XML contenente le credenziali di accesso dei vari utenti. Con queste considerazioni non sto smontando i lettori in merito all'utilizzo di questo sistema, anche perchè altrimenti non ci avrei scritto un Articolo! Considerate questo Articolo come risorsa puramente didattica: vi propongo un altro Articolo (reperibile nella sezione ASP - Tutorial) che sfrutta questo stesso sistema con uno script ASP, in modo da rendere sicura l'autenticazione e da non mettere i dati a rischio... o non più di tanto! Paginazione a colonne di un file Xml Per questioni pratiche e di spazio sulla pagina, conviene sempre, o comunque quando possibile, disporre i risultati di un report in una tabella formata da più colonne. Abbiamo già visto in un Articolo precedente come è possibile paginare a colonne i risultati di una query su di un database: allo stesso modo possiamo paginare i dati di un file XML, oggetto di questo Articolo. Consideriamo il codice del seguente file, amici.xml <?xml version="1.0"?> <amici> <amico> <nome>Alessandro</nome> </amico> <amico> <nome>Claudio</nome> </amico> <amico> <nome>Emanuela</nome> </amico> <amico> <nome>Felice</nome> </amico> <amico> <nome>Jacopo</nome> </amico> <amico> <nome>Luca</nome> </amico> <amico> <nome>Max</nome> </amico> </amici> Il codice ASP di seguito riportato ed opportunamente commentato, spiega come eseguire la paginazione a colonne sul file XML appena esaminato: <%@LANGUAGE = VBScript%> <table border="1"> <tr> <% ' DICHIARO LE VARIABILI CHE MI SERVONO PER L'APPLICAZIONE Dim xml, nome, i, x ' APRO UN NUOVO OGGETTO XMLDOM E CARICO IL FILE XML Set xml = Server.CreateObject("Microsoft.XMLDOM") xml.async = False xml.load Server.MapPath("amici.xml") ' RECUPERO IL NODO CHE MI INTERESSA Set nome = xml.getElementsByTagName("amico/nome") ' VALORIZZO I CONTATORI i = 0 x = 0 ' ESEGUO IL CICLO SU TUTTI I NODI For i = 0 To nome.length - 1 ' VERIFICO CHE IL REPORT SI DISPONGA SU 3 COLONNE If x = 3 Then x = 0 Response.Write "</tr><tr>" End If %> <td width="100" align="center"><%=nome(i).Text%></td> <% Next ' INCREMENTO IL CONTATORE x = x + 1 ' UN PO DI PULIZIA... Set nome = Nothing Set xml = Nothing %> </tr> </table> Le fasi salienti dello script sono evidenziate in grassetto... il resto è un comune report di un file XML utilizzando una pagina ASP/VBScript e l'XMLDOM. Celle di colori alternati con ASP, XML ed XSLT Le istruzioni condizionali dell'XSLT consentono di realizzare con semplicità report che si comportano in maniera differente a seconda di calcoli o dei dati presenti all'interno di un documento XML. L'esempio di questo Articolo mette in pratica un utile script che genera un report in celle di colori alternati, effettuando la trasformazione lato server attraverso ASP. Creiamo una semplice struttura di dati XML nel file database.xml <?xml version="1.0"?> <database> <utente> <id>1</id> <nome>Luca</nome> <cognome>Ruggiero</cognome> </utente> <utente> <id>2</id> <nome>Max</nome> <cognome>Bossi</cognome> </utente> <utente> <id>3</id> <nome>Claudio</nome> <cognome>Garau</cognome> </utente> <utente> <id>4</id> <nome>Alessandro</nome> <cognome>Alessandrini</cognome> </utente> </database> Stilizziamo ora dinamicamente l'output del file XML col seguente codice XSLT nel file style.xsl <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html" /> <xsl:template match="/"> <h1>UTENTI</h1> <table border="1"> <thead bgcolor="#000000" style="color: #FFFFFF;"> <th>Nome</th> <th>Cognome</th> </thead> <xsl:for-each select="database/utente"> <xsl:choose> <xsl:when test="id mod 2 = 1"> <tr bgcolor="#FFFFFF"> <td><xsl:value-of select="nome" /></td> <td><xsl:value-of select="cognome" /></td> </tr> </xsl:when> <xsl:otherwise> <tr bgcolor="#FFFFCC"> <td><xsl:value-of select="nome" /></td> <td><xsl:value-of select="cognome" /></td> </tr> </xsl:otherwise> </xsl:choose> </xsl:for-each> </table> </xsl:template> </xsl:stylesheet> Commentiamo un po il codice per renderci conto delle sue azioni dinamiche. Prima operazione è quella di impostare l'output in formato HTML per evitare che la trasformazione, da ASP, avvenga importando Tag XML: <xsl:output method="html" /> questa operazione possiamo considerarla come valore aggiunto al report ma non è fondamentale ai fini della riuscita dello script. Apriamo il template XSLT ed iniziamo a scrivere il codice HTML. Ad un certo punto, all'interno del ciclo che estrae tutti i dati dal file XML, utilizziamo le istruzioni condizionali xsl:when ed xsl:otherwise, all'interno di un gruppo di scelta condizionale xsl:choose, per impostare due condizioni, ovvero quelle secondo le quali le celle su una stessa riga saranno, in maniera alternata, di un colore piuttosto che di un altro <xsl:choose> <xsl:when test="id mod 2 = 1"> <tr bgcolor="#FFFFFF"> <td><xsl:value-of select="nome" /></td> <td><xsl:value-of select="cognome" /></td> </tr> </xsl:when> <xsl:otherwise> <tr bgcolor="#FFFFCC"> <td><xsl:value-of select="nome" /></td> <td><xsl:value-of select="cognome" /></td> </tr> </xsl:otherwise> </xsl:choose> Effettuiamo il test condizionale con l'operatore modulo in base 2, impostando la condizione di uguaglianza su 1, in modo da ottenere una condizione vera ogni due. Di seguito il codice commentato del file ASP che effettua la trasformazione: <%@LANGUAGE = VBScript%> <% ' Dichiaro le variabili che mi servono Dim database, style ' Setto due oggetti XMLDOM, uno per il file XML ' ed un secondo per il file di stile dinamico XSLT Set database = Server.CreateObject("Microsoft.XMLDOM") Set style = Server.CreateObject("Microsoft.XMLDOM") ' Setto i due oggetti come sincroni database.async = False style.async = False ' Carico i file XML ed XSLT database.load Server.MapPath("database.xml") style.load Server.MapPath("style.xsl") ' Nel corpo della pagina effettuo la trasformazione... %> <html> <head> <title>Celle di colori alternati con ASP, XML ed XSLT</title> </head> <body> <%=database.transformNode(style)%> </body> </html> <% ' Un po di pulizia... Set database = Nothing Set style = Nothing %> Accedere ad un file XML generato dinamicamente con Javascript Il metodo loadXML() di XMLDOM permette di supplire al tradizionale metodo load(), utilizzato per specificare il percorso di un file XML reale a cui accedere, quando il file XML non è fisicamente presente sul server ma viene generato al volo all'interno del codice Javascript stesso. La domanda nasce spontanea: perchè creare al volo un file XML direttamente all'interno del codice Javascript piuttosto che utilizzare un file XML reale? In effetti una risposta secca e definita non c'è ma ci sono tante risposte che si traducono in specifiche casistiche di programmazione a cui è necessario, all'occorrenza, far fronte. Immaginiamo ad esempio un'applicazione Intranet basata o meno su XML in cui è necessario fare dei rapidi calcoli al volo, ad esempio per monitorare dinamicamente il numero e/o il valore di una serie di elementi di un form HTML. A prescindere dal fatto che potrebbero esserci altre soluzioni altrettanto valide, la soluzione di creare una struttura XML al volo è comunque una soluzione ed è anche piuttosto valida; a questo proposito torna comodo avere una struttura XML volatile su cui agire col DOM piuttosto che dover andare a creare fisicamente un file XML, verificarne l'esistenza, andarci a scrivere o a modificarlo... operazioni più lunghe e dispendiose che richiedono, per altro, l'intervento di un linguaggio lato server come ASP. Il codice, simile a tanti altri codici già visti riguardanti l'interazione con l'XMLDOM, è molto semplice e non ha bisogno di commenti var testo = ""; testo testo testo testo testo testo += += += += += += "<?xml version='1.0'?>"; "<utenti>"; "<utente><nome>Luca</nome></utente>"; "<utente><nome>Max</nome></utente>"; "<utente><nome>Claudio</nome></utente>"; "</utenti>"; var x = new ActiveXObject("Microsoft.XMLDOM"); x.async = false; x.loadXML(testo); var i = 0; for (i=0; i<x.documentElement.childNodes.length; i++) { document.write(x.documentElement.childNodes(i).text + "<br>"); } x.Close(); Nella variabile testo costruisco dinamicamente la struttura XML e la richiamo all'interno del metodo loadXML(). Il resto è ordinaria amministrazione. XML Data Binding: unire XML ed HTML Il Data Binding è una tecnica di programmazione basata sul recupero di un elemento attraverso l'oggetto DSO (Data Source Object) che dispone di una serie di proprietà per recuperare i dati. Microsoft ha implementato nel parser MSXML la possibilità di gestire lato client i dati di una struttura XML attraverso la tecnica del Data Binding. Trattandosi di una tecnica lato client non so fino a che punto possa effettivamente essere utile, ma in ogni caso vediamo di cosa si tratta. Si prenda la seguente struttura XML da inserire nel file rubrica.xml <?xml version="1.0"?> <database> <record> <nome>Pippo</nome> <email>[email protected]</email> <telefono>112233</telefono> </record> <record> <nome>Pluto</nome> <email>[email protected]</email> <telefono>445566</telefono> </record> <record> <nome>Paperino</nome> <email>[email protected]</email> <telefono>778899</telefono> </record> </database> Nella nostra pagina HTML utilizzeremo il Tag <xml>, con relativa chiusura </xml>, per recuperare il file XML; a questo Tag assegneremo l'ID identificativo del DSO da utilizzare <xml id="dso_rubrica" src="rubrica.xml"></xml> Passiamo alla materiale estrazione dei dati all'interno di una tabella HTML <table datasrc="#dso_rubrica" border="1"> <thead bgcolor="#EEEEEE"> <th align="left"><b>Nome</b></th> <th align="left"><b>Email</b></th> <th align="left"><b>Telefono</b></th> </thead> <tr> <td><span datafld="nome"></span></td> <td><span datafld="email"></span></td> <td><span datafld="telefono"></span></td> </tr> </table> Alla tabella assegno l'attributo datasrc che recupera l'ID del DSO associato al file XML a cui accedere; utilizziamo i Tag thead e th per definire l'intestazione della tabella ed evitare che si ripeta per ogni nodo XML visualizzato; all'interno di una serie di Data Fields andiamo ad estrarre i veri e propri dati, sfruttando l'attributo datafld. NOTA: se volete disporre i dati di uno stesso nodo in verticale piuttosto che in orizzontale dovete far si che l'intestazione si ripeta ed utilizzare i Tag tr e td al posto di thead e th. XML ed HTML: creazione di una struttura intuibile Una delle principali raccomandazioni per la realizzazione di una struttura XML, che esula dalle regole per la creazione di strutture valide o ben formate, è quella di creare Tag intuibili. Mi capita di vedere strutture XML a prima vista del tutto incomprensibili, sia pur perfettamente funzionanti. Allo stesso modo in cui si raccomanda ad un programmatore di assegnare, ad esempio, a variabili e funzioni nomi intuibili, allo stesso modo è necessario creare strutture XML semplici da interpretare. Dal momento che l'XML somiglia, almeno nella sua struttura all'HTML, possiamo volgere a nostro favore questa platonica somiglianza e "rubare" i Tag con i relativi attributi. Supponiamo di voler creare una struttura XML i cui dati siano un elenco di siti con relativi link, icona e descrizione. Una struttura come quella appena descritta si può tradurre come segue <?xml version="1.0"?> <database> <html> <h1>MRW Corsi</h1> <a href="http://www.mrwcorsi.it" title="Corso professionali" /> <img src="mrwcorsi.gif" alt="Icona MRW Corsi" border="0" /> <p>Vuoi essere un professionista? Acquista i nostri corsi!</p> </html> <html> <h1>Mr.Webmaster</h1> <a href="http://www.mrwebmaster.it" title="Mister Webmaster" /> <img src="mrwebmaster.gif" alt="Icona Mr.Webmaster" border="0" /> <p>Vuoi imparare a programmare? Leggi i nostri Articoli!</p> </html> </database> Abbiamo usato il nome h1 al posto di titolo; a, con relativi attributi href e title al posto di collegamento; abbiamo utilizzato il Tag img, con relativi attributi classici dell'HTML, al posto di immagine o icona; in fine abbiamo usato p al posto di descrizione. Si tratta solo di un semplice esempio. Fate tesoro di questo consiglio! Capire la struttura XML di Google SiteMaps Google SiteMaps è un sistema introdotto nel 2005 dal gigante di Mountain View allo scopo di segnalare al suo spider le pagine di un sito e, tanto per smentire chi lo crede fermamente, questo sistema NON favorisce l'indicizzazione dei contenuti, essendo appunto solo uno strumento di segnalazione. In questo articolo by-passeremo le spiegazioni teoriche e di Marketing e ci concentreremo sulla struttura XML in cui questo sistema è materialmente redatto. Il file XML va preferibilmente messo nella root di un sito ed il nome del file non è importante. Supponiamo possa essere sitemaps.xml. Esaminiamo la sua struttura di base: <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.google.com/schemas/sitemap/0.84"> <url> <loc>http://www.mrwebmaster.it/</loc> <lastmod>2006-09-15</lastmod> <changefreq>weekly</changefreq> <priority>1.0</priority> </url> </urlset> Alla prima riga troviamo la dichiarazione e la versione del linguaggio XML e la sua codifica UTF. In seguito troviamo il Tag principale che è urlset con relativa chiusura alla fine del file; il suo Namespace, specificato dal Tag xmlns, fa riferimento al percorso remoto di Google stesso, su cui è presente la DTD relativa agli spazi nei nomi utilizzati e gestiti stesso da Big G. A questo punto esaminiamo il nodo composto da dal Tag principale url e dall'elenco dei Tag utili a specificare i valori per singola pagina. loc - Specifica la pagina da segnalare allo spider di Google: in questo caso la Homepage. lastmod - Indica la data dell'ultima modifica della pagina in formato: aaaa-mm-gg ovvero anno-mese-giorno changefreq - Indica la frequenza con cui una pagina viene aggiornata : • daily - quotidianamente • weekly - settimanalmente • monthly - mensilmente priority - Indica il livello di importanza della pagina: si può dire a Google, in questo modo, che la sua importanza va da 0.1 a 1.0 e non oltre. Proviamo adesso ad ampliare il file XML costituente il Google SiteMaps, specificando anche la pagina del Forum di Mr. Webmaster, oltre alla già specificata Homepage: <?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.google.com/schemas/sitemap/0.84"> <url> <loc>http://www.mrwebmaster.it/</loc> <lastmod>2006-09-15</lastmod> <changefreq>weekly</changefreq> <priority>1.0</priority> </url> <url> <loc>http://forum.mrwebmaster.it/</loc> <lastmod>2006-09-15</lastmod> <changefreq>daily</changefreq> <priority>1.0</priority> </url> </urlset> La modifica (aggiunta) è evidenziata in grassetto. Si consiglia di automatizzare il meccanismo di aggiornamento del file XML in questione attraverso un qualsiasi software o webware, di propria creazione, attraverso il linguaggio di scripting lato server che si preferisce. Impostare un link di base con XML: Base Nel tutorial dedicato ad XLink abbiamo visto come creare link attraverso un documento XML. Vediamo adesso come semplificarci la vita utilizzando l'elemento XML:Base per definire la URL di base dei documenti da linkare all'interno nel nostro file XML. Il funzionamento di XML:Base è simile a quello del Tag <base> dell'HTML, il cui funzionamento è descritto minuziosamente in questo articolo. Nell'articolo relativo ad XLink, a cui ho fatto riferimento in precedenza, abbiamo creato una struttura di file XML relativa al noto gruppo musicale Queen. Riportiamo lo stesso esempio in questa sede ed adattiamo al suo interno la gestione dei link di base con XML:Base, come nell'esempio che segue: <?xml version="1.0" encoding="UTF-8"?> <queen xml:base="http://localhost/queen/" xmlns:xlink="http://www.w3.org/1999/xlink"> <band xlink:type="simple" xlink:href="freddie-mercury.html"> Voce e piano: Freddie Mercury <band> <band xlink:type="simple" xlink:href="brian-may.html"> Chitarra elettrica: Brian May <band> <band xlink:type="simple" xlink:href="john-deacon.html"> Basso: John Deacon <band> <band xlink:type="simple" xlink:href="roger-taylor.html"> Batteria: Roger Taylor <band> </queen> Non facciamo altro che definire all'interno del Tag "queen", root del documento XML, l'attributo xml:base assegnandogli come valore la URL di base a cui i file HTML specificati all'interno dei singoli nodi faranno riferimento.