Indicatori XSD
Possiamo controllare COME gli elementi devono essere utilizzati nei documenti con indicatori.
Indicatori
Ci sono sette indicatori:
Indicatori dell'ordine:
- Tutto
- Scelta
- Sequenza
Indicatori di occorrenza:
- maxOccs
- min si verifica
Indicatori di gruppo:
- Nome del gruppo
- nome del gruppo attributo
Indicatori di ordine
Gli indicatori di ordine vengono utilizzati per definire l'ordine degli elementi.
Tutti gli indicatori
L'indicatore <all> specifica che gli elementi figlio possono apparire in qualsiasi ordine e che ogni elemento figlio deve verificarsi solo una volta:
<xs:element name="person">
<xs:complexType>
<xs:all>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:all>
</xs:complexType>
</xs:element>
Nota: quando si utilizza l'indicatore <all> è possibile impostare l'indicatore <minOccurs> su 0 o 1 e l'indicatore <maxOccurs> può essere impostato solo su 1 (i <minOccurs> e <maxOccurs> sono descritti più avanti).
Indicatore di scelta
L'indicatore <choice> specifica che può verificarsi un elemento figlio o un altro:
<xs:element name="person">
<xs:complexType>
<xs:choice>
<xs:element name="employee" type="employee"/>
<xs:element name="member" type="member"/>
</xs:choice>
</xs:complexType>
</xs:element>
Indicatore di sequenza
L'indicatore <sequence> specifica che gli elementi figlio devono apparire in un ordine specifico:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
Indicatori di occorrenza
Gli indicatori di occorrenza vengono utilizzati per definire la frequenza con cui un elemento può verificarsi.
Nota: per tutti gli indicatori "Ordine" e "Gruppo" (qualsiasi, tutti, scelta, sequenza, nome del gruppo e riferimento al gruppo) il valore predefinito per maxOccurs e minOccurs è 1.
Indicatore maxOccurs
L'indicatore <maxOccurs> specifica il numero massimo di volte in cui un elemento può verificarsi:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="full_name" type="xs:string"/>
<xs:element name="child_name" type="xs:string" maxOccurs="10"/>
</xs:sequence>
</xs:complexType>
</xs:element>
L'esempio sopra indica che l'elemento "child_name" può verificarsi almeno una volta (il valore predefinito per minOccurs è 1) e un massimo di dieci volte nell'elemento "person".
Indicatore minOccurs
L'indicatore <minOccurs> specifica il numero minimo di volte in cui un elemento può verificarsi:
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="full_name" type="xs:string"/>
<xs:element name="child_name" type="xs:string"
maxOccurs="10" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
L'esempio sopra indica che l'elemento "child_name" può comparire un minimo di zero volte e un massimo di dieci volte nell'elemento "person".
Suggerimento: per consentire a un elemento di apparire un numero illimitato di volte, utilizzare l'istruzione maxOccurs="unbounded":
Un esempio funzionante:
Un file XML chiamato "Myfamily.xml":
<?xml version="1.0" encoding="UTF-8"?>
<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="family.xsd">
<person>
<full_name>Hege Refsnes</full_name>
<child_name>Cecilie</child_name>
</person>
<person>
<full_name>Tove Refsnes</full_name>
<child_name>Hege</child_name>
<child_name>Stale</child_name>
<child_name>Jim</child_name>
<child_name>Borge</child_name>
</person>
<person>
<full_name>Stale Refsnes</full_name>
</person>
</persons>
Il file XML sopra contiene un elemento radice chiamato "persone". All'interno di questo elemento radice abbiamo definito tre elementi "persona". Ogni elemento "person" deve contenere un elemento "full_name" e può contenere fino a cinque elementi "child_name".
Ecco il file di schema "family.xsd":
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="persons">
<xs:complexType>
<xs:sequence>
<xs:element name="person" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="full_name" type="xs:string"/>
<xs:element name="child_name" type="xs:string"
minOccurs="0" maxOccurs="5"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Indicatori di gruppo
Gli indicatori di gruppo vengono utilizzati per definire insiemi di elementi correlati.
Gruppi di elementi
I gruppi di elementi sono definiti con la dichiarazione di gruppo, in questo modo:
<xs:group name="groupname">
...
</xs:group>
È necessario definire un elemento all, choice o sequence all'interno della dichiarazione di gruppo. L'esempio seguente definisce un gruppo denominato "persongroup", che definisce un gruppo di elementi che devono verificarsi in una sequenza esatta:
<xs:group name="persongroup">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="birthday" type="xs:date"/>
</xs:sequence>
</xs:group>
Dopo aver definito un gruppo, puoi fare riferimento ad esso in un'altra definizione, come questa:
<xs:group name="persongroup">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="birthday" type="xs:date"/>
</xs:sequence>
</xs:group>
<xs:element name="person" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:group ref="persongroup"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
Gruppi di attributi
I gruppi di attributi sono definiti con la dichiarazione attributeGroup, in questo modo:
<xs:attributeGroup name="groupname">
...
</xs:attributeGroup>
L'esempio seguente definisce un gruppo di attributi denominato "personattrgroup":
<xs:attributeGroup name="personattrgroup">
<xs:attribute name="firstname" type="xs:string"/>
<xs:attribute name="lastname" type="xs:string"/>
<xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>
Dopo aver definito un gruppo di attributi, puoi fare riferimento ad esso in un'altra definizione, come questa:
<xs:attributeGroup name="personattrgroup">
<xs:attribute name="firstname" type="xs:string"/>
<xs:attribute name="lastname" type="xs:string"/>
<xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>
<xs:element name="person">
<xs:complexType>
<xs:attributeGroup ref="personattrgroup"/>
</xs:complexType>
</xs:element>