XML/Relazione uno-molti

< XML
Indice del libro

Obiettivi di apprendimento

  • Scoprire le diverse tecniche di implementazione delle relazioni uno-a-molti in XML
  • Creare tipi di dati personalizzati in uno schema XML
  • Creare elementi vuoti con attributi in un documento XML
  • Definire un layout di presentazione per un documento XML utilizzando una tabella con diversi colori di sfondo e caratteri differenti, e visualizzare le immagini in un foglio di stile XML

Introduzione

modifica

In una relazione uno-a-molti, un oggetto può fare riferimento a più istanze di un altro oggetto. Un modello è mappato in uno schema in cui ogni entità del modello di dati diventa un tipo di elemento complesso. Ogni attributo del modello di dati diventa un semplice tipo di elemento e la relazione uno-a-molti viene registrata come una sequenza.

Nel capitolo precedente, abbiamo introdotto un semplice schema XML, un documento XML e un foglio di stile XML per un modello di dati a entità singola. Ora includiamo più funzionalità di ciascuno degli aspetti chiave di XML.

Implementazione di una relazione uno-a-molti

modifica

Esistono tre diverse tecniche per implementare una relazione uno-a-molti:

Relazione di contenimento: è definita una struttura in cui un elemento è contenuto in un altro. L'elemento "contenuto" cessa di esistere quando viene rimosso l'elemento "contenitore". Ad esempio, se una città ha molti hotel, gli hotel sono "contenuti" nella città.

  <cityDetails>
    <cityName>Belmopa</cityName>
    <hotelDetails>
      <hotelName>Bull Frog Inn</hotelName>
   </hotelDetails>
    <hotelDetails>
      <hotelName>Pook's Hill Lodge</hotelName>
   </hotelDetails>
 </cityDetails>
  <cityDetails>
    <cityName>Kuala Lumpur</cityName>
    <hotelDetails>
      <hotelName>Pan Pacific Kuala Lumpur</hotelName>
   </hotelDetails>
    <hotelDetails>
      <hotelName>Mandarin Oriental Kuala Lumpur</hotelName>
   </hotelDetails>
 </cityDetails>

Rapporti interni a un documento: nel caso in cui hai una città con molti hotel, un hotel avrà una relazione "di posizione" con una città. Un identificativo della città viene utilizzato come riferimento sull'elemento dell'hotel. Pertanto, piuttosto che gli hotel che sono contenuti nella città, ora fanno semplicemente riferimento all'id della città tramite l'attributo cityRef. Questo è molto simile a una chiave esterna in un database relazionale.

  <cityDetails>
   <city ID="c1">
    <cityName>Belmopa</cityName>
  </city ID>
   <city ID="c2">
    <cityName>Kuala Lumpur</cityName>
  </city ID>
 </cityDetails>
  <hotelDetails>
    <hotel cityRef="c1">
      <hotelName>Bull Frog Inn</hotelName>
   </hotel>
    <hotel cityRef="c2">
      <hotelName>Pan Pacific Kuala Lumpur</hotelName>
   </hotel>
 </hotelDetails>

Relazioni tra documenti: la relazione tra documenti è molto simile alla relazione interna a un documento. Utilizza inoltre gli attributi id e idRef per assegnare un attributo a un attributo padre. La differenza è che la relazione tra documenti viene utilizzata quando le tabelle, come le tabelle delle città e degli hotel, potrebbero vivere in diversi filesystem o tablespace.

  <city id="c1">
    <cityName>Belmopa</cityName>
 </city>
  <city id="c2">
    <cityName>Kuala Lumpur</cityName>
 </city>
  <hotel>
    <city href="cityDetails.xml#c1" />
    <hotelName>Bull Frog Inn</hotelName>
 </hotel>
  <hotel>
    <city href="cityDetails.xml#c2" />
    <hotelName>Pan Pacific Kuala Lumpur</hotelName>
 </hotel>
Lista di controllo per decidere quale tecnica usare:
Tecnica Trasferimento dati Flessibilità Facilità d'uso
Contenimento Eccellente Discreto Eccellente
Interno a un documento Buono Buono Buono
Tra documenti Discreto Eccellente Discreto

Schema XML

modifica

Alcuni dei tipi di dati incorporati per uno schema XML sono stati introdotti nel capitolo precedente, ma ci sono anche altri che sono molto utili, come anyURI, date, time, year e month. Oltre ai tipi di dati integrati, il progettista dello schema può definire un tipo di dati personalizzato per accettare input di dati specifici. Come abbiamo imparato, i dati sono definiti in documenti XML utilizzando tag di markup definiti in uno schema XML. Tuttavia, alcuni elementi potrebbero non avere valori. Un tag elemento vuoto può essere utilizzato per affrontare questa situazione. Un tag elemento vuoto (e qualsiasi tag di markup personalizzato) può contenere attributi che aggiungono ulteriori informazioni sul tag senza aggiungere testo ulteriore all'elemento. Un esempio verrà mostrato nel capitolo, utilizzando gli attributi in un tag elemento vuoto.

Elementi vuoti con attributi nel documento XML

modifica

Gli elementi possono avere diversi tipi di contenuto a seconda di come ciascun elemento è definito nello schema XML. I diversi tipi sono element content, mixed content, simple content e empty content. Un elemento XML è costituito da tutto, dal tag di apertura dell'elemento a quello di chiusura.

  • Un elemento che contiene altri elementi è l'elemento radice - tutto ciò che si trova tra i tag di apertura e di chiusura è composto solo da elementi.
Esempio:<tourGuide>
       :
 </tourGuide>
  • Un elemento di contenuto misto ha testo e altri elementi tra i suoi tag di apertura e di chiusura.
Esempio:<ristorante>Il mio ristorante preferito è
 <restaurantName>Ristorante italiano di Provino</restaurantName>
       :
 </ristorante>
  • Un semplice elemento di contenuto contiene solo testo tra i suoi tag di apertura e di chiusura.
Esempio: <restaurantName>Ristorante italiano di Provino</restaurantName>
  • Un elemento di contenuto vuoto, cioè un elemento vuoto, non contiene nulla tra i suoi tag di apertura e di chiusura.
Esempio: <hotelPicture filename="pan_pacific.jpg" size="80"
         value="Immagine di Pan Pacific" />

Un elemento vuoto è utile quando non è necessario specificarne il contenuto o quando le informazioni che descrivono l'elemento sono corrette. Due esempi illustrano questo concetto:

  1. un elemento immagine che fa riferimento alla fonte di un'immagine con i suoi attributi, ma non ha bisogno di specificare il contenuto del testo;
  2. il nome del proprietario è fisso per un'azienda, quindi può specificare le informazioni correlate all'interno del tag proprietario utilizzando gli attributi.

Un attributo è una meta-informazione, cioè un'informazione che descrive il contenuto dell'elemento.

L'uso di XML da parte della Banca Centrale Europea

modifica
<?xml version="1.0" encoding="UTF-8"?>
<gesmes:Envelope xmlns:gesmes="http://www.gesmes.org/xml/2002-08-01"
xmlns="http://www.ecb.int/vocabulary/2002-08-01/eurofxref">
    <gesmes:subject>Tassi di riferimento</gesmes:subject>
    <gesmes:Sender>
        <gesmes:name>Banca centrale europea</gesmes:name>
   </Gesmes:Sender>
    <Cube>
        <Cube time="2004-05-28">
            <Cube currency="USD" rate="1.2246"/>
            <Cube currency="JPY" rate="135.77"/>
            <Cube currency="DKK" rate="7.4380"/>
            <Cube currency="GBP" rate="0.66730"/>
            <Cube currency="SEK" rate="9.1150"/>
            <Cube currency="CHF" rate="1.5304"/>
            <Cube currency="ISK" rate="87.72"/>
            <Cube currency="NOK" rate="8.2120"/>
       </Cube>
   </Cube>
</gesmes:Envelope>

Tipi di dati dello schema XML

modifica

Alcuni dei tipi di dati comunemente usati, come stringhe, decimali, interi e booleani, sono stati introdotti nel capitolo 2. I seguenti sono alcuni altri tipi di dati utili.

Altri tipi di dati
Tipo Formato Esempio Commento
anno AAAA 1999  
month YYYY-MM 1999-03 Il tipo di mese viene utilizzato quando il giorno è irrilevante per l'elemento dati
time hh:mm:ss.sss con indicatore facoltativo del fuso orario 20:14:05 Z per UTC o uno di -hh:mm o +hh:mm per indicare la differenza rispetto a UTC. Questo tipo di orario viene utilizzato quando desideri che il contenuto rappresenti una determinata ora del giorno che ricorre ogni giorno, ad esempio alle 16:15.
data AAAA-MM-DD 1999/3/14  
anyURI Il nome di dominio specificato che inizia con http: // http://www.panpacific.com  

Altri tipi di dati

modifica

Oltre ai tipi di dati integrati, è possibile creare tipi di dati personalizzati in base alle richieste. Un tipo di dati personalizzato può essere di tipo semplice o complesso. Per semplicità, creiamo un tipo di dati personalizzato di tipo semplice, il che significa che l'elemento non contiene altri elementi o attributi, ma contiene solo testo. La creazione di un tipo di dato semplice personalizzato inizia dall'utilizzo di un tipo semplice incorporato e applicandolo con restrizioni per limitare i valori accettabili del tag. Questo tipo di dato può essere con o senza nome. Se il tipo di dato deve essere utilizzato una sola volta, allora ha senso non nominarlo; quindi, quel tipo di dato verrà utilizzato solo nel punto in cui è definito. Poiché un tipo personalizzato denominato può essere referenziato (con il suo nome), quel tipo di dato può essere utilizzato ovunque sia necessario.

Un pattern può essere usato per specificare esattamente come dovrebbe apparire il contenuto dell'elemento. Ad esempio, si potrebbe voler specificare il formato di un numero di telefono, un codice postale o un codice prodotto. Avendo uno schema definito per determinati elementi, i dati scambiati saranno uniformi e i valori saranno coerenti se memorizzati in un database. Un modo utile per impostare i modelli è attraverso Regex, che sarà affrontato nei capitoli successivi.

Esempi di schemi

modifica

Di seguito è riportato uno schema che estende lo schema introdotto nel capitolo precedente per includere una relazione uno-a-molti tra città e hotel con due esempi di tipi di dati personalizzati.

Importante: questo è un esempio continuo, quindi un nuovo codice viene aggiunto all'esempio dell'ultimo capitolo!

Esempio di contenimento

modifica
 <?xml version="1.0" encoding="UTF-8"?>
<xds:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">

  <!-- Guida turistica -->

  <xds:element name="tourGuide">
    <xsd:complexType>
      <xsd:sequence>
        <xds:element name="city" type="cityDetails" minOccurs="1" maxOccurs="unbounded" />
     </xsd:sequence>
   </xsd:complexType>
 </xsd:element>

  <!-- Questo conterrà i dettagli della città -->

  <xds:complexType name="cityDetails">
    <xsd:sequence>
      <xds:element name="cityName" type="xsd:string" />
      <xds:element name="adminUnit" type="xsd:string" />
      <xds:element name="country" type="xsd:string" />

      <!-- L'elemento Continent utilizza un tipo semplice personalizzato senza nome -->

      <xds:element name="continent">
        <xsd:simpleType>
          <xds:restriction base="xsd:string">
            <xds:enumeration value="Asia" />
            <xds:enumeration value="Africa" ​​/>
            <xds:enumeration value="Australia" />
            <xds:enumeration value="Europe" />
            <xds:enumeration value="North America" ​​/>
            <xds:enumeration value="South America" ​​/>
            <xds:enumeration value="Antarctica" />
         </xsd:restriction>
       </xsd:simpleType>
     </xsd:element>
      <xds:element name="population" type="xsd:integer" />
      <xds:element name="area" type="xsd:integer" />
      <xds:element name="elevation" type="xsd:integer" />
      <xds:element name="longitude" type="xsd:decimal" />
      <xds:element name="latitude" type="xsd:decimal" />
      <xds:element name="description" type="xsd:string" />
      <xds:element name="history" type="xsd:string" />
      <xds:element name="hotel" type="hotelDetails" minOccurs="1" maxOccurs="unbounded" />
   </xsd:sequence>
 </xsd:complexType>

  <!-- Questo conterrà i dettagli dell'hotel -->

  <xds:complexType name="hotelDetails">
    <xsd:sequence>
      <xds:element name="hotelName" type="xsd:string" />
      <xds:element name="hotelPicture" />
      <xds:element name="streetAddress" type="xsd:string" />
      <xds:element name="postalCode" type="xsd:string" minOccurs="0" />
      <xds:element name="phone" type="xsd:string" />
      <xds:element name="emailAddress" type="emailAddressType" minOccurs="0" />

      <!-- Il tipo di dati semplice personalizzato, emailAddressType, definito in xsd:complexType,
           è usato come il tipo di elemento emailAddress. -->

      <xds:element name="websiteURL" type="xsd:anyURI" minOccurs="0" />
      <xds:element name="hotelRating" type="xsd:integer" />
   </xsd:sequence>
 </xsd:complexType>

  <!-- NOTA: Dal momento che postalCode, emailAddress e websiteURL non sono elementi standard che
          devono essere forniti, il minOccurs="0" indica che sono opzionali -->

  <!-- Questo è un SimpleType personalizzato denominato che viene chiamato da Hotel ogni volta che qualcuno digita in un
      indirizzo email -->

  <xds:simpleType name="emailAddressType">
    <xds:restriction base="xsd:string">

      <!-- Puoi saperne di più su questo modello leggendo la sezione Regex .--->

      <xds:pattern value="\w+\W*\w*@{1}\w+\W*\w+.\w+.*\w*" />
   </xsd:restriction>
 </xsd:simpleType>
</xsd:schema>

Esempio di documento interno

modifica
 <?xml version="1.0" encoding="UTF-8"?>
<xds:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">

  <!-- Guida turistica -->

  <xds:element name="tourGuide">
    <xsd:complexType>
      <xsd:sequence>
        <xds:element name="city" type="cityDetails" minOccurs="1" maxOccurs="unbounded" />
     </xsd:sequence>
   </xsd:complexType>
 </xsd:element>

  <!-- Questo conterrà i dettagli della città -->

  <xds:complexType name="cityDetails">
    <xsd:sequence>
      <xds:element name="cityID" type="xsd:ID" />
      <xds:element name="cityName" type="xsd:string" />
      <xds:element name="adminUnit" type="xsd:string" />
      <xds:element name="country" type="xsd:string" />

      <!-- L'elemento Continent utilizza un tipo semplice personalizzato senza nome -->

      <xds:element name="continent">
        <xsd:simpleType>
          <xds:restriction base="xsd:string">
            <xds:enumeration value="Asia" />
            <xds:enumeration value="Africa" ​​/>
            <xds:enumeration value="Australia" />
            <xds:enumeration value="Europe" />
            <xds:enumeration value="North America" ​​/>
            <xds:enumeration value="South America" ​​/>
            <xds:enumeration value="Antarctica" />
         </xsd:restrizione>
       </xsd:simpleType>
     </xsd:element>
      <xds:element name="population" type="xsd:integer" />
      <xds:element name="area" type="xsd:integer" />
      <xds:element name="elevation" type="xsd:integer" />
      <xds:element name="longitude" type="xsd:decimal" />
      <xds:element name="latitude" type="xsd:decimal" />
      <xds:element name="description" type="xsd:string" />
      <xds:element name="history" type="xsd:string" />
    </xsd:sequence>
 </xsd:complexType>

  <!-- Questo conterrà i dettagli dell'hotel -->

  <xsd:complexType>
      <xsd:sequence>
        <xds:element name="hotel" type="hotelDetails" minOccurs="1" maxOccurs="unbounded" />
     </xsd:sequence>
   </xsd:complexType>
  <xds:complexType name="hotelDetails">
    <xsd:sequence>
      <xds:element name="cityRef" type="xsd:IDRef" />
      <xds:element name="hotelName" type="xsd:string" />
      <xds:element name="hotelPicture" />
      <xds:element name="streetAddress" type="xsd:string" />
      <xds:element name="postalCode" type="xsd:string" minOccurs="0" />
      <xds:element name="phone" type="xsd:string" />
      <xds:element name="emailAddress" type="emailAddressType" minOccurs="0" />

      <!-- Il tipo semplice personalizzato, emailAddressType, definito in xsd:complexType,
           è usato come il tipo di elemento emailAddress. -->

      <xds:element name="websiteURL" type="xsd:anyURI" minOccurs="0" />
      <xds:element name="hotelRating" type="xsd:integer" />
   </xsd:sequence>
 </xsd:complexType>

  <!-- NOTA: Dal momento che postalCode, emailAddress e websiteURL non sono elementi standard che
          devono essere forniti, il minOccurs="0" indica che sono opzionali -->

  <!-- Questo è un SimpleType personalizzato denominato che viene chiamato da Hotel ogni volta che qualcuno digita in un
      indirizzo email -->

  <xds:simpleType name="emailAddressType">
    <xds:restriction base="xsd:string">

      <!-- Puoi saperne di più su questo modello leggendo la sezione Regex .--->

      <xds:pattern value="\w+\W*\w*@{1}\w+\W*\w+.\w+.*\w*" />
   </xsd:restrizione>
 </xsd:simpleType>
</xsd:schema>

Esempio tra documenti

modifica
<?xml version="1.0" encoding="UTF-8"?>
<xds:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">

  <!-- Guida turistica -->

  <xds:element name="tourGuide">
    <xsd:complexType>
      <xsd:sequence>
        <xds:element name="city" type="cityDetails" minOccurs="1" maxOccurs="unbounded" />
     </xsd:sequence>
   </xsd:complexType>
 </xsd:element>

  <!-- Questo conterrà i dettagli della città -->

  <xds:complexType name="cityDetails">
    <xsd:sequence>
      <xds:element name="cityID" type="xsd:ID" />
      <xds:element name="cityName" type="xsd:string" />
      <xds:element name="adminUnit" type="xsd:string" />
      <xds:element name="country" type="xsd:string" />

      <!-- L'elemento Continent utilizza un tipo semplice personalizzato senza nome -->

      <xds:element name="continent">
        <xsd:simpleType>
          <xds:restriction base="xsd:string">
            <xds:enumeration value="Asia" />
            <xds:enumeration value="Africa" ​​/>
            <xds:enumeration value="Australia" />
            <xds:enumeration value="Europe" />
            <xds:enumeration value="North America" ​​/>
            <xds:enumeration value="South America" ​​/>
            <xds:enumeration value="Antarctica" />
         </xsd:restrizione>
       </xsd:simpleType>
     </xsd:element>
      <xds:element name="population" type="xsd:integer" />
      <xds:element name="area" type="xsd:integer" />
      <xds:element name="elevation" type="xsd:integer" />
      <xds:element name="longitude" type="xsd:decimal" />
      <xds:element name="latitude" type="xsd:decimal" />
      <xds:element name="description" type="xsd:string" />
      <xds:element name="history" type="xsd:string" />
    </xsd:sequence>
 </xsd:complexType>
  <!-- Questo conterrà i dettagli dell'hotel -->

<?xml version="1.0" encoding="UTF-8"?>
<xds:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">

  <!-- Guida turistica 2 -->

  <xds:element name="tourGuide2">
  <xsd:complexType>
      <xsd:sequence>
        <xds:element name="hotel" type="hotelDetails" minOccurs="1" maxOccurs="unbounded" />
     </xsd:sequence>
   </xsd:complexType>
  <xds:complexType name="hotelDetails">
    <xsd:sequence>
      <xds:element name="cityRef" type="xsd:IDRef" />
      <xds:element name="hotelName" type="xsd:string" />
      <xds:element name="hotelPicture" />
      <xds:element name="streetAddress" type="xsd:string" />
      <xds:element name="postalCode" type="xsd:string" minOccurs="0" />
      <xds:element name="phone" type="xsd:string" />
      <xds:element name="emailAddress" type="emailAddressType" minOccurs="0" />

      <!-- Il tipo semplice personalizzato, emailAddressType, definito in xsd:complexType,
           è usato come il tipo di elemento emailAddress. -->

      <xds:element name="websiteURL" type="xsd:anyURI" minOccurs="0" />
      <xds:element name="hotelRating" type="xsd:integer" />
   </xsd:sequence>
 </xsd:complexType>

  <!-- NOTA: Dal momento che postalCode, emailAddress e websiteURL non sono elementi standard che
          devono essere forniti, il minOccurs="0" indica che sono opzionali -->

  <!-- Questo è un SimpleType personalizzato denominato che viene chiamato da Hotel ogni volta che qualcuno digita in un
      indirizzo email -->

  <xds:simpleType name="emailAddressType">
    <xds:restriction base="xsd:string">

      <!-- Puoi saperne di più su questo modello leggendo la sezione Regex .--->

      <xds:pattern value="\w+\W*\w*@{1}\w+\W*\w+.\w+.*\w*" />
   </xsd:restrizione>
 </xsd:simpleType>
</xsd:schema>

Fa riferimento al Capitolo 2: Una singola entità per le fasi di utilizzo di NetBeans per creare lo schema XML sopra.

Documento XML

modifica

Attributi

modifica
  • La struttura di denominazione valida degli elementi si applica anche ai nomi degli attributi
  • In un dato elemento, tutti i nomi degli attributi devono essere unici
  • Un attributo non può contenere il simbolo '<' La stringa di caratteri '&lt;' può essere usata per rappresentarla
  • Ogni attributo deve avere un nome e un valore (ad esempio <hotelPicture filename="pan_pacific.jpg" />, filename è il nome e pan_pacific.jpg è il valore)
  • Se il valore assegnato contiene una stringa con virgolette, il tipo di virgolette deve differire da quello utilizzato per racchiudere l'intero valore (ad esempio, se le virgolette doppie vengono utilizzate per racchiudere l'intero valore, utilizzare le virgolette singole per la stringa: <name familiar="'Jack'">John Smith</name>)
  <?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text / xsl" href="city_hotel.xsl"?>
<tourGuide xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="TourGuide3.xsd">

    <!-- Qui è dove si definisce la prima città e tutti i suoi attributi -->

    <city>
        <cityName>Belmopa</cityName>
        <AdminUnit>Cayo</adminUnit>
        <country>Belize</country>

        <!-- Il contenuto dell'elemento "continent" deve essere uno dei valori specificati nell'insieme di
            valori accettabili nello schema XML per l'elemento "continent" -->

        <continent>Sud America</continent>
        <population>11100</population>
        <area>5</area>
        <elevation>130</elevation>
        <longitude>12.3</longitude>
        <latitude>123,4</latitude>
        <description>Belmopan è la capitale del Belize</description>
        <history>Belmopan è stata istituita in seguito alla devastazione della ex capitale, Belize City,
            dall'uragano Hattie nel 1965. L'altopiano e lo spazio aperto influenzarono la scelta e
            i lavori furono avviati nel 1966. Nel 1970 la maggior parte degli uffici e delle operazioni governative erano
            già state spostate nella nuova posizione.</history>

        <!-- Qui è dove memorizzare il nome dell'Hotel e i suoi attributi -->

        <!-- Si noti che gli elementi hotelDetails non contengono l'entità postalCode. Il documento è
            ancora valido, perché postalCode è facoltativo -->

        <hotel>
            <hotelName>Bull Frog Inn</hotelName>

            <!-- L'elemento vuoto, hotelPicture, contiene gli attributi: "filename", "size" e "value", a
                                indicare il nome e la posizione del file immagine, la dimensione desiderata e
                                la descrizione dell'elemento vuoto, hotelPicture -->

            <hotelPicture filename="bull_frog_inn.jpg" size="80" value="Immagine di Bull Frog Inn"
                imageURL="http://www.bullfroginn.com" />
            <streetAddress>25 Half Moon Avenue</streetAddress>
            <phone>501-822-3425</phone>

            <!-- Gli elementi emailAddress devono corrispondere al modello specificato nello schema per essere validi -->

            <emailAddress>bullfrog@btl.net</emailAddress>
            <websiteURL>http://www.bullfroginn.com/</websiteURL>
            <hotelRating>4</hotelRating>
       </hotel>

        <!-- Qui è dove si mettono le informazioni per un altro Hotel -->

        <hotel>
            <hotelName>Pook's Hill Lodge</hotelName>
            <hotelPicture filename="pook_hill_lodge.jpg" size="80" value="Immagine di Pook's Hill
                Lodge "imageURL =" http://www.global-travel.co.uk/pook1.htm "/>
            <streetAddress>Roaring River</streetAddress>
            <phone>440-126-854-1732</phone>
            <emailAddress>info@global-travel.co.uk</emailAddress>
            <websiteURL>http://www.global-travel.co.uk/pook1.htm</websiteURL>
            <hotelRating>3</hotelRating>
       </hotel>
   </city>

    <!-- Qui è dove si definisce un'altra città e i suoi attributi -->

    <city>
        <cityName>Kuala Lumpur</cityName>
        <adminUnit>Selangor</adminUnit>
        <country>Malesia</country>
        <continent>Asia</continent>
        <population>1448600</population>
        <area>243</area>
        <elevation>111</elevation>
        <longitude>101.71</longitude>
        <latitude>3.16</latitude>
        <description>Kuala Lumpur è la capitale della Malesia ed è la città più grande della nazione.
       </description>
        <history>La città fu fondata nel 1857 da minatori cinesi di stagno e rimpiazzò Klang. Nel 1880
            il governo britannico trasferì il suo quartier generale da Klang a Kuala Lumpur, e
            nel 1896 divenne la capitale della Malesia.</history>

        <!-- Qui è dove si mettono le informazioni per un Hotel -->

        <hotel>
            <hotelName>Pan Pacific Kuala Lumpur</hotelName>
            <hotelPicture filename="pan_pacific.jpg" size="80" value="Immagine di Pan Pacific"
             imageURL="http://www.malaysia-hotels-discount.com/hotels/kualalumpur/pan_pacific_hotel/index.shtml" />
            <streetAddress>Jalan Putra</streetAddress>
            <PostalCode>50746</postalCode>
            <phone>1-866-260-0402</phone>
            <EmailAddress>president@panpacific.com</emailAddress>
            <WebsiteURL>http://www.panpacific.com</websiteURL>
            <hotelRating>5</hotelRating>
       </hotel>

        <!-- Qui è dove si mettono le informazioni per un altro Hotel -->

        <hotel>
            <hotelName>Mandarin Oriental Kuala Lumpur</hotelName>
            <hotelPicture filename="mandarin_oriental.jpg" size="80" value="Immagine del mandarino
                Oriental "imageURL =" http://www.mandarinoriental.com/kualalumpur "/>
            <streetAddress>Centro città di Kuala Lumpur</streetAddress>
            <PostalCode>50088</postalCode>
            <phone>011-603-2380-8888</phone>
            <EmailAddress>mokul-sales@mohg.com</emailAddress>
            <WebsiteURL>http://www.mandarinoriental.com/kualalumpur/</websiteURL>
            <hotelRating>5</hotelRating>
       </hotel>
   </city>
</tourGuide>

Si veda il Capitolo 2 - Una singola entità per le fasi di utilizzo di NetBeans per creare il documento XML sopra.

Foglio di stile XML

modifica
<?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="html" />
        <xsl:template match="/">
            <html>
                <head>
                    <title>Guida turistica</titolo>
               </head>
                <body>
                    <h2>Città</h2>
                    <xsl:apply-templates select="tourGuide" />
               </body>
           </html>
       </xsl:template>
        <xsl:template match="tourGuide">
            <xsl:for-each select="city">
                <xsl:text>Città:</xsl:text>
                <xsl:value-of select="cityName" />
                <br/>
                <xsl:text>Popolazione:</xsl:text>
                <xsl:value-of select="population" />
                <br/>
                <xsl:text>Paese:</xsl:text>
                <xsl:value-of select="country" />
                <br/>
                
                <xsl:for-each select="hotel">
                    <xsl:text>Hotel:</xsl:text>
                    <xsl:value-of select="hotelName" />
                    <br/>
               </xsl:for-each>
               
               <br/>
           </xsl:for-each>
       </xsl:template>
 </xsl:stylesheet>