Indice

Logo Ufficio Italiano W3C

Logo CNR

Logo ISTI

 

 

 

 

 

  Valid XHTML 1.1! Valid CSS!

XML

Massimo Martinelli
massimo AT w3c [DOT it

Ufficio Italiano W3C, CNR-ISTI

Area della Ricerca CNR

via Moruzzi, 1

56124 Pisa


logo Rete Telematica Regione Toscana logo Regione Toscana Corso AQUARIUS sulle Tecnologie Web

Firenze 19 Ottobre 2010 - Pisa, 26 Ottobre 2010

La pila delle tecnologie W3C

Pila delle tecnologie W3C, vedere http://www.w3.org/Consortium/techstack-desc.html per maggiori dettagli da Ivan Herman

Standard Industriali

Sanitari
HL7
SNOMED
...
Bancari
FpML
...
...
Chimici
PDX
...
Elettronici
PIPs
RNIF
...

XML

eXtensible Markup Language

  • linguaggio di marcatura (basato su markup) estensibile
  • non ha tag predefiniti, è estensibile: ci consente di definire dei nostri tag
  • metalinguaggio: linguaggio che ha lo scopo di definire nuovi linguaggi
  • realizzato per realizzare, descrivere ed utilizzare documenti strutturati
  • XML 1.0 5a edizione: W3C Recommendation 26 November 2008

Metainformazione

  • A cosa può servirci una metainformazione ?
  • Esempio: cosa rappresenta la seguente informazione ?
    
    150,25 179,111 625,30 580,90 640,130 197,165 223,251 150,200 77,251 103,165 31,111 121,111
        
  • Rappresentazione dell'informazione

Le componenti di XML

Tre parti fondamentali distinte:

  1. il contenuto
  2. le specifiche relative agli elementi, la struttura (DTD/XML Schema)
  3. le specifiche relative alla rappresentazione, lo stile (Stylesheet)

Come si presenta un documento XML

Anagrafe.xml


<?xml version="1.0" encoding="utf-8" ?>
<anagrafe>
   <cie numerocarta="XX123456YY">
      <cognome>Rossi</cognome>
      <nome>Mario</nome>
      <datanascita>
          <giorno>20</giorno>
          <mese>03</mese>
          <anno>2003</anno>
      </datanascita>
      <luogonascita>
          <comune>Livorno</comune>
          <provincia>LI</provincia>
      </luogonascita>
   </cie>
</anagrafe>

 

 

Un ipotetico colloquio tra un Ente
(es. Ministero degli Interni, Prefettura,
Camera di Commercio, ...)
e l'Anagrafe

 

Uno degli obiettivi di progettazione di XML
è che sia in un formato leggibile dall'uomo,
per intendersi non può essere in formato binario,
e dovrebbe essere ragionevolmente chiaro.

Prologo

Ogni documento XML inizia con un prologo
contiene una dichiarazione di versione
l'insieme di caratteri utilizzato (character set)

<?xml version="1.0" encoding="utf-8" ?>
 . . .

Documento conforme alla versione 1.0 di XML

Documento che usa caratteri appartenenti alla codifica UTF-8

Elementi

Radice (root): elemento che racchiude tutti gli altri


<?xml version="1.0" encoding="utf-8"?>
<anagrafe>
  .  .  .
</anagrafe>

Regole per i tag

Ogni tag di apertura deve avere un corrispondente tag di chiusura </nome_elemento>

Forma concisa per elementi senza contenuto:

     <nome_elemento />

forme equivalenti

      <nome_elemento attr="valore"></nome_elemento>
      <nome_elemento attr="valore" />

Esempi HTML

   <br />     (<br></br> )
   <img src="http://www.w3.org/Icons/w3c_home" alt="W3C" />

Regole per i tag

I tag devono essere nidificati correttamente

Non permesso

<aa>
      <bb>
</aa>
     </bb>
  

Corretto!

<aa>
     <bb>
     </bb>
</aa>
     

Markup XML

XML è case sensitive
le lettere maiuscole e quelle minuscole sono interpretate differentemente

   <nome> != <Nome> != <NOME>

i tag XML per convenzione si scrivono in minuscolo (previsto nella prima recommendation)

Alcuni caratteri e sequenze di caratteri sono riservati, pertanto non si possono utilizzare nei nomi di tag (%, xml, ...).

Attributi

   <cie numerocarta="XX123456YY">

Sintassi:

   <elemento attributo="valore">contenuto</elemento>

Quotare gli attributi

DTD - Document Type Definition

  • Contiene le regole di definizione dei tag
  • Indica gli elementi e il loro ordine all'interno del documento XML
  • Il suo uso non è obbligatorio; ne è consigliato l'utilizzo
  • Può essere interno o esterno al documento XML
  • Il suo nome per convenzione corrisponde a quello dell'elemento radice
  • Struttura gerarchica

Un esempio di DTD

<!ELEMENT anagrafe (cie+)>
<!ELEMENT cie (cognome, nome, datanascita, luogonascita, luogoresidenza?, infoaggiuntiva*)>
<!ATTLIST cie
	numerocarta ID #REQUIRED>
<!ELEMENT cognome (#PCDATA)>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT datanascita (giorno, mese, anno)>
<!ELEMENT giorno (#PCDATA)>
<!ELEMENT mese (#PCDATA)>
<!ELEMENT anno (#PCDATA)>
<!ELEMENT luogonascita (comune, provincia, statoestero?)>
<!ELEMENT comune (#PCDATA)>
<!ELEMENT provincia (#PCDATA)>
<!ELEMENT statoestero (#PCDATA)> 	<!-- solo se != Italia -->
<!ELEMENT luogoresidenza (comune, provincia, statoestero?)>  <!-- solo se diversa da quella di nascita -->
<!ELEMENT infoaggiuntiva (#PCDATA)>

Documento ben-formato, valido

Un documento XML si dice "ben formato" quando:

  • contiene almeno un elemento;
  • esiste un tag unico di apertura e di chiusura che contiene l'intero documento; (radice, root)
  • tutti i tag sono nidificati
  • tutte le entità sono dichiarate.

Un documento si dice "valido" quando

  • contiene una DTD e rispetta le regole definite in essa.

Parser

Analizzano i documenti XML, due tipi:

  • Validanti
    consentono di verificare la congruità del documento, la validità rispetto alle regole imposte dalla DTD
  • Non Validanti
    permettono di verificare solo la correttezza formale dei documenti (well-formedness)

Utili entrambi, utilizzo in contesti differenti
(a volte non serve verificare la validità ma solo la correttezza)

Limiti del DTD

  • Non supportano i tipi di dato - #PCDATA può essere una qualsiasi stringa di caratteri (esclusi tag)
  • Sintassi differente da quella XML <!ELEMENT nome (#PCDATA)>
  • Non possono esprimere restrizioni specifiche:
    • l'elemento x può occorrere da 5 a 11 volte
    • Il valore dell'elemento y deve essere compreso tra 0 e 10
    • Se il tipo dell'elemento z è "decimal", l'elemento z deve contenere un elemento x
  • Non supportano i namespace
  • Non sono estensibili

XML SCHEMA

  • Un linguaggio potenziato (rispetto alla DTD) per la definizione di vocabolari XML
  • Metodo estensibile per definire il modello dei dati XML
  • Scritta con sintassi XML
  • Sovrainsieme delle funzionalità del DTD
  • Composizione di schemi Importazione di altri schemi
  • Supporta i namespace
  • Grande potenziamento per la specifica di tipi
    • Definizione di elementi, attributi e relazioni (come le DTD)
    • Supporta tipi di dato primitivi: tipi semplici predefiniti (numeri, valori logici, caratteri, ...).
    • Tipi derivati:
      • oggetti costruibili a partire dai primitivi
        "sottoclasse" dei tipi predefiniti tramite definizione di vincoli (range, lunghezza stringa, precisione decimale,...)
      • Tipi complessi: definizione di una informazione contenente sotto-informazioni
  • XML Schema è composto da due parti: strutture e tipi di dato

Dichiarazione <-> Definizione

  • elementi e attributi si dichiarano
    I componenti dichiarati sono presenti in una istanza di documento XML
  • tipi, gruppi di attributi e gruppi di elementi di definiscono
    I componenti definiti non sono presenti nelle istanze di documenti XML

XML SCHEMA

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   . . . dichiarazioni di elementi . . . 
</schema>
  • Tutti gli schemi hanno come elemento radice l'elemento schema
  • schema appartiene all'insieme delle parole chiave che rappresentano i nomi degli elementi e attributi definiti nella specifica XML Schema.
  • Questo insieme è specificato da uno spazio di nomi (namespace, detti anche vocabolari o vocabolari di markup) attraverso la dichiarazione di un attributo la seguente sintassi
    xmlns:prefisso="URIunivoco"
  • Anteponendo il prefisso specificato (avendo dichiarato il namespace) ad un nome di elemento o attributo (o tipo di dato...) dichiariamo che tale nome appartiene specificamente a quello spazio di nomi e non ad altri
  • Nel nostro esempio anteponendo il prefisso xsd ad un nome specificheremo che quest'ultimo appartiene allo spazio di nomi dello Schema XML
  • invece di xsd potevamo indicare un altro prefisso, xsd non identifica per difetto lo spazio di nomi XML Schema)

Namespace - Spazi di nomi

A cosa ci possono servire gli spazi di nomi ?

  • Stesso nome di elemento usato in contesti differenti esempi: <mouse>, <titolo>
  • Fonte di problemi: persone possono capire da contesto, ma un programma?
  • Specificare gli spazi di nomi!
  • Esempi
    <html:body xmlns:xhtml="http://www.w3.org/1999/xhtml">
    	<xhtml:h1>text</xhtml:h1>
    </html:body>
    body e h1 appartengono al namespace HTML
    xmlns:xhtml="http://www.w3.org/1999/xhtml"
    xmlns:dc="http://purl.org/metadata/dublin-core"
    ...
    <xhtml:p>questo è un paragrafo xhtml</xhtml:p>
    <dc:Creator>Mario Rossi</dc:Creator>
  • Namespaces in XML - W3C Recommendation:
  • RFC 2396 (URI)
  • Dublin Core

Come si riferisce uno schema

<?xml version="1.0" encoding="utf-8"?>
<anagrafe xmlns="http://www.comune.livorno.it"
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xsi:schemaLocation="http://www.comune.livorno.it
                                                          anagrafe.xsd">
	<cie numerocarta="XX123456YY">
		<cognome>Rossi</cognome>
		<nome>Mario</nome>
		<datanascita>
			<giorno>20</giorno>
			<mese>03</mese>
			<anno>2003</anno>
		</datanascita>
		<luogonascita>
			<comune>Livorno</comune>
			<provincia>LI</provincia>
		</luogonascita>
	</cie>
</anagrafe>
  • Tutti gli elementi in questo documento istanza provengono dal namespace http://www.comune.livorno.it
  • L'attributo schemaLocation che stiamo usando è quello definito dal namespace XMLSchema-instance
  • xsi:schemaLocation indica che il namespace http://www.comune.livorno.it è definito da anagrafe.xsd
  • Termine "documento istanza" utilizzato per descrivere un documento che è conforme ad uno specifico schema
  • xsi: noNamespaceSchemaLocation
    Specifica dove si trova lo Schema XML senza namespace specificato per il documento istanza

Dichiarazione di elementi semplici

(supponendo che xsd identifichi il namespace XMLSchema)

 

definizione di un elemento titolo di tipo string

<xsd:element name="titolo" type="string" />

 

Sintassi:

<xsd:element name="nome_elemento" type="tipo_elemento" />

Tipi semplici predefiniti

Tipi semplici predefiniti in XML Schema
Tipo SempliceEsempi (delimitati da virgola)
stringTesto di esempio
normalizedStringTesto di esempio
tokenTesto di esempio
base64BinaryGpM7
hexBinary0FB7
integer...-1, 0, 1, ...
positiveInteger1, 2, ...
negativeInteger... -2, -1
nonNegativeInteger0, 1, 2, ...
nonPositiveInteger... -2, -1, 0
long-9223372036854775808, ... -1, 0, 1, ... 9223372036854775807
unsignedLong0, 1, ... 18446744073709551615
int-2147483648, ... -1, 0, 1, ... 2147483647
unsignedInt0, 1, ...4294967295
short-32768, ... -1, 0, 1, ... 32767
unsignedShort0, 1, ... 65535
byte-128, ...-1, 0, 1, ... 127
unsignedByte0, 1, ... 255
decimal-1.23, 0, 123.4, 1000.00
float-INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN
double-INF, -1E4, -0, 0, 12.78E-2, 12, INF, NaN
booleantrue, false, 1, 0
durationP1Y2M3DT10H30M12.3S
dateTime1999-05-31T13:20:00.000-05:00
date1999-05-31
time13:20:00.000, 13:20:00.000-05:00
gYear1999
gYearMonth1999-02
gMonth--05
gMonthDay--05-31
gDay---31
NameshipTo
QNamepo:USAddress
NCNameUSAddress
anyURI
http://www.example.com/,
http://www.example.com/doc.html#ID5
languageit, en-GB, en-US, fr
ID
IDREF
IDREFS
ENTITY
ENTITIES
NOTATION
NMTOKEN
US,
Brésil
NMTOKENS
US UK,
Brésil Canada Mexique

Tipi complessi

  • Elementi di tipo semplice, come titolo nel ns. esempio precedente, non possono contenere al loro interno ne attributi ne altri elementi
  • Per poter aggiungere ad un elemento un attributo e/o un insieme di sotto-elementi dobbiamo necessariamente definire l'elemento contenitore di tipo complesso
<xsd:complexType name="libro">
	<xsd:sequence>
		<xsd:element name="titolo" type="xsd:string"/>
		<xsd:element name="autore" type="xsd:string"/>
		<xsd:element name="editore" type="xsd:string"/>
		<xsd:element name="pagine"  type="xsd:positiveinteger"/>
	</xsd:sequence>
	<xsd:attribute name="isbn" type="xsd:string"/>
</xsd:complexType>

sequence: sequenza di elementi con ordine prefissato

equivale alla "," (virgola) del DTD

Occorrenze di elementi

  • Un libro potrebbe essere stato scritto da più di un autore
    <xsd:complexType name="libro">
    	<xsd:sequence>
    		<xsd:element name="titolo" type="xsd:string"/>
    		<xsd:element name="autore" type="xsd:string" maxOccurs="unbounded" />
    		<xsd:element name="editore" type="xsd:string"/>
    		<xsd:element name="pagine"  type="xsd:positiveinteger"/>
    	</xsd:sequence>
    	<xsd:attribute name="isbn" type="xsd:string"/>
    </xsd:complexType>
  • unbounded: valore positiveinteger >= minOccurs
  • default: minOccurs = maxOccurs = "1"
  • maggior precisione di quanto non mi permette la DTD
    Esempio: minoccurs="2" maxoccurs="3"
  • Se minOccurs="0" e maxOccurs="0" l'uso dell'elemento è proibito

Valori fissi e per difetto (elementi di tipo semplice)

È possibile assegnare agli elementi di tipo semplice un valore per difetto

<xs:element name="colore" type="xs:string" default="rosso" />

È possibile specificare un valore prefissato (fixed) (non è possibile specificare un altro valore)

<xs:element name="colore" type="xs:string" fixed="rosso" />

Uso di attributi

Gli attributi sono sempre di tipo semplice (predefinito o derivato per restrizione)

Tutti gli attributi sono opzionali per difetto

Per specificare esplicitamente che un attributo è opzionale è necessario specificare l'attributo "use".

<xs:attribute name="lang" type="xs:string" use="optional" />

Per rendere un attributo obbligatorio:

<xs:attribute name="lang" type="xs:string" use="required" />

Per proibire l'uso di un attributo

<xs:attribute name="lang" use="prohibited" />

Occorrenze di attributi

Gli attributi possono occorrere una sola volta

È possibile assegnare agli attributi un valore per difetto

<xs:attribute name="lang" type="xs:string" default="IT" />

È possibile specificare un valore prefissato (fixed) (non è possibile specificare un altro valore)

<xs:attribute name="lang" type="xs:string" fixed="IT" />

Vincoli sui tipi semplici (derivazione per restrizione)

  • È possibile definire dei tipi di dato derivandoli dai tipi di dato semplici predefiniti e derivati, restringendone il campo di validità (range).
  • L'elemento simpleType viene usato per definire il nome del tipo derivato.
  • L'elemento restriction indica il tipo base da cui si deriva il nuovo tipo.
  • Esempio: creiamo un nuovo tipo "percentuale" il cui valore può essere compreso tra 0 e 100 (i valori minimo e massimo sono inclusi) derivando dal tipo base "integer"
    <xsd:simpleType name="percentuale">
     	<xsd:restriction base="xsd:integer">
    	    <xsd:minInclusive value="0" />
    	    <xsd:maxInclusive value="100" />
    	</xsd:restriction>
    </xsd:simpleType>
  • Gli elementi minInclusive e maxInclusive sono detti facet (sfaccettature)

Facet (Sfaccettature)

  • Definizione di un nuovo tipo di dato "CodiceType" derivato (per restrizione) dal tipo semplice ID
  • Vincoliamo il valore di questo tipo con una facet chiamato pattern (modello) sulla base dell'espressione "[a-zA-Z]{1}-\d{3}" che si legge 1 lettera compresa tra la a e la z minuscole o tra la A e la Z maiuscole seguita una linea (-) e da da 3 cifre
    <xsd:simpleType name="CodiceType">
      <xsd:restriction base="xsd:ID">
        <xsd:pattern value="[a-zA-Z]{1}-\d{3}"/>
      </xsd:restriction>
    </xsd:simpleType>

Espressioni - Pattern

SIMBOLO Valori possibili
\d numero decimale
\s\w uno spazio seguito da un carattere (word)
&#xF1 ?
\p{Lu} carattere maiuscolo
\p{IsGreek} carattere dell'alfabeto Greco
\P{IsGreek} carattere non dell'alfabeto Greco
a*x *=0,1,n volte --> x, ax, aax, aaax, ...
a?x ? = 0, 1 volte --> x, ax
a+x +=1,n volte --> ax, aax, aaax, ...
(a|b)+x a oppure b, seguito da x --> ax, bx, aax, bbx, abx, ...
[abcde]x [ ] uno dei simboli presenti all'interno ax, bx, cx, dx, ex
[a-e] uno dei simboli tra "a" ed "e" (minuscolo) a, b,c, d, e
[-ae]x -x, ax, ex
[^0-9]x qualsiasi carattere non compreso tra 0 e 9 seguito da x
\D qualsiasi carattere non cifra numerica seguito da x
.x qualsiasi carattere seguito da x
.*abc.* qualsiasi sequenza di caratteri seguita da abc seguita da qualsiasi sequenza di caratteri
ab{2}x abbx (2 volte il carattere b)
ab{2,4}x da 2 a 4 volte il carattere b --> abbx, abbbx, abbbbx
ab{2,}x almeno 2 caratteri b --> abbx, abbbx, abbbx, ...

Facet

length lunghezza fissa
minLength lunghezza minima
maxLength lunghezza massima
pattern modello (espressione regolare)
enumeration enumerazione
whiteSpace spazio
minExclusive valore minimo (non incluso)
maxExclusive valore massimo (non incluso)
minInclusive valore minimo (incluso)
maxInclusive valore massimo (incluso)
totalDigits numero totale di cifre
fractionDigits numero cifre dopo la virgola per un decimale, frazione di secondo,...)

applicabili sulla base del tipo (numerico, stringa, binario)

Appendice B della raccomandazione: "Simple Types & their Facets"

Tipi enumerati: enumeration facet

  • Tra i vari facet quello "enumeration" permette di restringere gli elementi di tipo semplice (eccetto il tipo boolean) ad un insieme di valori distinti
  • Esempio di definizione di un nuovo tipo LinguaType derivato dal tipo base string il cui valore deve essere uno dei valori elencati:
    <xsd:simpleType name="LinguaType">
    	<xsd:restriction base="xsd:string">
    		<xsd:enumeration value="Italiana"/>
    		<xsd:enumeration value="Francese"/>
    		<xsd:enumeration value="Inglese"/>
    	</xsd:restriction>
    </xsd:simpleType>

Definizione di tipo anonimo

È possibile definire insiemi di tipi nominati e dichiarare elementi che li riferiscono

È possibile definire un nuovo tipo anonimamente all'interno della definizione di un elemento (comodo nel caso il nuovo tipo venga usato solo una volta)

<xsd:complexType name="Oggetti">  <!-- Tipo nominato -->
   <xsd:sequence>
	 <xsd:element name="oggetto" minOccurs="0" maxOccurs="unbounded">
	     <xsd:complexType>  <!-- Tipo anonimo -->
		<xsd:sequence>
			<xsd:element name="nomeProdotto" type="xsd:string"/>
			<xsd:element name="quantita">
				<xsd:simpleType>  <!-- Tipo anonimo -->
					<xsd:restriction base="xsd:positiveInteger">
						<xsd:maxExclusive value="100"/>
 					</xsd:restriction>
				</xsd:simpleType>
			</xsd:element>
			<xsd:element name="prezzo"  type="xsd:decimal"/>
			<xsd:element name="dataAcquisto" type="xsd:date" minOccurs="0"/>
		</xsd:sequence>
	    </xsd:complexType>
	 </xsd:element>
   </xsd:sequence>
</xsd:complexType>

Contenuto misto (mixed)

Normalmente i dati in forma di carattere (PCDATA) sono ammessi all'interno degli elementi

XML Schema fornisce un metodo per permettere che tali dati possano essere esterni ai sotto-elementi

<lettera>
<saluto>Caro Sig. </saluto><nome>Mario Rossi</nome>
Il giorno <dataSpedizione>200-03-21</dataSpedizione>
abbiamo provveduto a spedirle n. <quantitativo>1</quantitativo> 
<nomeProdotto>computer</nomeProdotto> 
Cordiali saluti
</lettera>

Schema XML relativo

<xsd:element name="lettera">
   <xsd:complexType mixed="true">
	  <xsd:sequence>
		<xsd:element name="saluto" type="xsd:string">
		<xsd:element name="nome" type="xsd:string" />
		<xsd:element name="dataSpedizione"    type="xsd:date" />
		<xsd:element name="quantitativo"    type="xsd:positiveInteger"/>
		<xsd:element name="nomeProdotto" type="xsd:string" />
	</xsd:sequence>
   </xsd:complexType>
</xsd:element>

Costruzione di modelli di contenuto (choice)

Oltre al modello sequence esiste un altro modello per per vincolare gli elementi: choice. In un gruppo gli elementi possono apparire in modo mutuamente esclusivo (or)

<xsd:complexType name="primoOsecondoType">
	<xsd:choice>
   		<xsd:element name="primo" type="xsd:string" />
 		<xsd:element name="secondo" type="xsd:string" />
 	 </xsd:choice>
</xsd:complexType>

Esercizio

Scrivere uno Schema XML che rappresenti una classe di documenti "residenza" con queste caratteristiche:
Per ogni persona indicare la nuova residenza (via, numero civico, cap, comune, data cambio di residenza)
e ogni eventuale precedente residenza

Scrivere una istanza XML conforme allo Schema XML definito

Validare il documento (Validatore)

Anagrafe.dtd

<!ELEMENT anagrafe (cie+)>
<!ELEMENT cie (cognome, nome, datanascita, luogonascita, luogoresidenza?, infoaggiuntiva*)>
<!ATTLIST cie
	numerocarta ID #REQUIRED>
<!ELEMENT cognome (#PCDATA)>
<!ELEMENT nome (#PCDATA)>
<!ELEMENT datanascita (giorno, mese, anno)>
<!ELEMENT giorno (#PCDATA)>
<!ELEMENT mese (#PCDATA)>
<!ELEMENT anno (#PCDATA)>
<!ELEMENT luogonascita (comune, provincia, statoestero?)>
<!ELEMENT comune (#PCDATA)>
<!ELEMENT provincia (#PCDATA)>
<!ELEMENT statoestero (#PCDATA)> 	<!-- solo se != Italia -->
<!ELEMENT luogoresidenza (comune, provincia, statoestero?)> 	<!-- solo se diversa da quella di nascita  -->
<!ELEMENT infoaggiuntiva (#PCDATA)>

Anagrafe.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="anagrafe">
     <xs:complexType>
	<xs:sequence>
	   <xs:element name="cie" type="cieType" maxOccurs="unbounded"/>
	</xs:sequence>
     </xs:complexType>
  </xs:element>
  <xs:complexType name="cieType">
     <xs:sequence>
	<xs:element ref="cognome"/>
	<xs:element ref="nome"/>
	<xs:element name="datanascita" type="datanascitaType"/>
	<xs:element name="luogonascita" type="luogonascitaType"/>
	<xs:element name="luogoresidenza" type="luogoresidenzaType" minOccurs="0"/>
	<xs:element ref="infoaggiuntiva" minOccurs="0"  maxOccurs="unbounded"/>
     </xs:sequence>
     <xs:attribute name="numerocarta" type="xs:ID" use="required"/>
  </xs:complexType>
  <xs:element name="cognome" type="xs:string"/>
  <xs:element name="nome" type="xs:string"/>
 <xs:complexType name="datanascitaType">
      <xs:sequence>
	<xs:element ref="giorno"/>
	<xs:element ref="mese"/>
	<xs:element ref="anno"/>
      </xs:sequence>
  </xs:complexType>
  
  <xs:element name="giorno" type="xs:gDay"/>
  <xs:element name="mese" type="xs:gMonth"/>
  <xs:element name="anno" type="xs:gYear"/>
  <xs:element name="infoaggiuntiva" type="xs:string"/>
  <xs:complexType name="luogonascitaType">
      <xs:sequence>
	<xs:element ref="comune"/>
	<xs:element ref="provincia"/>
	<xs:element ref="statoestero" minOccurs="0"/>
      </xs:sequence>
  </xs:complexType>
  <xs:complexType name="luogoresidenzaType">
      <xs:sequence>
	<xs:element ref="comune"/>
	<xs:element ref="provincia"/>
	<xs:element ref="statoestero" minOccurs="0"/>
      </xs:sequence>
  </xs:complexType>
  <xs:element name="comune" type="xs:string"/>
  <xs:element name="provincia" type="xs:string"/>
  <xs:element name="statoestero" type="xs:string"/>
</xs:schema>

Grazie per l' attenzione

Domande?


Se non è sul Web non esiste ...

... troverete le slide all'indirizzo (http://www1.isti.cnr.it/~Martinelli/XML/doc/Corsi_Regione2010/)