Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
(XSD)
Giuseppe Della Penna
Universit degli Studi di LAquila
gdellape@univaq.it
http://dellapenna.univaq.it
Sommario
Schemi e DTD
Perch gli Schemi?
Nuove caratteristiche
Vantaggi degli Schemi
Dichiarazioni e Definizioni
Schemi e Namespaces
Richiamare lo schema in un documento
Creare e Usare un Namespace
Schemi senza Namespace
Documenti senza Namespace
Dichiarazioni Globali e Locali
Dichiarazioni Locali
Dichiarazioni di Globali
XML Schema / 2
Sommario
I Tipi Semplici
Tipi di dato Built-in
Creazione di Tipi Semplici
Sintassi di simpleType
Facets dei Tipi Numerici
Facets dei Tipi Stringa
Facets del Tipi Data
Impedire la Ridefinizione di una Facet
Uso dei simpleType Definiti
Liste di Tipi Semplici
Unione di Tipi Semplici
Riassunto dei simpleType
XML Schema / 3
Sommario
I Tipi Complessi
Modelli di Raggruppamento
minOccurs e maxOccurs
Il Modello sequence
Il Modello choice
Il Modello all
Tipi Complessi a Modello Misto
complexType Derivati
Tipi Complessi basati su Tipi Semplici
Tipi Complessi basati su Tipi Complessi
XML Schema / 4
Sommario
Restrizioni su Tipi Complessi
Estensioni su Tipi Complessi
Impedire le Derivazioni
Sostituzione di Elementi
Attributi
Aggiungere Attributi a un Tipo
Estensione con Attributi
Restrizione di Attributi
Valori di Default per Elementi
Elementi Vuoti
XML Schema / 5
Sommario
Elemento group
Elemento attributeGroup
Estendibilit dei Documenti Istanza
Elemento any
Elemento anyAttribute
Namespaces ed Elementi any
Annotazioni
Creare Documenti con pi di uno Schema
Combinare Schemi Diversi
XML Schema / 6
Schemi e DTD
u
XML Schema / 7
XML Schema / 8
Nuove caratteristiche
Pi tipi di dato (44 contro 10), e la possibilit
di definirne di nuovi o derivarne altri da tipi
gi esistenti applicando regole e restrizioni.
u Ci sono nuovi modelli di contenuto, tra cui
linsieme (tutti questi elementi, in qualsiasi
ordine).
u Si possono definire pi campi chiave diversi.
u Si possono dichiarare classi di equivalenza
tra elementi.
u
XML Schema / 9
XML Schema / 10
Un contratto.
Metadati.
XML Schema / 11
XML Schema / 12
Un DTD di Partenza
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
artist (#PCDATA)>
title (#PCDATA)>
year (#PCDATA)>
comment (#PCDATA)>
length (#PCDATA)>
XML Schema / 13
Un XSD di Partenza
<xs:element name="artist" type="xs:string"/>
<xs:element name="comment" type="xs:string"/>
<xs:element name="length" type="xs:string "/>
<xs:element name="title" type="xs:string"/>
<xs:element name="year" type="xs:string"/>
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
artist (#PCDATA)>
title (#PCDATA)>
year (#PCDATA)>
comment (#PCDATA)>
length (#PCDATA)>
<xs:element name="song">
<xs:complexType>
<xs:sequence>
<xs:element ref="artist" minOccurs ="0"/>
<!ELEMENT song
<xs:element ref="title"/>
(artist?, title, year?, comment ?, length)
<xs:element ref="year" minOccurs ="0"/>
<xs:element ref="comment" minOccurs ="0"/> >
<xs:element ref="length "/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CD">
<xs:complexType>
<!ELEMENT CD song+>
<xs:sequence>
<xs:element ref="song" maxOccurs ="unbounded "/>
</xs:sequence>
</xs:complexType>
</xs:element>
XML Schema / 14
Un XSD di Partenza
XML Schema / 15
Dichiarazioni e Definizioni
In un DTD, si descrivono oggetti che faranno
parte dei documenti istanza, ma anche oggetti
usati solo nel DTD (entit parametriche).
u Ugualmente, in uno Schema:
u
XML Schema / 16
Schemi e Namespaces
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified "
targetNamespace ="http://dellapenna.univaq.it/CD "
xmlns ="http://dellapenna.univaq.it/CD "
>
<xs:element name="artist" type="xs:string"/>
<xs:element name="comment" type="xs:string"/>
<xs:element name="length" type="xs:string "/>
<xs:element name="title" type="xs:string"/>
<xs:element name="year" type="xs:string"/>
<xs:element name="song">
<xs:complexType>
<xs:sequence>
<xs:element ref="artist" minOccurs ="0"/>
<xs:element ref="title"/>
<xs:element ref="year" minOccurs ="0"/>
<xs:element ref="comment" minOccurs ="0"/>
<xs:element ref="length "/>
</xs:sequence>
</xs:complexType>
</xs:element>
XML Schema / 17
Schemi e Namespaces
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified "
targetNamespace ="http://dellapenna.univaq.it/CD"
xmlns ="http://dellapenna.univaq.it/CD" >
<xs:element name="artist" type="xs:string"/>
<xs:element name="comment" type="xs:string"/>
<xs:element name="length" type="xs:string "/>
<xs:element name="title" type="xs:string"/>
<xs:element name="year" type="xs:string"/>
elementFormDefault posto a
qualified indica che tutti i
documenti che fanno uso degli
elementi definiti in questa
sintassi dovranno sempre
dichiararne il namespace.
<xs:element name="song">
<xs:complexType>
<xs:sequence>
<xs:element ref="artist" minOccurs ="0"/>
<xs:element ref="title"/>
<xs:element ref="year" minOccurs ="0"/>
<xs:element ref="comment" minOccurs ="0"/>
<xs:element ref="length "/>
</xs:sequence>
</xs:complexType>
</xs:element>
XML Schema / 18
Namespaces
schema
element
artist
complexType
comment
sequence
length
choice
year
attribute
title
maxOccurs
song
targetNamespace
CD
string
http://www.w3.org/2001/XMLSchema
http://dellapenna.univaq.it/CD
XML Schema / 19
XML Schema / 20
Namespaces
artist
schemaLocation
comment
noNamespaceSchemaLocati
on
length
type
nil
year
title
song
CD
http://www.w3.org/2001/XMLSchema-instance
http://dellapenna.univaq.it/CD
XML Schema / 21
xsi:schemaLocation =
"http://dellapenna.univaq.it/CDColl.xsd">
targetNamespace =
"http://dellapenna.univaq.it/CD"
Album.xml
CD.xsd
u
u
XML Schema / 22
XML Schema / 23
Non
viene
specificato
un
targetNamespace, e neppure
un namespace di default.
XML Schema / 24
XML Schema / 26
Dichiarazioni Locali
<xs:element name="CD">
<xs:complexType>
<xs:sequence>
<xs:element name="songmaxOccurs ="unbounded ">
<xs:complexType>
<xs:sequence>
<xs:element name="artist" type="xs:string " minOccurs ="0"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="year" type="xs:string" minOccurs ="0"/>
<xs:element name="comment" type="xs:string" minOccurs ="0"/>
<xs:element name="length" type="xs:string "/>
</xs:sequence>
</xs:complexType>
</xs:sequence>
</xs:complexType>
</xs:element>
XML Schema / 27
Dichiarazioni di Globali
<xs:element name="song type=songType/>
<xs:element name="CD type=cdType/>
<xs:complexTypename=songType>
<xs:sequence>
<xs:element ref="artist" minOccurs ="0"/>
<xs:element ref="title"/>
<xs:element ref="year" minOccurs ="0"/>
<xs:element ref="comment" minOccurs ="0"/>
<xs:element ref="length "/>
</xs:sequence>
</xs:complexType>
<xs:complexTypename=cdType>
Dichiara il modello di contenuto
<xs:sequence>
<xs:element ref="song" maxOccurs ="unbounded "/>(song)+
</xs:sequence>
come un tipo globale chiamato cdType.
</xs:complexType>
XML Schema / 28
Dichiarazioni di Globali
<xs:element name="CD">
<xs:complexType>
<xs:sequence>
<xs:element name="songmaxOccurs ="unbounded type=songType>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexTypename=songType >
<xs:sequence>
<xs:element name="artist" type="xs:string " minOccurs ="0"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="year" type="xs:string" minOccurs ="0"/>
<xs:element name="comment" type="xs:string" minOccurs ="0"/>
<xs:element name="length" type="xs:string "/>
</xs:sequence>
</xs:complexType>
XML Schema / 29
Riassumendo
<xs:element name="CD">
<xs:complexType>
<xs:sequence>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexTypename=songType >
<xs:sequence>
</xs:sequence>
</xs:complexType>
Tipo
anonimo
dichiarato
localmente , elemento con tipo inline
Tipo
con
globalmente.
nome
dichiarato
XML Schema / 30
10
Riassumendo
<xs:element name="CD">
<xs:complexType>
<xs:sequence>
<xs:element name="song>
<xs:complexType>
</xs:complexType>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="CD">
<xs:complexType>
<xs:sequence>
<xs:element ref="song/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="song">
</xs:element>
XML Schema / 31
Dichiarazione di Elementi
La dichiarazione di un elemento
(<!ELEMENT> nei DTD) si effettua usando
il tag <xs:element>.
u Un elemento ha sempre un nome .
u Gli elementi possono essere dichiarati sia
localmente che globalmente.
u La parte pi importante dellelemento
<xs:element> lindicazione del suo tipo, che
ne dichiara i contenuti (elementi, attributi,
testo, numeri, contenuto misto, ).
u
XML Schema / 32
Dichiarazione di Elementi
<xs:element name="CD">
<xs:complexType>
<xs:sequence>
<xs:element name="song>
<xs:complexType>
</xs:complexType>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name=length>
<xs:simpleTypebase=xs:positiveInteger>
<xs:maxInclusivevalue=1000/>
</xs:simpleType>
</xs:element>
XML Schema / 33
11
Riferimento ad Elementi
Lelemento <xs:element> viene anche usato
per riferirsi localmente ad elementi
dichiarati globalmente, tramite il loro nome.
XML Schema / 34
XML Schema / 35
XML Schema / 36
12
I Tipi Semplici
u
Vedremo ora:
XML Schema / 37
Ciao
{true, false}
7.08
12.4E2, -4, INF, NAN
12.4E2, -4, INF, NAN
P1Y2M3DT10H30M12.3S
yyyy -mm-ddThh-mm-ss
hh:mm:ss.sss
yyyy -mm-dd
yyyy -mm
yyyy
--mm-dd
---dd
--mm-F0A1
http://dellapenna.univaq.it
xsi:schemaInstance
Una NOTATION XML
XML Schema / 38
-32768 32767
-127 128
0 4294967295
0 18446744073709551615
0 65535
0 255
XML Schema / 39
13
XML Schema / 40
XML Schema / 41
<xsd:simpleTypename=Forma">
<xsd:restriction base="xsd:string">
<xsd:enumeration value=cerchio"/>
<xsd:enumeration value=quadrato"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleTypename=Et">
<xsd:restriction base="xsd:nonNegativeInteger">
<xsd:maxInclusive value=150"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleTypename=EtAdulta">
<xsd:restriction base=Et">
<xsd:minInclusivevalue=18"/>
</xsd:restriction>
</xsd:simpleType>
XML Schema / 42
14
Sintassi di simpleType
<xs:simpleTypename=nome">
<xs:restriction base="tipo">
<xs:facet value=valore"/>
<xs:facet value=valore"/>
</xs:restriction >
</xs:simpleType>
<xs:simpleTypename=nome">
<xs:restriction>
<xs:simpleTypename=nome">
</xs:simpleType>
Restrizione
applicata
direttamente a un tipo anonimo
definito inline
<xs:facet value=valore"/>
<xs:facet value=valore"/>
</xs:restriction >
</xs:simpleType>
XML Schema / 43
minExclusive
maxInclusive
maxExclusive
whiteSpace
enumeration
pattern
totalDigits
fractionDigits
XML Schema / 44
Espressioni Regolari /1
x
.
[a-z]
[abc]
[abA-C]
[^a-f]
E+
E*
E{n}
E{n,m}
E{n,}
Costante
Un carattere qualsiasi
Range di caratteri
Range negato
Una o pi volte E
Zero o pi volte E
Ripetizione (n volte E)
Ripetizione (da n a m volte E)
Ripetizione (n o pi volte E)
XML Schema / 45
15
Espressioni Regolari /2
\d
\s
\w
\p{L}
\p{Lu}
\p{Ll}
\p{N}
\p{Nd}
\p{P}
\p{Sc}
\n \r \t
\x
Digit
Spazio bianco (anche tab, CR,)
Carattere per parola (alfanumerico o trattino)
Lettera
Lettera maiuscola
Lettera minuscola
Numero
Digit
Punteggiatura
Simbolo di valuta
LF, CR, TAB
Il carattere riservato x
XML Schema / 46
pattern
XML Schema / 47
pattern
XML Schema / 48
16
<xsd:simpleTypename=Et">
<xsd:restriction base="xsd:nonNegativeInteger">
<xsd:maxInclusive value=150 fixed =true"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleTypename=EtAdulta">
<xsd:restriction base=Et">
<xsd:minInclusivevalue=18"/>
<xsd:maxInclusive value=200/>
</xsd:restriction>
</xsd:simpleType>
XML Schema / 49
<xs:element name="Et">
<xsd:simpleTypename=tipoEt">
<xsd:restriction base="xsd:nonNegativeInteger">
<xsd:maxInclusive value=150"/>
</xsd:restriction>
</xsd:simpleType>
</xs:element>
XML Schema / 50
XML Schema / 51
17
<xs:simpleTypename=TriplaDiInteri">
<xs:restriction base="ListaDiInteri">
<xs:length value="3"/>
</xs:restriction >
</xs:simpleType>
<xs:simpleTypename=PermutazioneDi123 ">
<xs:restriction base="ListaDiInteri">
<xs:enumeration value=1"/>
<xs:enumeration value=2"/>
<xs:enumeration value=3"/>
</xs:restriction >
</xs:simpleType>
XML Schema / 52
<xs:simpleTypename=PermutazioneDi123 ">
<xs:restriction>
<xs:simpleType>
<xs:list>
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:enumeration value=1"/>
<xs:enumeration value=2"/>
<xs:enumeration value=3"/>
</xs:restriction >
</xs:simpleType>
</xs:list>
</xs:simpleType>
<xs:length value="3"/>
</xs:restriction >
</xs:simpleType>
Definizione con nidificazione di tipo
2 (restrizione su tipo lista anonimo
definito su tipo anonimo)
XML Schema / 53
XML Schema / 54
18
Dichiariamo
una
NumeroStringa
come unione dei tipi built-in integer
e string. Il valore di itemType
una lista di nomi di tipi.
<xs:simpleTypename=NumeroLettera">
<xs:restriction base=NumeroStringa">
<xs:enumeration value=1"/>
<xs:enumeration value=2"/>
<xs:enumeration value=3"/>
<xs:enumeration value=A"/>
<xs:enumeration value=B"/>
<xs:enumeration value=C"/>
</xs:restriction >
</xs:simpleType>
XML Schema / 55
XML Schema / 56
Un simpleType pu essere:
XML Schema / 57
19
I Tipi Complessi
I tipi complessi rappresentano i modelli di
contenuto e le dichiarazioni ATTLIST dei DTD.
u Un tipo complesso contiene una serie di
elementi ordinati secondo particolari modelli
(sequenza, scelta, insieme,) e/o attributi.
u I tipi complessi possono essere definiti sulla
base di altri tipi complessi o semplici
applicando restrizioni ed estensioni.
u I tipi complessi possono anche essere misti,
cio contenere elementi e testo.
u
XML Schema / 58
Modelli di Raggruppamento
u
Sequenziamento: operatore ,
Scelta: operatore |
Ripetizione: operatori * e +
XML Schema / 59
Modelli di Raggruppamento
u
XML Schema / 60
20
Modelli di Raggruppamento
Cosa raggruppano i modelli di
raggruppamento? In altre parole, quali sono
gli elementi ammessi come figli di un
modello di raggruppamento?
u Gli elementi che possono comparire in un
modello di raggruppamento sono:
u
XML Schema / 61
minOccurs e maxOccurs
Abbiamo detto che questi due attributi
servono a specificare quante volte un
elemento, pu essere ripetuto (compresi gli
stessi modelli di raggruppamento).
u Nei DTD, lunico corrispondente erano i
simboli +, * e ?.
u
XML Schema / 62
minOccurs e maxOccurs
Schemi
DTD
minOccurs=1
maxOccurs= unbounded
Corrisponde a +
minOccurs=0
maxOccurs= unbounded
Corrisponde a *
minOccurs=0
[maxOccurs=1]
Corrisponde a ?
minOccurs=10
maxOccurs=10
XML Schema / 63
21
Il Modello sequence
Il modello sequence indica al validatore che i
figli dichiarati dovranno apparire esattamente
nellordine dato.
u Ogni figlio, per, pu avere un proprio
limite sul numero delle occorrenze .
u A causa del trattamento avanzato delle
occorrenze, il modello sequence non
corrisponde esattamente alloperatore , dei
DTD.
u
XML Schema / 64
Il Modello sequence
<xs:complexType>
<xs:sequence>
<xs:element ref="artist" minOccurs ="0"/>
<xs:element ref="title"/>
</xs:sequence>
</xs:complexType>
<xs:complexType>
<xs:sequence>
<xs:element ref="title"/>
<xs:sequence minOccurs ="0">
<xs:element ref=track "/>
<xs:element ref=length "/>
</xs:sequence>
<xs:element ref=copyright"/>
</xs:sequence>
</xs:complexType>
XML Schema / 65
Il Modello choice
Il modello choice indica al validatore che solo
uno dei figli dichiarati dovr apparire in
quella posizione.
u Ogni figlio, per, pu avere un proprio limite
sul numero delle occorrenze.
u A causa del trattamento avanzato delle
occorrenze, il modello sequence non
corrisponde esattamente alloperatore | dei
DTD.
XML Schema / 66
22
Il Modello choice
Questo tipo complesso definisce un
contenuto cos composto:
<xs:complexType>
<xs:choice>
<xs:element ref=el1" minOccurs ="0"/>
<xs:element ref="el2" maxOccurs =10"/>
</xs: choice >
</xs:complexType>
<xs:complexType>
<xs:choice>
<xs:element ref=copyright" />
<xs:sequence maxOccurs =unbounded ">
<xs:element ref=track "/>
<xs:element ref=copyright"/>
</xs:sequence>
</xs: choice >
</xs:complexType>
XML Schema / 67
Il Modello all
Il modello all indica al validatore che i figli
dichiarati dovranno apparire tutti, in qualsiasi
ordine, o non apparire del tutto.
u I figli del modello all possono essere solo
elementi.
u I figli del modello all, e il modello stesso,
possono avere solo cardinalit maxOccurs=1
e minOccurs=1 o minOccurs=0.
u Il modello all non pu essere nidificato in
altri modelli di raggruppamento.
u
XML Schema / 68
Il Modello all
<xs:complexType>
<xs:all>
<xs:element ref=nome"/>
<xs:element ref=cognome"/>
<xs:element ref=tel" minOccurs =0"/>
</xs:all>
</xs:complexType>
un
XML Schema / 69
23
XML Schema / 70
XML Schema / 71
complexType Derivati
Finora abbiamo visto come definire tipi
complessi a partire da modelli di
raggruppamento ed elementi.
u Vedremo ora come costruire tipi complessi a
partire da altri tipi (complessi o semplici)
tramite restrizione o estensione.
u
XML Schema / 72
24
XML Schema / 73
<xs:complexType>
<xs:simpleContent>
<xs:extension base=" xs:double">
<xs:attribute name="id" type="xs:string "/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
XML Schema / 74
XML Schema / 75
25
XML Schema / 76
stato
rimosso
completamente.
Il numero massimo di occorrenze
della xs:sequence stato diminuito a
2 (prima era unbounded).
XML Schema / 77
XML Schema / 78
26
XML Schema / 79
Impedire le Derivazioni
A volte desiderabile impedire che utenti di
uno schema creino tipi derivati a partire da
tipi presenti nello schema di origine.
u E possibile richiedere al validatore di
rifiutare particolari derivazioni su un tipo
semplice o complesso, usando lattributo
finale degli elementi complexType e
simpleType.
u
XML Schema / 80
Impedire le Derivazioni
u
XML Schema / 81
27
Impedire le Derivazioni
u
XML Schema / 82
Sostituzione di Elementi
A cosa serve veramente la creazione di tipi
derivati?
u Soprattutto nel caso della restrizione dei tipi
complessi (dove necessario ripetere tutto il
contenuto del tipo base), sembrerebbe solo
lavoro sprecato.
u In realt, i tipi derivati tra loro sono
compatibili, e lo sono anche gli elementi che
hanno tali tipi. Questo permette il
meccanismo della sostituzione degli elementi.
u
XML Schema / 83
Sostituzione di Elementi
La sostituzione degli elementi usa (in maniera
assai pi permissiva) un meccanismo noto
nella programmazione Object-Oriented: un
tipo derivato pu comparire dovunque sia
richiesto il suo tipo base.
u Negli schemi, un qualunque tipo che sia
uguale o derivato da un altro pu comparire al
suo posto.
u E tuttavia necessario dichiarare al validatore
quali tipi saranno sostituibili.
u
XML Schema / 84
28
substitutionGroup
u
XML Schema / 85
substitutionGroup
<xs:complexTypename="TPubblicazione">
<xs:sequence>
<xs:element ref="titolo "/>
<xs:element ref="autore"/>
</xs:sequence>
</xs:complexType>
<xs:complexTypename="TLibro ">
<xs:complexContent >
<xs:extension base="TPubblicazione">
<xs:sequence>
<xs:element ref="ISBN"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexTypename="TRivista">
<xs:complexContent >
<xs:extension base="TPubblicazione">
<xs:sequence>
<xs:element ref="Volume"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
XML Schema / 86
substitutionGroup
<xs:element name="Libro" type="TLibro " substitutionGroup ="Pubblicazione"/>
<xs:element name="Rivista" type="TRivista" substitutionGroup="Pubblicazione"/>
<xs:element name="Pubblicazione" type="TPubblicazione"/>
<xs:element name="Riferimenti">
<xs:complexType>
<xs:sequence>
<xs:element ref="Pubblicazione" maxOccurs ="unbounded "/>
</xs:sequence>
</xs:complexType>
</xs:element>
<Riferimenti>
<Libro >...</Libro>
<Rivista>...</Rivista>
</Riferimenti>
XML Schema / 87
29
substitutionGroup
XML Schema / 88
XML Schema / 89
XML Schema / 90
30
XML Schema / 92
Attributi
Lunica componente di che non abbiamo
ancora affrontato sono gli attributi.
u Anche gli attributi entrano a far parte del
concetto di tipo degli Schemi:
u
XML Schema / 93
31
Attributi
u
XML Schema / 94
Attributi
<xsd:attribute name="track " type="xsd:positiveInteger" use="required "/>
L'attributo track un intero positivo, ed sempre
necessario specificarlo
<xsd:attribute name="compilation " type="xsd :boolean" value="true"/>
L'attributo compilation un booleano, con valore di
default (se non specificato) uguale a true
<xsd:attribute name=genre" use="optional">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:pattern value=rock"/>
<xsd:pattern value=pop"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:attribute>
L'attributo opzionale genre di un tipo utente
(enumerativo) dichiarato localmente alla definizione
dellattributo.
<xsd:attribute name=source" type="xsd:string " use="fixed" value=digital"/>
L'attributo source una stringa a valore fisso
digital. Non pu essere specificato nei documenti!
XML Schema / 95
Attributi
u
XML Schema / 96
32
XML Schema / 97
<xs:element name="song">
<xs:complexType>
Notare che la dichiarazione degli attributi segue
<xs:sequence>
sempre quella del contenuto del complexType.
...
</xs:sequence>
<xsd:attribute name="track " type="xsd:positiveInteger" use="required "/>
<xsd:attribute ref=genre"/>
</xs:complexType>
</xs:element>
XML Schema / 98
Lelemento
song
ha
un
tipo
(complesso)
che
comprende
il
gruppo di attributi songAttributes
<xs:element name="song">
(genre e track) e lattributo source
<xs:complexType>
dichiarato localmente.
<xs:sequence>
...
</xs:sequence>
<xsd:attributeGroup ref=songAttributes"/>
<xsd:attribute name=source" type="xsd:string " use="fixed" value=digital"/>
</xs:complexType>
</xs:element>
XML Schema / 99
33
Restrizione di Attributi
u
34
Riassunto...
Riassunto...
<xs:element name=Telefono>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="\+\d{1,4}(-\d{1,4})?-\d{1,4}-\d+"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
Riassunto...
<xs:element name=Nome>
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="titolo" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
35
Riassunto...
<xs:element name=Indirizzo>
<xs:complexType>
<xs:all>
<xs:element ref="Via"/>
<xs:element ref="Citta"/>
<xs:element ref="CAP"/>
</xs:all>
</xs:complexType>
</xs:element>
Riassunto...
<xs:complexType name=indType >
<xs:all>
<xs:element ref="Via"/>
<xs:element ref="Citta"/>
<xs:element ref="CAP"/>
</xs:all>
</xs:complexType>
<xs:element name=Indirizzo type=indType >
Riassunto...
<xs:element name="IndirizzoEstero">
<xs:complexType>
<xs:complexContent>
<xs:extension base="indType">
<xs:sequence >
<xs:element name="Nazione type=xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:element>
36
Elementi Vuoti
u
<xs:element name="emptyElement">
<xs:complexType/>
</xs:element>
Elemento vuoto
<emptyElement/>
Elemento group
u
37
Elemento group
<xs:group name="common">
<xs:sequence>
<xs:element ref="artist"/>
<xs:element ref="title"/>
</xs:sequence>
</xs:group >
<xs:element name="song">
<xs:complexType>
<xs:sequence>
<xs:group ref="common"/>
<xs:element ref="year" minOccurs ="0"/>
<xs:element ref="comment"/>
<xs:element ref="length "/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="song">
<xs:complexType>
<xs:sequence>
<xs:sequence>
<xs:element ref="artist"/>
<xs:element ref="title"/>
</xs:sequence>
<xs:element ref="year" minOccurs ="0"/>
<xs:element ref="comment"/>
<xs:element ref="length "/>
</xs:sequence>
</xs:complexType>
</xs:element>
Elemento group
Elemento group
<xs:group name="flow">
<xs:choice>
<xs:element ref="B"/>
<xs:element ref="I"/>
<xs:element ref="BR"/>
</xs:choice>
</xs:group >
<xs:element name="P">
<xs:complexTypemixed ="true">
<xs:sequence>
<xs:group ref="flow" minOccurs ="0
maxOccurs ="unbounded "/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name=H1 ">
<xs:complexTypemixed ="true">
<xs:sequence>
<xs:group ref="flow" minOccurs ="0
maxOccurs ="unbounded "/>
</xs:sequence>
</xs:complexType>
</xs:element>
38
Elemento attributeGroup
u
Elemento attributeGroup
<xs:attributeGroup name="commonAttrs">
<xs:attribute name="id" type="xs:string "/>
<xs:attribute name="class" type="xs:string"/>
<xs:attribute name="style" type="xs:string "/>
</xs:attributeGroup >
<xs:element name="P">
<xs:complexTypemixed ="true">
<xs:sequence>
<xs:group ref="flow" minOccurs ="0
maxOccurs ="unbounded "/>
</xs:sequence>
<xs:attributeGroup ref="commonAttrs "/>
<xs:attribute name="align ">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="left"/>
<xs:enumeration value="right"/>
</xs:restriction >
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
39
Elemento any
u
Elemento any
<xs:schema targetNamespace="APersona" xmlns="APersona
xmlns:xs="http://www.w3.org/2001/XMLSchema>
<xs:element name="Persona">
<xs:complexType>
<xs:sequence>
<xs:element ref="Nome"/>
<xs:element ref="Cognome"/>
<xs:any minOccurs ="0" maxOccurs ="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:schema targetNamespace="AIndirizzo " xmlns="AIndirizzo "
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Indirizzo ">
<xs:complexType>
<xs:all>
<xs:element ref="Via"/>
<xs:element ref="Citt"/>
<xs:element ref="CAP"/>
</xs:all>
</xs:complexType>
</xs:element>
Consideriamo
questi
due
frammenti di Schema. Notare
che entrambi hanno un
namespace: questo molto
importante
quando
si
intendono
mescolare
(e
validare) elementi provenienti
da schemi diversi nello stesso
documento istanza.
Lelemento
Persona
(namespace
APersona)
permette linserimento di
altri elementi qualsiasi alla
dopo Nome e Cognome, per
inserire informazioni specifiche
nelle istanze.
Nel nostro semplice esempio,
noi inseriremo un elemento
indirizzo in ogni elemento
persona. Come?
Elemento any
<?xml version="1.0" encoding="UTF-8"?>
<Personaxmlns="APersona" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="APersona Persona.xsd AIndirizzo Indirizzo.xsd ">
<Nome> Giuseppe </Nome>
<Cognome> Della Penna </Cognome>
<Indirizzo xmlns="AIndirizzo ">
<Via>Giulia</Via>
<Citt>Vasto</Citt>
<CAP>66054 </CAP>
</Indirizzo >
</Persona>
Nellelemento radice del nostro documento, tramite lattributo xsi:schemaLocation,
specifichiamo una lista di schemi, associandoli al nome del loro namespace (il
formato namespace1 indirizzoxsd1 namespace2 indirizzoxds2 ).
Quando inseriamo gli elementi, definiamo il loro namespace di appartenenza. In
questo caso, tramite lattributo xmlns , stiamo dicendo che gli elementi del
sottoalbero Parsona appartengono al namespace APersona, tranne indirizzo, che
ridefinisce il proprio namespace (e quello dei propri figli) come AIndirizzo.
In questo modo il validatore applicher le regole dello schema corrispondente
a ciscun namespace agli elementi che vi appartengono.
XML Schema / 120
40
Elemento anyAttribute
Lelemento anyAttribute permette agli autori
dei documenti istanza di estendere il
contenuto degli elementi inserendo attributi
non presenti nello schema.
u Lelemento <xs:anyAttribute> pu essere
inserito in qualsiasi modello di contenuto.
u
Elemento anyAttribute
<xs:schema targetNamespace="APersona" xmlns="APersona"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Persona">
<xs:complexType>
<xs:sequence>
<xs:element ref="Nome"/>
<xs:element ref="Cognome"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
</xs:element>
<?xml version="1.0" encoding="UTF-8"?>
<Personaxmlns="APersona"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="Persona.xsd
newattribute=newvalue>
<Nome> Giuseppe </Nome>
<Cognome> Della Penna </Cognome>
</Persona>
Consideriamo il frammento di
schema in alto. Lelemento
Persona
dichiara
di
poter
accettare qualsiasi attributo.
Nel documento istanza, un nuovo
attributo newvalue inserito in
Persona. Il validatore accetter
questo attributo.
Da notare che in questo caso
lattributo non ha namespace
e quindi nessuno schema per
la sua validazione, quindi il
validatore non effettuer alcun
controllo sul suo contenuto.
41
Annotazioni
Le annotazioni non hanno alcun effetto sulla
validazione. Servono solo a documentare lo
schema fornendo informazioni utili per gli
esseri umani e per altre applicazioni.
u Le annotazioni possono essere inserite:
u
Annotazioni
Le annotazioni sono poste allinterno dei tag
<xs:annotation>.
u Esistono due tipi di annotazioni:
42
Inserire Annotazioni
<xs:element name="artist" type="xs:string"/>
<xs:annotation>
<xs:documentation>
Annotazione inserita prima dellelemento globale
Titolo della canzone
</xs:documentation>
</xs:annotation>
<xs:element name=title" type="xs:string"/>
<xs:element name="song">
<xs:annotation>
<xs:documentation> Annotazione inserita dopo un tag di apertura
Una sequenza
</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="artist" minOccurs ="0"/>
<xs:element ref="title"/>
</xs:sequence>
</xs:complexType>
</xs:element>
43
</xs:simpleType>
</xs:element >
<xs:schema targetNamespace="APersona"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="APersona" >
<xs:include schemaLocation="Persona-titolo.xsd"/>
<xs:element name="Persona">
<xs:complexType>
<xs:sequence>
<xs:element ref=Titolo"/>
<xs:element ref="Nome"/>
<xs:element ref="Cognome"/>
Il secondo schema importa il primo, che
definisce
elementi
nello
stesso
</xs:sequence>
</xs:complexType>
namespace.
</xs:element>
Il secondo schema fa riferimento agli
elementi
dello
schema
importato
esattamente come fossero dichiarati nello
stesso documento.
XML Schema / 130
</xs:simpleType>
</xs:element>
<xs:schema targetNamespace="APersona"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="APersona" >
<xs:include schemaLocation="Persona-titolo.xsd"/>
<xs:element name="Persona">
<xs:complexType>
Il secondo schema importa il primo, che
<xs:sequence>
definisce elementi senza namespace.
<xs:element ref=Titolo"/>
In questo caso, gli elementi importati
<xs:element ref="Nome"/>
vengono inseriti nel namespace del
<xs:element ref="Cognome"/>
documento
che
li
importa ,
cio
</xs:sequence>
APersona.
</xs:complexType>
</xs:element>
Il secondo schema fa riferimento agli
elementi
dello
schema
importato
esattamente come fossero dichiarati nello
stesso documento.
XML Schema / 131
44
Riferimenti
45