Visibilità ed estensione

La possibilità di definire nuovi tipi di dato richiede necessariamente l’esistenza di un sistema di visibilità, o contesto dei componenti dichiarati, in grado di ricalcare i concetti di variabile locale e globale presenti in molti altri linguaggi di programmazione. In XML i componenti definiti a livello massimo (o radice) assumono visibilità globale, mentre gli elementi definiti più internamente assumono visibilità via via più locale.

Secondo le specifiche del linguaggio XML Schema i nomi degli elementi devono essere univoci all’interno del contesto in cui compaiono, questo significa che in contesti diversi è possibile definire elementi con lo stesso nome ma con struttura differente. Va tuttavia considerato il fatto che solo gli elementi globali potranno essere referenziati e, ad esempio, riutilizzati.

Gli XML Schema permettono anche la dichiarazione di un nuovo tipo di dato complesso a partire da un tipo di dato precedentemente dichiarato. Nell’esempio seguente viene definito un nodo “impiegato” basato sul tipo di dato complesso userFullInfo, che è a sua volta esteso a partire dal tipo di dato complesso userBaseInfo. Il nodo “impiegato” potrà così vantare tutti i seguenti attributi: nome, cognome, via, citta e provincia. L’estensione del tipo di dato avviene mediante il costruttore “extension”.

Esempio di estensione del tipo di dato userBaseInfo:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="impiegato" type="userFullInfo"/>
  <xs:complexType name="userBaseInfo">
    <xs:sequence>
      <xs:element name="nome" type="xs:string"/>
      <xs:element name="cognome" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="userFullInfo">
    <xs:complexContent>
      <xs:extension base="userBaseInfo">
        <xs:sequence>
          <xs:element name="via" type="xs:string"/>
          <xs:element name="citta" type="xs:string"/>
          <xs:element name="provincia" type="xs:string"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

Unicità, chiavi e riferimenti

Ampliando la notazione XML Schema con i concetti introdotti dal linguaggio xPath è possibile esprimere concetti avanzati come la presenza di vincoli di unicità e di riferimento. La dichiarazione di un vincolo di unicità prevede l’uso della seguente notazione:

<unique id=ID name=Name any attributes>
  (annotation?,(selector,field+))
</unique>

La definizione di un vincolo di unicità richiede:

  • attribute name, la definizione di un nome per quest’ultimo;
  • selector, la presenza di un campo specificante, secondo lo standard xPath, il nodo a cui si vuole applicare il vincolo. Non è possibile collegare un vincolo a diversi nodi;
  • field, la presenza di uno o più campi field per la definizione del contesto.

Il seguente schema definisce la struttura del nodo “autori” contenente i nodi “autore” e “ultima_modifica”. La presenza del vincolo uniqueAutore impedisce l’inserimento all’interno del nodo “autori” di due nodi “autore” contenenti le stesse informazioni.

<xs:element name="autori">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="autore" maxOccurs="unbounded" type="xs:string"/>
        <xs:element name="ultima_modifica" type="xs:date" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
    <xs:unique name="uniqueAutore">
      <xs:selector xpath="autore"/>
      <xs:field xpath="autori"/>
    </xs:unique>
  </xs:element>

La dichiarazione di un elemento chiave (key) definisce l’unicità e l’obbligatorietà di presenza per l’elemento o l’attributo specificato. La dichiarazione di un vincolo di chiave prevede l’uso della seguente notazione:

<key id=ID name=Name any attributes>
  (annotation?,(selector,field+))
</key>

Come per il vincolo di unicità la definizione di un vincolo di chiave richiede:

  • attribute name, la definizione di un nome per quest’ultimo;
  • selector, la presenza di un campo specificante, secondo lo standard xPath, il nodo a cui si vuole applicare il vincolo. Non è possibile collegare un vincolo a diversi nodi;
  • field, la presenza di uno o più campi field per la definizione del contesto.

La dichiarazione di un elemento riferimento a chiave prevede l’uso della seguente notazione:

<keyref id=ID name=Name refer=REFName any attributes >
  (annotation?,(selector,field+))
</keyref>

La definizione di un elemento riferimento richiede:

  • attribute name, la definizione di un nome per quest’ultimo;
  • attribute refer, il riferimento a un vincolo di chiave (il nome di quest’ultimo);
  • selector, la presenza di un campo specificante, secondo lo standard xPath, il nodo a cui si vuole applicare il vincolo. Non è possibile collegare un vincolo a diversi nodi;
  • field, la presenza di uno o più campi field per la definizione del contesto.