XML Schema introduce il concetto di tipo di dato semplice per definire gli elementi che non possono contenere altri elementi e non prevedono attributi. Si possono usare tipi di dato semplici predefiniti oppure è possibile personalizzarli.
Sono previsti numerosi tipi di dato predefiniti, alcuni dei quali sono riportati nella seguente tabella:
|
Ad esempio, la seguente dichiarazione:
<xs:element name="quantita" type="xs:integer" />
permette l'utilizzo dell'elemento quantita in un documento XML consentendo soltanto un contenuto di tipo intero. In altre parole, sarà considerato valido l'elemento <quantita>123</quantita> mentre non lo sarà l'elemento <quantita>uno</quantita>.
XML Schema prevede anche la possibilità di definire tipi di dato semplici personalizzati come derivazione di quelli predefiniti. Se, ad esempio, abbiamo bisogno di limitare il valore che può essere assegnato all'elemento <quantita> possiamo definirlo nel seguente modo:
<xs:element name="quantita" >
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="1" />
<xs:maxInclusive value="100" />
</xs:restriction>
</xs:simpleType>
</xs:element>
In altre parole, la dichiarazione indica che l'elemento <quantita> è di tipo semplice e prevede una restrizione sul tipo di dato intero predefinito accettando valori compresi tra 1 e 100.
I tipi di dato complessi si riferiscono ad elementi che possono contenere altri elementi e possono avere attributi. Definire un elemento di tipo complesso corrisponde a definire la relativa struttura.
Lo schema generale per la definizione di un elemento di tipo complesso è il seguente:
<xs:element name="NOME_ELEMENTO">
<xs:complexType>
... Definizione del tipo complesso ...
... Definizione degli attributi ...
</xs:complexType>
</xs:element>
Se l'elemento può contenere altri elementi possiamo definire la sequenza di elementi che possono stare al suo interno utilizzando uno dei costruttori di tipi complessi previsti:
- <xs:sequence> Consente di definire una sequenza ordinata di sottoelementi
- <xs:choice> Consente di definire un elenco di sottoelementi alternativi
- <xs:all> Consente di definire una sequenza non ordinata di sottoelementi
Per ciascuno di questi costruttori e per ciascun elemento è possibile definire il numero di occorrenze previste utilizzando gli attributi minOccurs e maxOccurs. Ad esempio, se l'elemento testo può essere presente una o infinite volte all'interno di un paragrafo possiamo esprimere questa condizione nel seguente modo:
<xs:element name="paragrafo">
<xs:complexType>
<xs:element name="testo" minOccurs="1"
maxOccurs="unbounded"/>
</xs:complexType>
</xs:element>
In questo caso il valore unbounded indica che non è stabilito un massimo numero di elementi testo che possono stare all'interno di un paragrafo.
La definizione della struttura di un elemento è ricorsiva, cioè contiene la definizione di ciascun elemento che può stare all'interno della struttura stessa.
Per gli elementi vuoti è prevista una definizione basata sul seguente schema:
<xs:element name="NOME_ELEMENTO">
<xs:complexType>
<xs:complexContent>
<xs:extension base="xs:anyType" />
... Definizione degli attributi ...
</xs:complexContent>
</xs:complexType>
</xs:element>
In altri termini, un elemento vuoto è considerato un elemento di tipo complesso il cui contenuto non si basa su nessun tipo predefinito.
La definizione degli attributi è basata sull'uso del tag <xs:attribute>, come nel seguente esempio:
<xs:attribute name="titolo" type="xs:string" use="required" />
L'attributo use consente di specificare alcune caratteristiche come la presenza obbligatoria (required) o un valore predefinito (default) in combinazione con l'attributo value. Ad esempio, la seguente definizione indica un attributo il cui valore di predefinito è test:
<xs:attribute name="titolo" type="xs:string" use="default" value="test" />
Bisogna tener presente che se non si specifica esplicitamente l'obbligatorietà dell'attributo, esso è considerato opzionale. Il seguente codice presenta uno XML Schema relativo al linguaggio di descrizione di articoli tecnici mostrato nei vari esempi.
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="articolo">
<xs:complexType>
<xs:sequence>
<xs:element name="paragrafo" maxOccurs="unbounded">
<xs:complexType>
<xs:all maxOccurs="unbounded">
<xs:element name="immagine" minOccurs="0">
<xs:complexType>
<xs:attribute name="file"
use="required">
<xs:simpleType>
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="testo"/>
<xs:element name="codice" minOccurs="0"/>
</xs:all>
<xs:attribute name="titolo" type="xs:string"
use="optional"/>
<xs:attribute name="tipo" use="optional">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="abstract"/>
<xs:enumeration
value="bibliografia"/>
<xs:enumeration value="note"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="titolo" type="xs:string"
use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
Questo XML Schema è equivalente al Dtd che abbiamo visto nella lezione n.7 "Dtd: Document Type Definition" .