eXtensible Markup Language Tutorial - by Marco Giannì
Capitolo IV: Ampliare i documenti XML

Funzionamento degli schemi

Dal momento che uno degli obiettivi principali di XML-Data è di fornire una valida alternativa alle DTD, riprendiamo l'esempio di DTD del messaggio di posta elettronica e trasformiamolo in uno schema XML-Data. In questo modo sarà possibile evidenziare le corrispondenze tra DTD e schemi.

MESSAGGIO DI POSTA ELETTRONICA

Il documento XML utilizzato nei capitoli precedenti era un messaggio di posta elettronica che comprendeva le informazioni dell'intestazione e il contenuto del documento. Ecco il codice XML che appartiene a quel documento:

<?xml version="1.0"?>
<!DOCTYPE EMAIL SYSTEM "my.dtd">

<EMAIL LANGUAGE="Western" ENCRYPTED="128" PRIORITY="HIGH">
 <TO>Marco@msn.com</TO>
 <FROM>&SIGNATURE;@msn.com</FROM>
 <CC>Giuseppe@msn.com</CC>
 <BCC>Naomi@msn.com</BCC>
 <SUBJECT>Congratulazioni</SUBJECT>
 <BODY>
  Ciao, questo e' un esempio
	di file XML !
 </BODY>
</EMAIL>

Il documento contiene attributi, entità interne e riferimenti alla DTD nel prologo.

DTD

Una delle operazioni che verranno effettuate sarà la sostituzione della DTD con uno schema. Prima di tutto sarà necessario rivedere la DTD:

<?xml version="1.0"?>
<!ELEMENT EMAIL (TO+, FROM, CC*, BCC*, SUBJECT?, BODY?)>
<!ATTLIST EMAIL
 LANGUAGE (Western|Greek|Latin|Universal) "Western"
 ENCRYPTED CDATA #IMPLIED
 PRIORITY (NORMAL|LOW|HIGH) "NORMAL">

<!ELEMENT TO (#PCDATA)>
<!ELEMENT FROM (#PCDATA)>
<!ELEMENT CC (#PCDATA)>

<!ELEMENT BCC (#PCDATA)>
<!ATTLIST BCC	
 HIDDEN CDATA #FIXED "TRUE">

<!ELEMENT SUBJECT (#PCDATA)>
<!ELEMENT BODY (#PCDATA)>

<!ENTITY SIGNATURE "Flavio">

Sarà necessario incorporare alcuni elementi della DTD nello schema. Oltre a definire la struttura generale di un messaggio di posta elettronica, il DTD contiene altri elementi specifici.

  • L'elemento To è dichiarato con un segno (+), a indicare che dovrà occorrere una o più volte.
  • L'elemento From è dichiarato senza alcun simbolo, a indicare che dovrà occorrere una sola volta.
  • Gli elementi Cc e Bcc sono dichiarati con un asterisco (*), a indicare che gli elementi sono opzionali, ma possono occorrere più di una volta.
  • Gli elementi Subject e Body sono dichiarati con un punto di domanda (?), a indicare che gli elementi sono opzionali, ma possono essere ripetuti più di una volta.
  • Gli elementi Email e Bcc hanno attributi associati, con valori predefiniti.
  • La maggior parte degli elementi sono dichiarati come elementi di testo (#PCDATA).
  • L'entità Signature è dichiarata e contiene un valore.

Gli elementi indicano quanto è necessario per creare un documento dello schema che soddisfi i criteri di corrispondenza con la DTD. L'ultimo elemento necessario per utilizzare questi esempi è una pagina XSL utilizzata come modello per visualizzare i dati.

PAGINA XSL

La pagina XSL utilizzata per visualizzare il contenuto XML è la seguente:

<?xml version="1.0"?>
<xsl:template xmlns:xsl="uri:xsl">

 <DIV STYLE="font-weight:bold;font-size:20">
  To:
  <SPAN STYLE="font-weight:normal;color:red">
   <xsl:value-of select="EMAIL/TO"/>
  </SPAN>
 </DIV>
 <BR></BR>

 <DIV STYLE="font-weight:bold;font-size:20">
  From:
  <SPAN STYLE="font-weight:normal;color:red">
   <xsl:value-of select="EMAIL/FROM"/>
  </SPAN>
 </DIV>
 <BR></BR>

 <DIV STYLE="font-weight:bold;font-size:20">
  Cc:
  <SPAN STYLE="font-weight:normal;color:red">
  <xsl:value-of select="EMAIL/CC"/>
  </SPAN>
 </DIV>
 <BR></BR>

 <DIV STYLE="font-weight:bold;font-size:20">
  Subject:
  <SPAN STYLE="font-weight:normal;color:red">
   <xsl:value-of select="EMAIL/SUBJECT"/>
  </SPAN>
 </DIV>
 <HR></HR>

 <SPAN STYLE="font-style:italic;font-size:32;color:orange">
  <xsl:value-of select="EMAIL/BODY"/>
 </SPAN>

</xsl:template>

La visualizzazione del documento è la seguente:

clicca qui per vedere l'esempio email.xml (solo MSIE 5.0 o superiore)

SCHEMA

A questo punto procediamo con la creazione dello schema. E' necessario innanzitutto creare il documento dello schema. Le regole semantiche e strutturali dovranno essere le stesse utilizzate nella DTD. L'esempio seguente contiene il codice dello schema:

<?xml version="1.0"?>

<Schema name="email" xmlns="urn:schemas-microsoft-com:xml-data"
 xmlns:dt="urn:schemas-microsoft-com:datatypes">

 <AttributeType name="language" dt:type="enumeration" 
  dt:values="Western Greek Latin Universal"/>
 <AttributeType name="encrypted"/>
 <AttributeType name="priority" dt:type="enumeration" dt:values="NORMAL LOW HIGH"/>
 <AttributeType name="hidden" default="true"/>

 <ElementType name="to" content="textOnly"/>
 <ElementType name="from" content="textOnly"/>
 <ElementType name="cc" content="textOnly"/>

 <ElementType name="bcc" content="mixed">
  <attribute type="hidden" required="yes"/>
 </ElementType>

 <ElementType name="subject" content="textOnly"/>
 <ElementType name="body" content="textOnly"/>

 <ElementType name="email" content="eltOnly">
  <attribute type="language" default="Western"/>
  <attribute type="encrypted"/>
  <attribute type="priority" default="NORMAL"/>
  <element type="to" minOccurs="1" maxOccurs="*"/>
  <element type="from" minOccurs="1" maxOccurs="1"/>
  <element type="cc" minOccurs="0" maxOccurs="*"/>
  <element type="bcc" minOccurs="0" maxOccurs="*"/>
  <element type="subject" minOccurs="0" maxOccurs="1"/>
  <element type="body" minOccurs="0" maxOccurs="1"/>
 </ElementType>

</Schema>

Lo schema è molto diverso dalla DTD, tuttavia si tratta sempre di codice XML, per cui la sintassi e l'impostazione sono familiari. A questo punto controlliamo il codice in base al seguente elenco di requisiti.

L'elemento To è dichiarato in modo che sia ripetuto una o più volte. I riferimenti all'elemento To sono gli attributi minOccurs="1" e maxOccurs="*", che indicano che l'elemento deve occorrere almeno una volta e che il numero di ripetizioni è illimitato.

L'elemento From è dichiarato in modo che occorra una sola volta. I riferimenti all'elemento From sono minOccurs="1" e maxOccurs="1", che indicano che l'elemento deve occorrere una sola volta.

Gli elementi Cc e Bcc sono dichiarati in modo che gli elementi siano opzionali e occorrano più di una volta. Ambedue gli elementi devono contenere gli attributi minOccurs="0" e maxOccurs="*", che indicano che sono opzionali e che il numero di occorrenze è illimitato.

Gli elementi Subject e Body sono dichiarati in modo che gli elementi siano opzionali e che possano occorrere una sola volta. Gli attributi minOccurs="0" e maxOccurs="1" indicano che gli elementi sono opzioni e che possono apparire una sola volta.

Gli elementi Email e Bcc hanno attributi associati, con valori predefiniti dove necessario. I tipi di attributi sono dichiarati nel livello superiore del documento e vi viene fatto riferimento nelle rispettive dichiarazioni dei tipi di elemento. Non occorre dichiarare i tipi di attributi al livello superiore, poiché è sufficiente che siano dichiarazioni a livello locale.

La maggior parte degli elementi è dichiarata come elementi di testo. La maggior parte delle dichiarazioni include l'attributo content"textOnly", che indica che esse contengono solo testo. L'eccezione è rappresentata dall'elemento Email, che contiene solo sottoelementi, e dall'elemento Bcc, che contiene un attributo oltre al testo.

L'entità Signature è dichiarata e contiene un valore. Le entità non sono ancora supportate negli schemi XML-Data, per cui non è necessario aggiungere nulla.

Se lo schema soddisfa tutti i requisiti relativi al messaggio di posta elettronica, è possibile passare alla modifica dell'elemento XML per utilizzarlo con lo schema, nel modo seguente:

<?xml version="1.0"?>

<em:email xmlns:em="x-schema:myschema.xml" language="Western" 
  encrypted="128" priority="HIGH">
 <em:to>Marco@msn.com</em:to>
 <em:from>Flavio@msn.com</em:from>
 <em:cc>Giuseppe@msn.com</em:cc>
 <em:subject>Congratulazioni</em:subject>
 <em:body>Ciao, questo e' un esempio di file</em:body>
</em:email>

In questo modo è possibile notare due importanti differenze rispetto alla versione DTD nel documento XML. Innanzitutto, invece del riferimento alla DTD nel prologo, nell'elemento em:email è presente lo spazio del nome dello schema. Inoltre nel documento tutti i tag degli elementi contengono il prefisso em, che li identifica come parte di un namespace associato. Ad eccezione di queste due piccole ma importanti differenze, il documento è fondamentalmente lo stesso utilizzato per l'esempio del messaggio di posta elettronica iniziale. Le regole strutturali del documento sono uguali perché da un punto di vista funzionale lo schema corrisponde alla DTD creata precedentemente. Per formattare il documento XML, viene utilizzato lo stesso foglio di stile XSL del messaggio di posta elettronica con l'unica differenza che nei pattern viene inserito il prefisso em.

<?xml version="1.0"?>
<xsl:template xmlns:xsl="uri:xsl">

 <DIV STYLE="font-weight:bold;font-size:20">
  To:
  <SPAN STYLE="font-weight:normal;color:red">
   <xsl:value-of select="em:email/em:to"/>
  </SPAN>
 </DIV>
 <BR></BR>

 <DIV STYLE="font-weight:bold;font-size:20">
  From:
  <SPAN STYLE="font-weight:normal;color:red">
    <xsl:value-of select="em:email/em:from"/>
  </SPAN>
 </DIV>
 <BR></BR>

 <DIV STYLE="font-weight:bold;font-size:20">
  Cc:
  <SPAN STYLE="font-weight:normal;color:red">
   <xsl:value-of select="em:email/em:cc"/>
  </SPAN>
 </DIV>
 <BR></BR>

 <DIV STYLE="font-weight:bold;font-size:20">
  Subject:
  <SPAN STYLE="font-weight:normal;color:red">
   <xsl:value-of select="em:email/em:subject"/>
  </SPAN>
 </DIV>
 <HR></HR>

 <SPAN STYLE="font-style:italic;font-size:32;color:orange">
  <xsl:value-of select="em:email/em:body"/>
 </SPAN>

</xsl:template>

E' possibile notare che nonostante il codice sia molto diverso rispetto ai documenti di origine, il risultato è pressoché lo stesso. Inoltre si ottiene un documento convalidato con i vantaggi offerti da uno schema, invece di una DTD, insieme alle potenzialità e alla flessibilità dell'XSL per la formattazione.

<indietro home page avanti>

Copyright © 2000-2005. Tutti i diritti sono riservati. Per informazioni: mgianni@infinito.it