Blocco 2 di Esercizi su XML e XPath
Dato il Documento seguente:
-----------------------------------------------------------------------------<?xml version="1.0"?>
<!DOCTYPE
<!ELEMENT
<!ELEMENT
<!ATTLIST
agenzia
agenzia
viaggio
viaggio
[
(viaggio+,prenotazione*) >
(tappa+, durata, costo, descrizione+) >
codice ID #REQUIRED
tipo CDATA "normale"
>
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ELEMENT
<!ATTLIST
<!ELEMENT
<!ELEMENT
]>
tappa (luogo,giorni) >
luogo (#PCDATA) >
giorni (#PCDATA) >
durata (#PCDATA) >
costo (#PCDATA) >
descrizione (#PCDATA) >
prenotazione (cliente,data) >
prenotazione codice ID #REQUIRED >
cliente (cognome,nome) >
data (#PCDATA) >
<agenzia>
<viaggio codice="0001" tipo="sano">
<tappa>
<luogo>Moena</luogo>
<giorni>1</giorni>
</tappa>
<tappa>
<luogo>Merano</luogo>
<giorni>3</giorni>
</tappa>
<tappa>
<luogo>Bolzano</luogo>
<giorni>3</giorni>
</tappa>
<tappa>
<luogo>Moena</luogo>
<giorni>1</giorni>
</tappa>
<durata>8</durata>
<costo>1000</costo>
<descrizione>Monti, Arrampicate e Passeggiate</descrizione>
</viaggio>
<viaggio codice="0002" tipo="avventuroso">
<tappa>
<luogo>Harlem</luogo>
<giorni>1</giorni>
</tappa>
<tappa>
<luogo>Caracas</luogo>
<giorni>1</giorni>
</tappa>
<tappa>
<luogo>Sing Sing</luogo>
<giorni>2</giorni>
</tappa>
<durata>4</durata>
<costo>321</costo>
<descrizione>Rischio e Pericolo</descrizione>
</viaggio>
<viaggio codice="0003" tipo="perverso">
<tappa>
<luogo>Filippine</luogo>
<giorni>4</giorni>
</tappa>
<tappa>
<luogo>Indonesia</luogo>
<giorni>2</giorni>
</tappa>
<tappa>
<luogo>Sing Sing</luogo>
<giorni>4</giorni>
</tappa>
<durata>4</durata>
<costo>1254</costo>
<descrizione>Bellezze orientali</descrizione>
</viaggio>
<viaggio codice="0004" tipo="culturale">
<tappa>
<luogo>Parma</luogo>
<giorni>2</giorni>
</tappa>
<tappa>
<luogo>Cesena</luogo>
<giorni>1</giorni>
</tappa>
<tappa>
<luogo>Bertinoro</luogo>
<giorni>2</giorni>
</tappa>
<tappa>
<luogo>Cento</luogo>
<giorni>2</giorni>
</tappa>
<durata>7</durata>
<costo>3412</costo>
<descrizione>Gastronomia nostrana</descrizione>
</viaggio>
<prenotazione codice="0004" >
<cliente>
<cognome>Ghini</cognome>
<nome>Vittorio</nome>
</cliente>
<data>11</data>
</prenotazione>
<prenotazione codice="0001" >
<cliente>
<cognome>Ghini</cognome>
<nome>Vittorio</nome>
</cliente>
<data>19</data>
</prenotazione>
<prenotazione codice="0002" >
<cliente>
<cognome>Sicuro</cognome>
<nome>Laura</nome>
</cliente>
<data>5</data>
</prenotazione>
<prenotazione codice="0003" >
<cliente>
<cognome>Clinton</cognome>
<nome>Bill</nome>
</cliente>
<data>6</data>
</prenotazione>
<prenotazione codice="0003" >
<cliente>
<cognome>Flowers</cognome>
<nome>Jennifer</nome>
</cliente>
<data>6</data>
</prenotazione>
<prenotazione codice="0003" >
<cliente>
<cognome>Jackson</cognome>
<nome>Michael</nome>
</cliente>
<data>6</data>
</prenotazione>
</agenzia>
----------------------------------------------------------------------------svolgere i seguenti esercizi:
NB: l’esercizio 7) è complicatuccio ma fattibile, mentre gli
esercizi 8b) e 14) sono molto complicati, percio’ non vi
preoccupate se non riuscite a risolverli.
1) elenco di tutti i clienti
/child::agenzia/descendant::cliente
2) elenco dei viaggi di tipo perverso
/child::agenzia/child::viaggio[attribute::tipo=’perverso’]
3) elenco dei viaggi in cui l’ultima tappa e’ lo stesso luogo della prima tappa.
/child::agenzia/child::viaggio [
child::tappa[position()=1]/child::luogo
=
child::tappa[last()]/child::luogo
]
restituisce, come previsto, questo risultato:
<viaggio codice="0001" tipo="sano">
<tappa>
<luogo>Moena</luogo>
<giorni>1</giorni>
</tappa>
<tappa>
<luogo>Merano</luogo>
<giorni>3</giorni>
</tappa>
<tappa>
<luogo>Bolzano</luogo>
<giorni>3</giorni>
</tappa>
<tappa>
<luogo>Moena</luogo>
<giorni>1</giorni>
</tappa>
<durata>8</durata>
<costo>1000</costo>
<descrizione>Monti, Arrampicate e Passeggiate</descrizione>
</viaggio>
4) durata dei viaggi di Vittorio
id(
/child::agenzia/child::prenotazione[child::cliente/child::nome='Vittorio']/attribute::codice
)/durata
5) prima tappa di tutti i viaggi prenotati da Vittorio
id(
/child::agenzia/child::prenotazione[child::cliente/child::nome='Vittorio']/attribute::codice
)/child::tappa[position()=1]
6) prima tappa di tutti i viaggi prenotati da qualcuno
id(
/child::agenzia/child::prenotazione/attribute::codice
)/child::tappa[position()=1]
7) chi fa viaggi di tipo ‘perverso’ ?
/child::agenzia/child::prenotazione [
attribute::codice
=
/child::agenzia/child::viaggio[attribute::tipo='perverso']/attribute::codice
] /child::cliente
restituisce, come previsto, questo risultato:
<output>
<cliente>
<cognome>Clinton</cognome>
<nome>Bill</nome>
</cliente>
<cliente>
<cognome>Flowers</cognome>
<nome>Jennifer</nome>
</cliente>
<cliente>
<cognome>Jackson</cognome>
<nome>Michael</nome>
</cliente>
</output>
8a) chi fa lo stesso viaggio di Clinton
/child::agenzia/child::prenotazione [
attribute::codice
=
/child::agenzia/child::prenotazione[child::cliente/child::cognome='Clinton']/attribute::codice
]/child::cliente
8b) chi fa lo stesso viaggio di Clinton e nella stessa data
/child::agenzia/child::prenotazione [
(
attribute::codice
=
/child::agenzia/child::prenotazione[child::cliente/child::cognome='Clinton']/attribute::codice
)
and
(
child::data
=
/child::agenzia/child::prenotazione[child::cliente/child::cognome='Clinton'] / child::data)
)
] /child::cliente
8a) ed 8) restituiscono, come previsto, questo risultato:
<output>
<cliente>
<cognome>Clinton</cognome>
<nome>Bill</nome>
</cliente>
<cliente>
<cognome>Flowers</cognome>
<nome>Jennifer</nome>
</cliente>
<cliente>
<cognome>Jackson</cognome>
<nome>Michael</nome>
</cliente>
</output>
9) il viaggio che passa per l’ Indonesia
/child::agenzia/child::viaggio[child::tappa/child::luogo='Indonesia']
10) i viaggi con piu’ di tre tappe
/child::agenzia/child::viaggio[ count( child::tappa ) > 3 ]
11) quanti giorni sta Vittorio a Cento?
id (
/child::agenzia/child::prenotazione[child::cliente/child::nome='Vittorio'] /attribute::codice
)
/child::tappa [ child::luogo='Cento' ] / child::giorni
restituisce, come previsto, questo risultato (2 giorni)
<output>
<giorni>2</giorni>
</output>
12) quanti giorni sta Jennifer a Cento?
id (
/child::agenzia/child::prenotazione[child::cliente/child::nome='Jennifer'] /attribute::codice
)
/child::tappa [ child::luogo='Cento' ] / child::giorni
restituisce, come previsto, questo risultato (cioe’ nessun giorno):
<output>
</output>
13) I viaggi nella cui descrizione compare la stringa ‘astro
/child::agenzia/child::viaggio[ contains( child::descrizione , 'astro' ) ]
restituisce, come previsto, questo risultato
<output>
<viaggio codice="0004" tipo="culturale">
etc. etc. etc.
</viaggio>
</output>
14) Le persone che fanno viaggi che passano per ’Sing Sing’
/child::agenzia/child::prenotazione [
id ( attribute::codice )
/child::tappa/child::luogo='Sing Sing'
]/child::cliente
15) I viaggi in cui l’ultima tappa e’ uguale alla prima tappa
oops, mi scuso, e’ la stessa domanda di 3)
16) L’insieme delle tappe di qualche viaggio, in cui si risiede per piu’ di un
giorno consecutivo.
/child::agenzia/child::viaggio/child::tappa [ child::giorni > 1 ]
restituisce, come previsto, questo risultato :
<output>
<tappa>
<luogo>Merano</luogo>
<giorni>3</giorni>
</tappa>
<tappa>
<luogo>Bolzano</luogo>
<giorni>3</giorni>
</tappa>
<tappa>
<tappa>
<luogo>Sing Sing</luogo>
<giorni>2</giorni>
</tappa>
<luogo>Filippine</luogo>
<giorni>4</giorni>
</tappa>
<tappa>
<luogo>Indonesia</luogo>
<giorni>2</giorni>
</tappa>
<tappa>
<luogo>Sing Sing</luogo>
<giorni>4</giorni>
</tappa>
<tappa>
<luogo>Parma</luogo>
<giorni>2</giorni>
</tappa>
<tappa>
<luogo>Bertinoro</luogo>
<giorni>2</giorni>
</tappa>
<tappa>
<luogo>Cento</luogo>
<giorni>2</giorni>
</tappa>
</output>
Scarica

Blocco 2 di Esercizi su XML e XPath