Gruppi

Per facilitare il processo di creazione e di riuso degli elementi XML negli XML Schema sono state introdotte delle entità dette “gruppi”, esse permettono la dichiarazione di un insieme di elementi e il loro successivo riutilizzo all’interno del corpo del programma. La dichiarazione di un nuovo gruppo avviene mediante l’utilizzo del costruttore “group”, tale dichiarazione non può avvenire in linea all’interno della costruzione di un nodo.

<!-- elemento XML -->
<libreria>
  <libro>
    <titolo>Guida Galattica per autostoppisti</titolo>
    <autore>Douglas Adams</autore>
    <data>12 ottobre 1979</data>
  </libro>
</libreria>
<!-- definizione dell'elemento -->
<xs:element name="libreria">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="libro" maxOccurs="unbounded">
        <xs:complexType>
          <xs:group ref="elemento_libro"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>
<xs:group name="elemento_libro">
  <xs:sequence>
    <xs:element name="titolo" type="xs:string"/>
    <xs:element name="autore" type="xs:string" maxOccurs="unbounded"/>
    <xs:element name="data" type="xs:string"/>
  </xs:sequence>
</xs:group>
</xs:schema>

Costruttore ANY

Il costruttore “any” viene utilizzato per definire elementi la cui struttura interna non è nota a priori. Ad esempio, con il seguente XML Schema stiamo definendo un nodo “persona” contenente un elemento “nome”, un elemento “cognome” e zero o più elementi di altra natura:

<xs:element name="persona">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="nome" type="xs:string"/>
      <xs:element name="cognome" type="xs:string"/>
      <xs:any minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Scegliendo di definire un secondo elemento figlio come segue:

<xs:element name="figlio">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="nome_figlio" type="xs:string" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Potremmo creare un documento XML con le seguenti caratteristiche:

<persona>
  <nome>Hege</nome>
  <cognome>Refsnes</cognome>
  <figlio>
    <nome_figlio>Cecilie</nome_figlio>
  </figlio>
</persona>

Un processo molto simile può essere utilizzato per la dichiarazione degli attributi, si veda il seguente esempio rappresentante un XML Schema per un documento XML:

<xs:element name="persona">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="nome" type="xs:string"/>
      <xs:element name="cognome" type="xs:string"/>
    </xs:sequence>
    <xs:anyAttribute/>
  </xs:complexType>
</xs:element>
<xs:attribute name="sesso">
  <xs:simpleType>
    <xs:restriction base="xs:string">
      <xs:pattern value="maschio|femmina"/>
    </xs:restriction>
  </xs:simpleType>
</xs:attribute>

L’utilizzo del costruttore anyAttribute permette la specifica di un qualsiasi attributo per l’elemento indicato.

<persona sesso="femmina">
  <nome>Hege</nome>
  <cognome>Refsnes</cognome>
</persona>