A partire da una grammatica definita tramite uno XML Schema, è possibile sfruttare un parser XML validante per verificare la validità di un documento XML. Il parser avrà bisogno, quindi, sia del documento XML da validare, sia dello schema XML rispetto a cui effettuare la validazione.
Ci sono diversi modi per fornire al parser informazioni sullo schema da utilizzare per la validazione. Uno di questi modi consiste nell'inserire nel documento XML un riferimento allo schema da utilizzare. Questo riferimento viene associato all'elemento root come nel seguente esempio:
<articolo
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="articolo.xsd"
titolo="Guida ad XML"
>
Oltre allìattributo titolo sono stati aggiunti due attributi predefiniti.
L'attributo xmlns:xsi indica un URL che specifica la modalità con cui si indicherà il riferimento allo schema XML. L'attributo xsi:noNamespaceSchemaLocation indica il nome e l'eventuale percorso del file contenente lo schema XML di riferimento.
Una delle caratteristiche auspicabili nella creazione di un nuovo linguaggio è la possibilità di integrare elementi derivanti da grammatiche diverse. Questa caratteristica consente di riutilizzare parti di grammatiche già definite evitando di dover rifare parte di lavoro già fatto in altri ambiti.
In questo modo, ad esempio, sarebbe possibile integrare un linguaggio per la descrizione di articoli tecnici con un linguaggio pre-esistente per la descrizione di bibliografie, ottenendo un nuovo linguaggio composto. Tuttavia la composizione di linguaggi pone almeno due tipi di problemi:
- un documento che utilizza due grammatiche presenta il problema della validazione: a quale schema si deve fare riferimento per validare un documento XML "ibrido"?
- due linguaggi potrebbero avere tag ed attributi con lo stesso nome, anche se utilizzabili in contesti diversi: come fare a risolvere questo tipo di ambiguità?
La soluzione a questi problemi deriva dai namespace. Un namespace è un insieme di nomi di elementi e nomi di attributi identificati univocamente da un identificatore.
L'identificatore univoco individua l'insieme dei nomi distinguendoli da eventuali omonimie in altri namespace. Per fare un esempio, se nell'ambito di una grammatica per descrivere dei dati anagrafici è stato definito un elemento indirizzo, questo nome potrebbe essere confuso con l'elemento indirizzo definito nell'ambito di una grammatica che descrive messaggi di posta elettronica. L'identificatore del relativo namespace consente di distinguere i due elementi omonimi.
Il concetto non è nuovo nell'informatica: ad esempio, quando definiamo i nomi dei campi in una tabella di un database abbiamo definito un namespace. Non possiamo avere campi con lo stesso nome all'interno di una tabella, ma possiamo avere gli stessi nomi in tabelle diverse. Possiamo risolvere l'ambiguità tra due campi omonimi facendoli precedere dal nome della tabella (il namespace).
Nell'ambito delle tecnologie XML, un XML Schema definisce implicitamente un namespace degli elementi e degli attributi che possono essere usati in un documento XML.
Se in un documento XML si utilizzano elementi definiti in schemi diversi abbiamo bisogno di un meccanismo che permetta di identificare ciascun namespace e il relativo XML Schema che lo definisce.