Pagine

mercoledì 25 marzo 2015

XML DOM (1)

L'acronimo DOM sta per Document Object Model. L'XML DOM definisce uno standard per manipolare documenti xml. Oltre all'XML DOM è importante la conoscenza dell'HTML DOM. Quest'ultimo definisce gli oggetti e le proprietà di tutti i tags html, nonché i metodi per manipolarli. In questo post ci occuperemo dell'XML DOM.

Per il DOM ogni cosa in un documento xml è un nodo. Per il DOM:
  • L'intero documento xml è un "document node"
  • Ogni elemento xml è un "element node"
  • Il testo contenuto negli elementi xml è composto di "text nodes"
  • Ogni attributo è un "attribute node"
  • I commenti sono "comment nodes"

Nel seguito useremo come file xml di esempio il file books.xml.

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <book category="children">
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="web">
    <title lang="en">XQuery Kick Start</title>
    <author>James McGovern</author>
    <author>Per Bothner</author>
    <author>Kurt Cagle</author>
    <author>James Linn</author>
    <author>Vaidyanathan Nagarajan</author>
    <year>2003</year>
    <price>49.99</price>
  </book>
  <book category="web" cover="paperback">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>


Il Parser


Tutti i moderni browser hanno un built-in parser, capace di manipolare documenti xml. Il parser converte un documento xml in un oggetto XML DOM al quale si può accedere usando il linguaggio javascript. Inoltre l'oggetto XML DOM contiene metodi per attraversare un albero xml, accedere ai nodi, inserire nodi, eliminare nodi. Prima di ciò è tuttavia necessario caricare in memoria il documento xml. Questo può essere fatto usando una funzione javascript standard, che nei nostri esempi chiameremo loadXMLDoc(filename). Eccola:

function loadXmlDoc(filename)
{
if (window.XMLHttpRequest)
  {
  xhttp=new XMLHttpRequest();
  }
else // code for IE5 and IE6  {
  xhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
xhttp.open("GET",filename,false);
xhttp.send();
return xhttp.responseXML;
}

Conviene memorizzare questa funzione in un file esterno (che chiameremo "xmlFunctions.js"), al quale si farà riferimento inserendo un'apposita direttiva nella sezione <head> della pagina web (evidenziata in giallo).


<!DOCTYPE html>

<html>

<head>

<script src="xmlFunctions.js"></script>

</head>

<body>


</body>
</html>

A questo punto siamo pronti per il nostro primo esperimento: vogliamo caricare, leggere e scrivere in una pagina web tutti i titoli del file books.xml.

Scriviamo dunque una semplice pagina html con il seguente codice:

<!DOCTYPE html>
<html>

<head>
<script src="xmlFunctions.js"></script>
</head>
<body>
<div id="pippo"/>
<script type="text/javascript" language="javascript">
xmlDoc=loadXmlDoc("books.xml");
var htmTxt="";
x=xmlDoc.getElementsByTagName("title");
for (i=0;i<x.length;i++)
 { 
 htmTxt+=x[i].childNodes[0].nodeValue + "<br/>";
 }
document.getElementById("pippo").innerHTML=htmTxt;
</script>
</body>
</html>

Salviamo la pagina html con il nome "leggiNodi.html" e apriamola. Vengono visualizzati i titoli dei quattro libri descritti nel file books.xml.

Anche il codice javascript scritto nella pagina html può essere messo in un file apposito, che verrà referenziato nella sezione <head>. In tal modo il codice html della pagina web sarà più leggibile, oltre ad aprirsi alla possibilità che persone diverse lavorino alla realizzazione della stessa funzionalità. Chiamiamo il file esterno "pageCode.js". Operando in tal modo la nostra procedura sarà composta da tre files:
  1. il file xmlFunctions.js contenente il codice javascript, cioè la funzione loadXmlDoc(fileName), necessario per caricare il file books.xml. Questa funzione può essere usata per aprire un generico altro file xml semplicemente passandogli il nome.
  2. il file pageCode.js contenente il codice javascript necessario per navigare nell'oggetto xmlDocument restituito dalla chiamata alla funzione loadXmlDoc(filename). Per rendere questo codice riutilizzabile la funzione che esso contiene accetterà tre parametri: il nome del file xml da caricare, il nome del nodo da ricercare, il nome del tag html nel quale iniettare il risultato.
  3. La pagina html vera e propria, con il contenitore identificato dal tag <div> con identificativo "pippo".
Dopo queste modifiche il codice contenuto nel file xmlFunctions.js resta invariato, mentre cambia il codice contenuto nel file pageCode.js:

function fillDiv(xmlFile, nodeName, tagId)
{
try{
xmlDoc=loadXMLDoc(xmlFile);
}
catch (err){alert(err.message);}
var htmTxt="";

var x=xmlDoc.getElementsByTagName(nodeName);

 for (i=0;i<x.length;i++)
   {
   htmTxt+=x[i].childNodes[0].nodeValue + "<br/>";
   }
 document.getElementById(tagId).innerHTML=htmTxt;
}


Si noti, nel codice precedente, il blocco try-catch (evidenziato in giallo) del quale parleremo in altra occasione. Esso serve per intercettare eventuali errori e far comparire un messaggio che lo descrive.

A questo punto il codice della pagina html si riduce notevolmente:

<!DOCTYPE html>
<html>
<head>
<script src="xmlFunctions.js"></script>
<script src="pagecode.js"></script>
</head>
<body>
<div id="pippo"/>
<script type="text/javascript" language="javascript">fillDiv('books.xml','title','pippo');</script>
</body>
</html>

Considerazioni


Abbiamo separato tutta la procedura in tre blocchi per renderla più gestibile e consentire, eventualmente, a più persone di lavorare su di essa. 

Nel file xmlFunctions.js si mettono le funzioni di uso generale, cioè riusabili in molti altri casi. Queste sono in genere scritte da specialisti javascript che le rendono disponibili a moltissimi programmatori.

Nel file pageCode.js si mettono le funzioni usate dalla specifica pagina html su cui stiamo lavorando. Il suo codice può essere scritto dalla stessa persona che scrive anche la pagina html, come pure da un'altra persona.

Il file html vero e proprio deve contenere solo i riferimenti ai due precedenti files javascript, oltre naturalmente alla chiamata della/delle funzioni in esse contenute, con gli eventuali parametri da passare. Nel nostro caso tali parametri sono, come già detto:
  1. il file xml nel quale si trovano i dati (nel nostro caso books.xml)
  2. il nodo del file xml il cui contenuto si vuole visualizzare (nel nostro caso "title")
  3. l'identificativo del tag <div> nel quale si vuole iniettare il risultato. Nel nostro caso esso è "pippo" e la sintassi è <div id="pippo"/>
Ovviamente, nella pagina html deve essere presente il tag <div id="pippo"/>.

In particolare, questa suddivisione del lavoro consente al programmatore della pagina html di minimizzare le sue responsabilità e il suo carico di lavoro per concentrarsi solo ed esclusivamente sugli aspetti grafici e testuali. A titolo di esempio ho preparato questa seconda pagina html nella quale è presente, oltre alle quattro righe della prima (quelle evidenziate in giallo), molti altri contenuti, dei quali chi scrive l'html è responsabile. Basta, per visualizzare i dati del file xml in questa nuova pagina html, che egli si ricordi di inserire anche le suddette quattro righe.

martedì 24 marzo 2015

Il circuito RL in c.c.

Consideriamo il circuito in figura:

Sia Vg un generatore di tensione. Possiamo studiare tre casi:

Vg è costante
Vg è sinusoidale
Vg è un segnale qualsiasi

In questo post ci occuperemo del primo caso, in cui Vg è una tensione continua. Supporremo inoltre, per semplicità, che all'istante t=0 la corrente i nel circuito sia nulla.

Chiudendo il circuito in esso comincia a circolare corrente e si stabiliscono delle tensioni ai capi della resistenza R (cui ci riferiremo con il simbolo Vr) e dell'induttanza L (che indicheremo con Vn). Sia le tensioni che la corrente variano nel tempo. Noi vogliamo determinare il loro andamento.

Vale l'ovvia relazione:

Vg=Vr(t) + Vn(t)           [1]

il cui significato fisico è che, in ogni istante, la tensione esterna applicata Vg è uguale alla somma della caduta di tensione sulla resistenza (Vr) e della caduta di tensione sull'induttanza (Vn).

Sappiamo, dal corso di elettromagnetismo, che tra la corrente circolante in un'induttanza e la tensione ai suoi capi esiste la relazione:

Vn(t)= L*di(t)/dt           [2]

Gli studenti delle prime classi delle medie superiori ignorano il significato dell'espressione di(t)/dt, per cui è necessaria una spiegazione, almeno intuitiva. Essa indica il rapporto tra una variazione molto piccola della corrente che circola nell'induttanza, di(t), divisa per il piccolo tempo dt in cui tale variazione si verifica. E' ovvio che dobbiamo considerare la possibilità (ed in effetti in questo caso è così) che questo rapporto sia variabile con il tempo.

Ricordando la legge di ohm (la caduta di tensione ai capi di una resistenza è uguale al suo valore per la corrente che la attraversa), la [2] può dunque essere scritta così:

Vg= R * i(t) + L * di(t)/dt           [3]

Per risolvere questa equazione, che è detta differenziale ordinaria, i metodi algebrici conosciuti dagli studenti delle prime classi delle medie superiori non bastano. Possiamo procedere allora utilizzando due metodi.

Il primo, che scherzosamente mi piace chiamare "credere, obbedire, combattere" consiste nel fornire direttamente la soluzione; il secondo consiste nel risolvere l'equazione con il computer. Esaminiamoli entrambi.

Il metodo "credere, obbedire, combattere"


La soluzione della [3] è data dalla formula:

i(t) = Io * (1 - e-t/τ)       [4]

essendo:

Io=Vg/R        [5]

τ = L/R         [6]

Per la legge di ohm, Vr(t)=R * i(t), segue facilmente che:

Vr(t) = R * Io * (1 - e-t/τ      [7]


L'andamento di i(t) e Vr(t) è simile, ed è un esponenziale crescente.


Il metodo numerico


Esponiamo ora il metodo di risoluzione numerico, facendo uso di un foglio di calcolo. Il metodo consiste nel trovare il modo di calcolare il valore della corrente al tempo t+dt a partire dal valore della corrente al tempo t. Possiamo indicare la corrente al tempo t+dt con l'indice ik+1, e la corrente al tempo t con l'indice ik. Una volta trovata tale relazione, la si usa per calcolare la corrente dopo un tempo pari a 1 * dt a partire dalla corrente al tempo 0. Calcolata la corrente al tempo 1 * dt, si usa questo valore per calcolarla al tempo 2 * dt, e così via. Questo procedimento è detto iterativo.

Possiamo così scrivere:

di(t)/dt = (ik+1 -ik)/dt             [8]

e riscrivere la [3] di conseguenza:

Vg= R * ik + L *  (ik+1 -ik)/dt         [9]


Dopo qualche passaggio si ottiene:

ik+1 = ik + [(Vg - R * ik)/L] * dt                     [10]

Per dare inizio all'iterazione è necessario conoscere la corrente iniziale, quella al tempo t=o, che ha indice i0 (la quale, lo ricordiamo, è nulla). La [10] diventa così:

i1 = i0 + [(Vg - R * i0)/L] * dt = 0 + [(Vg - R * 0)/L] * dt  = Vg/L

Avviata l'iterazione si calcolano i valori successivi.

Il foglio excel con la simulazione è questo.

Nota del prof: il circuito in questione è di tipo derivativo (proverò a spiegarvi a voce cosa significa), ragion per cui la sua simulazione numerica presenta gravi problemi di instabilità, come si può verificare modificando i parametri R e L. 

mercoledì 18 marzo 2015

Telecomunicazioni: la relazione tra lunghezza d'onda, frequenza e velocità di un'onda.

Salve ragazzi. Questa è una leZZZioncina facile. Voglio diradare le nebbie su una formula semplice ma che, l'esperienza mi insegna, non è ben capita da voi giovani virgulti. E anche, se avanza il tempo (l'ora è tarda e fra un po' avrò sonno), fare qualche considerazione ulteriore sull'......eco. Un atto dovuto, visto che questo è il blog didattico dell'eco della rete.

Parliamo di onde sinusoidali.


Belle le onde sinusoidali, vero? Belle e morbide, fanno venire in mente pensierini celestiali. La distanza tra due picchi si chiama lunghezza d'onda. 

Ora immaginiamo di trovarci in mare aperto, su una barchetta piccola piccola, una specie di guscio microscopico, e che in lontananza ci sia un maremoto. Dopo un po' la nostra barchetta è investita dall'onda dello tsunami ma, siccome siamo in mare aperto, non veniamo travolti bensì sollevati in alto, fino ad un'altezza massima, poi cominciamo a scendere fino ad un minimo, poi risaliamo di nuovo alla massima altezza... e così via.

Stiamo sperimentando, è ovvio, un fenomeno periodico. Il tempo trascorso tra un istante e il successivo in cui ci troviamo in una stessa posizione, ad esempio l'altezza massima, si chiama periodo. Indichiamolo con la lettera T. 

Sappiamo che l'onda dello tsunami sta viaggiando. Con quale velocità? Per calcolarla possiamo misurare la distanza tra due picchi successivi (la lunghezza d'onda, che indichiamo con la lettera greca l). Deve valere l'ovvia relazione:

l = v * T = v/f    [1]

Nella [1] f è la frequenza, che è sempre l'inverso del periodo. La [1] ci dice che lo spazio percorso è uguale alla velocità per il tempo necessario a percorrerlo, oppure alla velovità diviso la frequenza. Dalla relazione precedente possiamo ricavare v:

v = l/T    [2]

Ricordando che il periodo è l'inverso della frequenza f, si conclude facilmente che:

v = l * f    [3]

La velocità è uguale al prodotto della lunghezza d'onda della pertubazione (distanza tra due picchi massimi) per la frequenza. Nel nostro caso la frequenza corrisponde al numero di volte al secondo in cui "vediamo il mondo dall'alto"... yeah!

Quanto detto vale per qualsiasi "perturbazione" che si propaghi nello spazio secondo una legge periodica, in particolare sinusoidale. Pertanto vale anche nel caso di "perturbazioni elettromagnetiche", altrimenti dette onde elettromagnetiche. Teniamolo a mente, ma torniamo al caso dell'onda dello tsunami.

Immaginiamo ora che, invece che su un piccolo guscio, noi siamo a bordo di una lunga canoa, di lunghezza paragonabile alla lunghezza d'onda dell'onda di tsunami. Il disegnino rende l'idea della differenza:



Dove vi sentireste più sicuri? Nel guscio o nella barca grande? 

Questo esempio dovrebbe farvi capire che il rapporto tra la lunghezza della barca su cui state, e la lunghezza d'onda della perturbazione, è un parametro essenziale. Indichiamo con L la lunghezza della barca. Il rapporto:

R = L/l          [4]
può essere molto minore di 1 (siete nel guscio) oppure circa 1 o addirittura maggiore. Se ricordiamo l'espressione della lunghezza d'onda, possiamo anche scrivere:

R = L/(v*T)           [5]

E siccome L/v è il tempo t che impiega l'onda a passare sotto la vostra barca, ecco che possiamo anche scrivere:

R = t/T             [6]

Quando R<<1, allora le dimensioni dell'oggetto "investito" dalla perturbazione sono molto minori della sua lunghezza d'onda. In tal caso lo studio del fenomeno è più semplice perché, con buona approssimazione, possiamo supporre che tutta sua la struttura sia soggetta alla stessa intensità di pertubazione. Quando ciò non è vero le cose si complicano.

Poiché, come già detto, le stesse considerazioni sono valide quale che sia la natura della "perturbazione", possiamo considerare il caso delle perturbazioni (onde) elettromagnetiche. Esaminiamo due casi tipici.

Impianto di distribuzione dell'energia elettrica in una civile abitazione.


In questo caso possiamo supporre che la lunghezza massima di un collegamento elettrico non superi i 50 metri. Sia dunque L=50 m.

La frequenza alla quale viene fornita l'energia elettrica è 50 hz. La velocità di propagazione nei cavi elettrici di rame v è circa 2*108 m/s. Ricordando la [1] abbiamo che:

l = v/f = 2*108/50 = 4000 km

Poiché 50 m rispetto a 4000 km sono un niente, siamo nella situazione del piccolo guscio. Tutta la struttura dell'impianto di alimentazione elettrica di una civile abitazione in ogni istante è sottoposta (salvo errori del tutto trascurabili) alla stessa intensità di perturbazione. Che è come dire, per capirci, che se ad un dato istante t la tensione al contatore ha un certo valore, ad esempio 180 volts, lo stesso valore lo si trova in qualsiasi presa, salvo un errore del tutto trascurabile.

Impianto per la distribuzione del segnale televisivo in un condominio.


Assumendo come lunghezza tipica dei cavi di collegamento L=100 m, ed essendo la frequenza di circa 10 Ghz, ripetendo il calcolo si ottiene:

l = v/f = 2*108/(1*1010) = 200 m

Questa volta la lunghezza d'onda e la lunghezza tipica dei collegamenti hanno valori confrontabili. Siamo dunque nella situazione della grande barca investita dall'onda di tsunami. Come se dice a Roma? So' cazzi!

Conclusione


La conclusione è che si è fatto tardi, ragion per cui le divagazioni sull'effetto eco le rimandiamo alla prossima. Studiate che prima o poi vi interrogo.

Nota: questo post, sebbene pubblicato, è in fase di compilazione e verrà ampliato al più presto. Lo pubblico perché mi serve già... da ieri.

martedì 17 marzo 2015

Informatica - Trasformazioni XSLT lato client

Nell'articolo Informatica - XML e trasformazioni XSLT abbiamo visto come sia possibile associare a un file dati in formato XML una trasformazione XSLT semplicemente aggiungendo una linea sotto la prima linea del file XML (quella che contiene la dichiarazione <?xml version="1.0"?>). La linea da aggiungere è (in rosso):

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://[percorso]/[nome del file]"?>

Ovviamente le parentesi quadre [ e ] vanno rimosse. Ad esempio potremmo scrivere:

<?xml-stylesheet type="text/xsl" href="http://www.w3schools.com/xsl/cdcatalog.xsl"?>

Molto spesso, tuttavia, è necessario decidere al volo (magari in base alle scelte dell'utente, o in funzione del tipo di dispositivo che richiede una pagina con i dati XML) la trasformazione XSLT più adatta. Questa trasformazione può essere eseguita sia lato server (elaborazione server-side) che lato client (elaborazione client-side). Oggi ci occuperemo del secondo caso, l'elaborazione client-side.

Nell'esempio che vi propongo, che potete testare a questo indirizzo, ho realizzato una semplice pagina html, contenente il seguente codice:

<html>
<head>

<script type="text/javascript" language="javascript" src="domXslt.js"></script>

</head>
<body>
<h2>La più grande collezione di dischi in vinile! Comprate peones, comprate! 
Acquisto con carta di credito prepagata.
</h2>

<select id="sel" onchange="displayResult(sel.value)">
  <option value="">Scegli il modello di formattazione</option>
  <option value="cdCatalog1.xsl">Modello ridotto</option>
  <option value="cdCatalog2.xsl">Modello esteso</option>
  <option value="cdCatalog3.xsl">Modello tabulare</option>
</select>

<div id="example"/>

</body>
</html>

Ho evidenziato in giallo tre parti della pagina che dobbiamo esaminare.

1) il tag "script".


Questo tag contiene un riferimento a un file (domXslt.js) che contiene il codice javascript che eseguirà la trasformazione. Questo codice viene richiamato dal browser nel momento in cui la pagina html viene caricata nella memoria del vostro dispositivo. Esso viene chiamato in esecuzione quando l'utente effettua una scelta tra le tre possibili che gli sono presentate (modello ridotto, modello esteso, modello tabulare).

2) il tag select


Questo tag ha l'effetto di creare nella pagina un elenco di scelta a discesa. L'utente può così selezionare il tipo di formattazione desiderata. Ogni voce del tag select (le quattro voci "option") ha un "value" (che è nascosto all'utente) e un'etichetta visibile. La prima voce "option" ha un value nullo, ad indicare che l'utente non ha effettuato nessuna scelta. In tal caso il risultato sarà una pagina vuota.

Si noti il fatto che il tag ha un attributo "id", il cui valore è posto uguale a "sel". Questo attributo serve ad identificare il tag in modo che ci si possa riferire ad esso. Il valore dell'attributo può essere scelto a piacere.

Si noti infine la presenza dell'attributo "onchange". Esso rappresenta il nome di un evento che viene generato dal browser quando l'utente effettua una selezione. Quando ciò accade viene eseguito il codice contenuto nella funzione  displayResult, alla quale viene passato il parametro sel.value, contenente il nome del file XSLT con cui effettuare la trasformazione.

3) il tag div


Questo tag crea un contenitore vuoto (quindi invisibile finché resta tale) nel quale verrà iniettato il risultato della trasformazione dell'XML in HTML, utilizzando il codice contenuto nel file XSLT selezionato dall'utente.

Quello che accade


Quando l'utente seleziona un modello di formattazione viene eseguita la funzione displayResult con l'opportuno parametro, e il risultato appare a schermo. Vi ricordo che la funzione displayResult è scritta in linguaggio javascript ed è contenuta nel file domXslt.js. E' decisamente troppo presto per esaminare questa funzione, ne riparleremo al momento opportuno. Quello che è importante osservare è che la realizzazione dell'intera procedura è stata divisa in tre parti. 
  • La scrittura della pagina HTML, contenete i tag opportuni.
  • La scrittura della trasformazione XSLT
  • La scrittura del codice javascript.
Per realizzare ognuna di esse, posto che i dati in formato XML siano disponibili (ad esempio perché provengono da un data-server) serve una specifica professionalità. In genere la scrittura della pagina HTML è curata da un grafico, mentre due distinti programmatori si occupano di scrivere la trasformazione XSLT e il codice javascript. Il tutto viene supervisionato da un sistemista.


Nota per i miei studentelli: con tutto il lavoro che faccio per voi, non vi passi per la testa di trattarmi così (Professore vittima dei bulli in classe - Cestino in testa e insulti contro di lui)! Vi stronco la carriera... ;-)

martedì 10 marzo 2015

Informatica - XML e trasformazioni XSLT


Cari ragazzi, in questo articolo vi spiegherò nel più semplice dei modi cosa sia l'XML e vi proporrò un esempio di utilizzo dei dati strutturati in XML che fa uso delle trasformazioni XSLT.

XML sta per eXtensible Markup Language, mentre XSLT sta per eXtensible Stylesheet Language Transformations.

Voi già sapete come è fatto un documento html, almeno nei suoi elementi essenziali. Sapete anche che ad un documento html possono essere associati degli stili, e addirittura dei fogli di stile, che modificano il modo in cui i diversi elementi della pagina html sono visualizzati (rendered).

Dobbiamo tuttavia domandarci: da dove arrivano i dati che sono visualizzati su una pagina html? In alcuni rari casi essi vengono scritti insieme alla pagina html, manualmente, da qualcuno che la compila. Se questo metodo fosse generalizzato vi sarebbe una sola alternativa: o una enorme richiesta di esperti di html e fogli di stile... oppure un numero enormemente inferiore di pagine html sul web. Come stiano le cose lo sapete: la richiesta di esperti di html e fogli di stile è piuttosto limitata (servono ben altre competenze per operare professionalmente in questo campo) mentre le pagine html sul web sono miliardi e miliardi. Dunque, chi le scrive?

La risposta è nel fatto che i dati vengono archiviati e gestiti in modo indipendente da come sono rappresentati. Per fare un esempio: le cravatte vengono prodotte nelle fabbriche di cravatte, poi ogni commerciante le espone come vuole nella sua vetrina.

I dati sono ospitati in sistemi chiamati DBMS (Data Base Management System), e le pagine web sono l'equivalente delle vetrine in cui i commercianti le espongono. L'analogia finisce qui perché, mentre nella vita reale serve almeno un commesso che sistemi le cravatte in vetrina o sugli scaffali, nel mondo dell'informatica anche i commessi sono virtuali, cioè a dire sono delle procedure automatiche. Sono cioè dei programmi che qualcuno ha scritto.

Il problema è complicato dal fatto che è necessario assicurare la massima capacità, ai dati che attraversano la rete Internet, di transitare in tutti i suoi nodi, indipendentemente dalla presenza di sistemi hardware e software diversi, come pure di sistemi firewall. Serve, cioè, un formato per il loro trasporto che sia considerato affidabile e sia compreso da qualsiasi sistema informatico. La soluzione è la codifica ASCII.

Dunque un set di dati in XML è codificato in ASCII. Tutto quello che è codificato in ASCII può andare ovunque, è come un tiepido venticello primaverile che nessuno teme, di per sé.

Nei DBMS non è detto che i dati siano codificati in ASCI, anzi spesso non lo sono. Dunque un set di dati, che serve per realizzare una pagina html, per poter transitare in tutta tranquillità sulla rete deve prima essere ricodificato in ASCII. Questa operazione si chiama "serializzazione", un'operazione in cui l'XML gioca un ruolo importante ma di cui non ci occuperemo per il momento.

Osservate lo schema seguente:



Quando voi chiedete una pagina web (digitando un indirizzo), la richiesta viene servita da un web-server. Se il web-server ha bisogno, per "servire" la pagina web, di attingere a dei dati, si rivolge a un suo collaboratore chiamato "application server". Questo è responsabile di effettuare la richiesta dei dati al DBMS. Affinché i dati possano viaggiare sulla rete che connette tutti gli attori sulla scena, senza "destare sospetti", è necessario, come detto, che siano codificati in ASCII. Fanno eccezione alcuni tipi di dati standard, ad esempio i documenti PDF e le immagini gif, jpg e png, che sono da tutti considerati sicuri, ma vi sarà capitato spesso di dover fornire un'autorizzazione per accettare alcuni tipi di dati, ad esempio i dati binari in files con estensione exe. L'uso dell'ASCII fa sì che voi e i sistemi intermedi non dobbiate continuamente analizzare e autorizzare ogni transito di dati. L'ASCII è considerato sicuro.

Tuttavia l'ASCII non basta. E' necessario che i dati abbiano una "struttura" per poter essere interpretati correttamente dai sistemi che devono gestirli. Questa struttura deve corredare i dati con dei metadati, cioè ulteriori informazioni che spiegano il loro significato. Facciamo un esempio considerando il seguente set di dati:

124,4
59,2
8,97
132

Vi dicono qualcosa? Ora guardateli in questa forma:
  • Altezza: 124,4 mm
  • Larghezza: 59,2 mm
  • Profondità: 8,97 mm
  • Peso: 132 grammi
Non è più chiaro? Abbiamo aggiunto ai dati, per renderli intellegibili, delle metainformazioni, cioè "informazioni sulle informazioni".

Ora, poiché è necessario che ci sia un metodo standard per aggiungere le metainformazioni alle informazioni, e il tutto deve essere codificato in ASCII, ecco che è stato sviluppato il linguaggio XML. In XML le metainformazioni sono distinte dai dati perché sono racchiuse all'interno dei simboli "<" e ">". Il nome delle metainformazioni è quello che viene chiamato "tag".


Anche l'HTML è scritto in XML


Chi decide come chiamare le metainformazioni, cioè i tag? Nel caso dell'HTML (ma non solo) la decisione spetta agli estensori dello standard HTML, cioè al w3c. In moltissimi casi però sono gli stessi programmatori che possono liberamente scegliere il nome dei tag, come meglio fa comodo a loro. Ad esempio, le informazioni precedenti potrebbero essere così impacchettate (strutturate):

<?xml version="1.0"?>
<oggetto>
<altezza unit="mm">124,4</altezza>
<larghezza unit="mm">59,2</larghezza>
<profondita unit="mm">8,97</profondita>
<peso unit="grammi">132</peso>
</oggetto>

Nulla impedirebbe di utilizzare tag diversi, ad esempio:


<?xml version="1.0"?>
<package>
<high unit="mm">124,4</high>
<width unit="mm">59,2</width>
<deep unit="mm">8,97</deep>
<weight unit="grams">132</weight>
</package>

La sola cosa importante è che il programma che riceve i dati conosca il significato dei tag usati dal programma che li ha confezionati per la spedizione. Ovvero che i due team di sviluppo si siano accordati.

Un esempio di dati in XML


Consideriamo questo file xml: cdcatalog.xml, di cui riporto una parte:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
.
.
</catalog>

Esso contiene le informazioni relative a un catalogo di dischi. Possiamo ragionevolmente immaginare che le informazioni siano inizialmente contenute in un DBMS, in forma binaria (non ASCII) e che l'application server (vedi figura), su richiesta del web server le debba reperite e successivamente impacchettate (serializzate) in formato xml. I dati giungono in questa forma al web server, il quale deve restituirli al browser che aveva inizialmente richiesto la pagina html contenente tali dati.

Tuttavia presentare i dati in questo modo non è il massimo dell'eleganza, né della leggibilità. In realtà il web server deve inserire questi dati all'interno di una pagina html, magari insieme con molti elementi e informazioni, e deve farlo in modo automatico. Per fare ciò il programmatore del web server ha a disposizione diverse tecnologie, anzi una miriade, una delle quali è costituita dalle trasformazioni XSLT.

Il programmatore del web server può creare una documento XSLT nel quale inserisce le direttive di formattazione dei dati in oggetto utilizzando un linguaggio chiamato XSLT. Questo file definisce il modo in cui i dati grezzi in XML verranno trasformati in HTML. Ecco un esempio di trasformazione XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
  <html>
  <body>
  <h2>My CD Collection</h2>
  <table border="1">
    <tr bgcolor="#9acd32">
      <th>Title</th>
      <th>Artist</th>
    </tr>
    <xsl:for-each select="catalog/cd">
    <tr>
      <td><xsl:value-of select="title"/></td>
      <td><xsl:value-of select="artist"/></td>
    </tr>
    </xsl:for-each>
  </table>
  </body>
  </html>
</xsl:template>
</xsl:stylesheet>

Si noti che nel file XSLT sono presenti anche dei tag tipici dell'HTML. Per applicare la trasformazione XSLT al file XML originario è sufficiente, a questo punto, aggiungere una sola riga al file XML originario (evidenziata in rosso nel seguito):

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://www.w3schools.com/xsl/cdcatalog.xsl"?>
<catalog>
  <cd>
    <title>Empire Burlesque</title>
    <artist>Bob Dylan</artist>
    <country>USA</country>
    <company>Columbia</company>
    <price>10.90</price>
    <year>1985</year>
  </cd>
.
.
</catalog>


Il risultato è questo:

My CD Collection

TitleArtist
Empire BurlesqueBob Dylan
Hide your heartBonnie Tyler
Greatest HitsDolly Parton
Still got the bluesGary Moore
ErosEros Ramazzotti
One night onlyBee Gees
Sylvias MotherDr.Hook
Maggie MayRod Stewart
RomanzaAndrea Bocelli
When a man loves a womanPercy Sledge
Black angelSavage Rose
1999 Grammy NomineesMany
For the good timesKenny Rogers
Big Willie styleWill Smith
Tupelo HoneyVan Morrison
SoulsvilleJorn Hoel
The very best ofCat Stevens
StopSam Brown
Bridge of SpiesT`Pau
Private DancerTina Turner
Midt om nattenKim Larsen
Pavarotti Gala ConcertLuciano Pavarotti
The dock of the bayOtis Redding
Picture bookSimply Red
RedThe Communards
Unchain my heartJoe Cocker

Nota: a causa di un mio errore, nel video una parte del testo (sulla sinistra) non compare. Chiedo scusa, ma credo che il tutto sia, comunque, comprensibile. Questa volta è andata così.