• Non ci sono risultati.

3.4 Sintassi di Xml-Schema

3.4.21 Chiavi, riferimenti a chiave a valori unici

Xml-Schema permette, tramite gli elementi unique, key e keyref di specificare valori di chiave, riferimenti a chiavi e chiavi candidate (valori unici). Questi elementi rapp-resentano un netto miglioramento rispetto agli attributi ID ed IDREF usati nelle DTD, infatti, mentre con IDREF si indicava solamente la presenza di un riferimanto ad una chiave senza specificare esattamente a quale, con la coppia key e keyref si conosce esattamente l’abbinamento voluto. Per spiegare meglio questi concetti ed il loro uti-lizzo ripropongo l’esempio completo sull’ordine d’acquisto con l’aggiunta di chiavi ed elementi unici.

Esempio 3:

<xsd: schema xmlns:xsd=”http :// www.w3.org/2001/XMLSchema”>

<xsd:element name=”OrdiniEPromozioni”

type=”OrdiniEPromozioniType”/>

<xsd:element name=”Commento” type=”xsd:string”/>

<xsd:complexType name=”OrdiniEPromozioniType”>

< xsd:element name =”Ordine” type=”OrdineType” minOccurs=”0”

maxOccurs=”unbounded”/>

< xsd:element name =”Promozione” type=”PromozioneType”

minOccurs=”0” maxOccurs=”unbounded”/>

</xsd:complexType>

<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>

<xsd:complexType name=”IndirizzoType”>

< xsd:element name =”Stato” type=”xsd: string ”/> < xsd:element name =”Citt`a ” type=”xsd: string ”/>

< xsd:element name =”Via” type=”xsd: string ”/> < xsd:element name=”Numero” type=”xsd:int”/> </xsd:complexType>

<xsd:complexType name=”OggettoType”>

< xsd:element name =”CodiceOggetto” type=”xsd: positiveInteger ”/> < xsd:element name =”Nome” type=”xsd:string”/>

< xsd:element name =”Quantit`a” type=”Quantit`aType”/> < xsd:element name =”PrezzoEuro” type=”xsd:decimal”/> < xsd:element name =”InPromozione” type=”xsd: string ”> < xsd:element ref =”Commento” minOccurs=”0”/> </xsd:complexType> <xsd:simpleType name=”Quantit`aType”> <xsd: restriction base=”xsd: positiveInteger ”> <xsd:maxExclusive value=”100”/> </xsd: restriction > </xsd:simpleType> <xsd:complexType name=”PromozioneType”>

< xsd:element name =”Nome” type=”xsd:string”/> < xsd:element name =”ScontoPercentuale”

type=”xsd: postiveInteger ”/>

< xsd:element name =”DataDiInizio” type=”xsd:date”/> < xsd:element name=”Durata” type=”xsd:duration”/> </xsd:complexType>

<xsd:unique name=”NomeUnico”>

< xsd: selector xpath= ”/OrdiniEPromozioni/Ordine/Oggetto”/> < xsd: field xpath=”CodiceOggetto”/>

<xsd:unique>

<xsd:key name=”NomePromozione”>

< xsd: selector xpath= ”/OrdiniEPromozioni/Promozione”/> < xsd: field xpath=”Nome”/>

<xsd:keyref name=”RifPromozione refer=”NomePromozione ”> < xsd: selector xpath= ”/OrdiniEPromozioni/Ordine/Oggetto”/> < xsd: field xpath=”InPromozione”/>

<xsd:keyref>

</xsd:schema>

Nell’esempio `e stato aggiunto un elemento Promozione ed un elemento PromozioneE-Ordini che serve solamente a contenere i vari oggetti dello schema. Sono state inserite anche la definizione di un nome unico (chiave candidata), una chiave vera e propria ed un riferimento alla chiave per creare una relazione fra gli elemento Oggetto e Pro-mozione. Vediamo che sono stati usati gli elementi unique, key e keyref composti tutti da un campo selector ed uno field. Il sottoelemento selector serve per specificare il campo di validit`a della chiave, del riferimento o della chiave candidata, mentre field fa riferimento all’elemento o all’attributo che, insieme al percorso dato dall’attributo

xpath di selector, rappresenta il nome unico (o il riferimento ad esso). Entrambi gli

el-ementi selector e field devono possedere un attributo xpath che rappresenta, appunto, una espressione nell’apposito linguaggio Xpath 1.0[10] atto a navigare fra gli elemen-ti di un documento Xml come fra i nodi di un albero. Per capire meglio consideriamo la dichiarazione di NomeUnico:

<xsd:unique name=”NomeUnico”>

< xsd: selector xpath= ”/OrdiniEPromozioni/Ordine/Oggetto”/ > < xsd: field xpath=”Codice”/>

<xsd:unique>

La chiave candidata `e rappresentata dall’elemento Codice, il cui valore che deve es-sere unico fra tutti quelli contenuti negli elementi Oggetto (il campo validit`a `e dato dalla stringa xpath /OrdiniEPromozioni/Ordine/Oggetto). La definizione dell’elemen-to chiave `e identica a quella dell’elemendell’elemen-to unico mentre il riferimendell’elemen-to alla chiave RifPromozione presenta un attributo refer che contiene il nome della chiave cui si fa riferimento, NomePromozione nel caso specifico. Vediamo come pu`o risultare il documenti Xml istanza dello schema in esempio 3:

<Ordine Data=”2002−11−01”> <Indirizzo>

<Stato> Italia </Stato> <Citt`a>Modena</Citt`a> <Via>NomeVia</Via> <Numero>56</Numero> </ Indirizzo > <Oggetto> <Codice>244</Codice> <Nome>Monitor</Nome> <Quantit`a>10</Quantit`a> <PrezzoEuro>255.25</PrezzoEuro> <Commento>Monitor LCD 15 pollici</Commento> <InPromozione>Promozione A</InPromozione> </Oggetto> <Oggetto> <Codice>59</Codice> <Nome>Tastiera</Nome> <Quantit`a>10</Quantit`a> <PrezzoEuro15.25</PrezzoEuro> <InPromozione>Promozione B</InPromozione> </Oggetto> </Ordine> <Promozione> <Nome>Promozione A</Nome> <ScontoPercentuale>10</ScontoPercentuale> <DataDiInizio>2002−11−20</DataDiInizio> <Durata> P1Y2M3DT10H30M12.0S </Durata> </Promozione>

<Promozione>

<Nome>Promozione B</Nome>

<ScontoPercentuale>7</ScontoPercentuale> <DataDiInizio>2002−11−20</DataDiInizio> <Durata> P1Y2M3DT10H30M12.0S </Durata>

</Promozione>

<OrdiniEPromozioni>

Da questa istanza si nota bene il funzionamento delle chiavi e dei riferimenti ad essi, si pu`o infatti osservare come il contenuto degli elementi InPromozione (riferi-mento e chiave) presenti solo valori contenuti negli elementi Nome di Promozione (chiave). Si possono cos`ı mettere in relazione le due entit`a Promozione e Oggetto.