• Non ci sono risultati.

3.4 Sintassi di Xml-Schema

3.4.17 Ereditariet`a in Xml-Schema

Xml-Schema fornisce due metodi per derivare nuovi oggetti a partire da oggetti gi`a definiti:

• Derivazione per Restrizione • Derivazione per Estensione

Alcuni esempi e metodologie di derivazione per restrizione sono gi`a state fornite quando si `e parlato di creazione di nuovi tipi semplici per restrizione; `e possibile creare anche nuovi tipi complessi in questa maniera, mentre non `e possibile creare nuovi tipi semplici per estensione di contenuto. L’estensione di contenuto, infatti, espande un tipo di dato precedente aggiungendo i nuovi elementi o attributi definiti nell’espansione (un tipo semplice non pu`o avere elementi o attributi). Quindi, ricapi-tolando, `e possibile derivare un nuovo tipo di dato complesso sia tramite la restrizione che tramite l’espansione, mentre per quanto riguarda i dati semplici, `e possibile usare solamente la restrizione. Dato che la parte riguardante l’ereditariet`a dei tipi semplici

`e gi`a stata descritta nel capitolo intitolato -I TIPI SEMPLICI DERIVATI- verranno di seguito spiegate solamente le regole riguardanti quelli complessi.

• Nuovi tipi complessi ottenuti per Estensione

Ovviamente un nuovo tipo di dato complesso deve essere dichiarato a partire dall’elemento complexType, subito dopo, per`o, bisogna indicare se vogliamo derivare da un tipo semplice (utilizzando l’elemento simpleContent) o comp-lesso (utilizzando complexContent) e poi usare l’elemento extension. Nell’at-tributo base di extension bisogna inserire il nome del tipo da cui si deriva e, all’interno dello stesso tag extension, si inseriscono i nuovi elementi e attributi che si desidera aggiungere all’elemento padre. E’ importante notare che se si specifica il modello di contenuto come simpleContent si possano aggiungere so-lamente attributi e non elementi; un contenuto semplice, infatti, `e previsto essere solamente testuale e privo di elementi innestati. Il nuovo modello di contenu-to risulta essere quindi l’unione del contenucontenu-to del tipo specificacontenu-to nell’attribucontenu-to

base con il nuovo contenuto compreso nel tag extension. Se si deriva a partire

da un tipo semplice si possono aggiungere solamente attributi al suo contenuto. Supponiamo di volere estendere il contenuto del tipo complesso OggettoType (esempio 1 ) per poter considerare novit`a che devono ancora uscire sul mercato.

<xsd:complexType name=”OggettoType”>

< xsd:element name =”Nome” type=”xsd:string”/> < xsd:element name =”Quantit`a” type=”Quantit`aType”/> < xsd:element name =”PrezzoEuro” type=”xsd:decimal”/> < xsd:element ref =”Commento” minOccurs=”0”/> </xsd:complexType>

<xsd:complexType name=”OggettoNovit`a”> <xsd:complexContent>

<xsd:extension base=”OggettoType”>

< xsd:element name =”DataDiUscita” type=”xsd:data”/>

< xsd: attribute name =”Novit`a” type=”xsd:boolean ” fixed =”true”/> </xsd: extension >

</xsd:complexContent> </xsd:complexType>

All’interno di un documento Xml istanza un elemento del tipo OggettoNovit`a puo essere dichiarato in modo normale oppure comparire al posto di un elemen-to di tipo Oggetelemen-toType, vediamo come:

<Ordine> ... <Oggetto> <Nome>Tastiera</Nome> <Quantit`a>10</Quantit`a> <PrezzoEuro>15.25</PrezzoEuro> </Oggetto> ...

<Oggetto xsi: type=”OggettoNovit`a” Novit`a=”true”> <Nome>TastieraNuova</Nome> <Quantit`a>5</Quantit`a> <PrezzoEuro>26.25</PrezzoEuro> <DataDiUscita>2002−11−15</DataDiUscita> </Oggetto> ... </Ordine>

il tipo derivato usato deve essere comunque specificato tramite l’utilizzo

dell’at-tributo xsi:type che fa riferimento al namespace http://www.w3.org/2001/XMLSchema-instance. Si `e parlato precedentemente di nuovi tipi complessi ottenuti per

estensione di contenuto a partire da un tipo semplice, un esempio di questo processo pu`o essere il seguente:

<xsd:complexType name=”PrezzoType”> <xsd:simpleContent>

<xsd:extension base=”xsd:decimal”>

< xsd: attribute name =”Tipo” type=”xsd: string ” required =”true”/> </xsd: extension >

</xsd:simpleContent> </xsd:complexType>

le definizioni di questo tipo servono per creare elementi con un contenuto sostanzial-mente semplice ma che possono avere attributi. Per capire meglio il

funziona-mento di questo concetto viene di seguito presentata una possibile istanza Xml (supponendo che l’elemento prezzo sia di tipo Prezzo Type):

<Prezzo Tipo=”Euro”>34.65<Prezzo/>

• Nuovi tipi complessi ottenuti per Restrizione

Oltre che derivare nuovi tipi complessi estendendo un modello di contenuto `e possibile anche effettuare l’operazione opposta, derivando restringendo il mod-ello di contenuto. Il procedimento `e concettualmente simile alla creazione di nuovi tipi semplici per restrizione. Un oggetto complesso ottenuto in questa maniera `e molto simile al suo tipo di base ma le dichiarazioni presenti al suo interno sono maggiormente limitate. Consideriamo as esempio il seguente tipo complesso OrdineType:

<xsd:complexType name=”OrdineType”>

< xsd:element name =”Indirizzo” type=”IndirizzoType”/>

< xsd:element name =”Oggetto” type=”OggettoType” minOccurs=”1”

maxOccurs=”unbounded”/>

< xsd:element ref =”Commento” minOccurs=”0” /> < xsd: attribute name =”Data” type=”xsd:date”/> </xsd:complexType>

una possibile restrizione `e:

<xsd:complexType name=”OrdineStock”> <xsd:complexContent>

<xsd: restriction base=”OrdineType”>

< xsd:element name =”Indirizzo” type=”IndirizzoType”/>

< xsd:element name =”Oggetto” type=”OggettoType” minOccurs=”50”

maxOccurs=”100”/>

< xsd:element ref =”Commento” minOccurs=”0” /> < xsd: attribute name =”Data” type=”xsd:date”/> </xsd: restriction >

</xsd:complexContent> </xsd:complexType>

possiamo notare come le dichiarazioni di elementi presenti all’interno del nuo-vo tipo OrdineStock sono pi`u vincolate rispetto a quelle di OrdineType, infatti `e possibile avere un numero di elementi Oggetto fra 50 e 100, range pi`u ristret-to rispetristret-to a quello presente in OrdineType che spazia da 1 a infiniristret-to. Tramite questo procedimento `e possibile eliminare gli elementi opzionali, come Com-mento, eliminando la loro dichiarazione all’interno della definizione del tipo derivato.