Specifiche di protocollo
Versione 0.9.07 30 Maggio 2007
Questa versione: WDraft7DSI protocolli ADS (Application Data Source) e ADF (Application Data Formatter) consentono ad una applicazione Web (lato server o lato client) di interrogare fonti informative per ottenere dati e di richiedere specifiche formattazioni di tali dati a moduli esterni per ottenere documenti riproducibili da visualizzatori. Consentono quindi di definire una netta distinzione fra la fase di reperimento delle informazioni da quella di gestione di opportuni layout per una loro adeguata presentazione.
Essi nascono all'interno del progetto LTGB, il cui obiettivo è realizzare portali per la creazione, pubblicazione e personalizzazione di guide turistiche on-demand secondo il modello "Long Tail". Il portale adotta un'architettura a 4 livelli, in cui un modulo chiamato DataSource fornisce i dati, uno chiamato DataFormatter trasforma dati "grezzi" (privi di indicazioni presentazionali) in documenti HTML, PDF, etc. e i moduli ApplicationController? e ApplicationLogic? sono responsabili della logica dell'applicazione, dell'organizzazione dei contenuti e della comunicazione tra le varie parti del sistema.
Questo documento descrive le specifiche del protocollo ADS di riferimento da adottare nella comunicazione fra l'ApplicationController (che sia uno script lato server o uno script lato client) e il modulo Data Source. In questo documento sono quindi riportati sia il formato delle richieste da inoltrare verso il modulo DS, sia il formato delle risposte che possono essere ricevute, sia il protocollo di trasporto per l’invio di richieste/risposte.
Questo documento è stato redatto da Fabio Vitali, Angelo Di Iorio, Silvia Duca, Antonio Feliziani, Luca Furini, LTGB DataSource Working Group.
Deve essere utilizzato come materiale di riferimento per il progetto LTGB per garantire l’interoperabilità fra i gruppi. Questo documento è la versione 0.9.07 del protocollo ed è soggetto a modifiche da parte dei working group organizzati secondo le regole del W3C (http://www.w3.org/Consortium/Process/). I WG potranno emettere i documenti di riferimento aggiornati, numerati e versionati, che verranno usati per le specifiche di interoperabilità.Lo scopo del protocollo LTGB è di permettere ad un’applicazione Web
Nel seguito si indicherà con ADS il protocollo instaurato tra l’applicazione A e la fonte informativa DS.
Tutte le comunicazioni avvengono su canali HTTP, e il formato del documento generato dal DS e richiesto in input dal DF sono variazioni dello stesso formato XML. Il formato XML contiene una parte comune ai due protocolli, alcune parti specifiche, e la possibilità di personalizzare il formato in parte. Inoltre questi documenti XML sono da considerarsi "impacchettati" in una richiesta/risposta SOAP.Questo documento non descrive la sintassi SOAP, ma fornisce la grammatica WSDL alla quale il protocollo deve fare riferimento, perciò qualunque documento relativo alla comunicazione tra ApplicationController? e DS deve utilizzare tecnologie legate ai WebServices?. Tutti i frammenti XML citati in questo documento, quindi, rappresentano il payload di altrettante richieste/risposte SOAP.
Nel capitolo 2 viene dettagliato il protocollo di comunicazione. Il capitolo 3 descrive le richieste al DS mentre il capitolo 4 contiene dettagli sui vari tipi di contenuti XML generati o richiesti dal Data Source in relazione ai possibili servizi. Il capitolo 7 descrive l'ontologia di riferimento usata per classificare e specificare le informazioni contenute nei DS. Il capitolo 8 specifica come debba essere fatta la registrazione dei propri moduli in un elenco condiviso e pubblicamente accessibile.
Per poter comunicare con i Data Source l’applicazione fa riferimento ad alcuni formati specifici per le richieste/risposte. I formati di richiesta e risposta differiscono nella comunicazione con un DS o un DF.
Tale richiesta è realizzata con una GET HTTP di un documento con URL stabilito e reso pubblico da ogni DS al momento della registrazione (nella sezione 8 sono riportate le regole per la registrazione dei data-source). Si assuma ad esempio che nel wiki sia registrato il seguente DS:
NOME | CATALOGO XML | CATALOGO HTML |
---|---|---|
TWDataSource | http://tw.web.cs.unibo.it/TWds.xml | http://tw.web.cs.unibo.it/TWds.html |
L’URL da utilizzare per la richiesta è appunto:
http://tw.web.cs.unibo.it/TWds.xml
Il DS risponde con una auto-descrizione espressa in sintassi XML secondo la seguente grammatica:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkingGroupACDS" xmlns:df="http://vitali.web.cs.unibo.it/view/TechWeb07" targetNamespace="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkingGroupACDS"> <!-- Inclusione degli elementi base della grammatica ( estensione di quelli comuni con il DataSource) --> <xs:import namespace="http://vitali.web.cs.unibo.it/view/TechWeb07" schemaLocation="testo.xsd"/> <xs:element name="catalogoSource"> <xs:complexType> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name="tipo" type="tipoDs_t"/> <xs:element name="descrizione" type="df:testo_t"/> <xs:element name="urlWsdl" type="xs:anyURI"/> </xs:sequence> </xs:complexType> </xs:element> <xs:simpleType name="tipoDs_t"> <xs:restriction base="xs:string"> <xs:enumeration value="intermediary"/> <xs:enumeration value="storage"/> </xs:restriction> </xs:simpleType> </xs:schema>Si noti che il catalogo può essere un documento statico e che è necessario fornire anche una versione human-readable (HTML) dello stesso.
Il ruolo del catalogo di un DS è fondamentale: per ogni richiesta l'AC deve consultare il catalogo del DS e recuperare l'URL completo del WSDL per poter accedere ai servizi del rispettivo DS. Sebbene sia possibile implementare meccanismi di caching, è obbligatorio recuperare dinamicamente l'indirizzo dello script del DS dal catalogo.
Una volta ottenuto il catalogo e di conseguenza l'URI del WSDL, l’AC comunica con i DS disponibili attraverso connessioni HTTP. Le richieste sono tutte SOAP, sono di tipo request/response, e si intendono come chiamata di procedura remota.
Le richieste che possono essere inoltrate verso un DS sono di 7 tipi:
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:ds="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" targetNamespace="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS"> <wsdl:types/> <wsdl:message name="DsService_richiedi_elenco"> <wsdl:part name="param" type="xs:string"/> <wsdl:part name="start" type="xs:integer"/> <wsdl:part name="offset" type="xs:integer"/> <!-- start e' l'indice del primo item da recuperare, offset il numero di item che si vogliono ricevere --> </wsdl:message> <wsdl:message name="DsService_richiedi_elencoResponse"> <wsdl:part name="elenco" type="xs:string"/> </wsdl:message> <!-- richiedi extra ritorna i parametri extra disponibili e supportati per le query da un dato datasource, oltre quelli obbligatori. Vedere la grammatica per ulteriori informazioni --> <wsdl:message name="DsService_richiedi_extra"> </wsdl:message> <wsdl:message name="DsService_richiedi_extraResponse"> <wsdl:part name="supported" type="xs:string"/> </wsdl:message> <wsdl:message name="DsService_richiedi_scheda"> <wsdl:part name="id" type="xs:ID"/> </wsdl:message> <wsdl:message name="DsService_richiedi_schedaResponse"> <wsdl:part name="scheda" type="xs:string"/> </wsdl:message> <wsdl:message name="DsService_richiedi_guida_completa"> <wsdl:part name="id" type="xs:ID"/> </wsdl:message> <wsdl:message name="DsService_richiedi_guida_completaResponse"> <wsdl:part name="guida_completa" type="xs:string"/> </wsdl:message> <wsdl:message name="DsService_inserisci_scheda"> <wsdl:part name="scheda" type="xs:string"/> <!-- la scheda viene sempre inserita nel ds (storage) del gruppo --> </wsdl:message> <wsdl:message name="DsService_inserisci_schedaResponse"> <wsdl:part name="id" type="xs:ID"/> </wsdl:message> <wsdl:message name="DsService_inserisci_commento"> <wsdl:part name="commenti" type="xs:string"/> <!-- cambierei commenti in commento, e' singolo --> <wsdl:part name="idref" type="xs:ID"/> <!-- idref e' l'ID della scheda alla quale il commento e' riferito --> <!-- il commento viene sempre inserito nel ds (storage) del gruppo --> </wsdl:message> <wsdl:message name="DsService_inserisci_commentoResponse"> <wsdl:part name="idref" type="xs:ID"/> </wsdl:message> <wsdl:message name="DsService_richiedi_commento"> <wsdl:part name="start" type="xs:integer"/> <wsdl:part name="offset" type="xs:integer"/> <!-- i commenti vanno memorizzati dal piu' recente al meno recente --> <!-- start e' l'indice del primo commento da recuperare, offset il numero di commenti che si vogliono ricevere --> <wsdl:part name="idref" type="xs:ID"/> <!-- idref e' l'ID della scheda alla quale i commenti son riferiti --> </wsdl:message> <wsdl:message name="DsService_richiedi_commentoResponse"> <wsdl:part name="commenti" type="xs:string"/> </wsdl:message> <wsdl:message name="DsService_Fault"> <wsdl:part name="id" type="xs:integer"/> </wsdl:message> <wsdl:portType name="DsServicePort"> <wsdl:operation name="richiedi_elenco"> <wsdl:input message="ds:DsService_richiedi_elenco"/> <wsdl:output message="ds:DsService_richiedi_elencoResponse"/> <wsdl:fault name="error" message="ds:DsService_Fault"/> </wsdl:operation> <wsdl:operation name="richiedi_parametri_extra"> <wsdl:input message="ds:DsService_richiedi_extra"/> <wsdl:output message="ds:DsService_richiedi_extraResponse"/> <wsdl:fault name="error" message="ds:DsService_Fault"/> </wsdl:operation> <wsdl:operation name="richiedi_scheda"> <wsdl:input message="ds:DsService_richiedi_scheda"/> <wsdl:output message="ds:DsService_richiedi_schedaResponse"/> <wsdl:fault name="error" message="ds:DsService_Fault"/> </wsdl:operation> <wsdl:operation name="richiedi_guida_completa"> <wsdl:input message="ds:DsService_richiedi_guida_completa"/> <wsdl:output message="ds:DsService_richiedi_guida_completaResponse"/> <wsdl:fault name="error" message="ds:DsService_Fault"/> </wsdl:operation> <wsdl:operation name="inserisci_scheda"> <wsdl:input message="ds:DsService_inserisci_scheda"/> <wsdl:output message="ds:DsService_inserisci_schedaResponse"/> <wsdl:fault name="error" message="ds:DsService_Fault"/> </wsdl:operation> <wsdl:operation name="inserisci_commento"> <wsdl:input message="ds:DsService_inserisci_commento"/> <wsdl:output message="ds:DsService_inserisci_commentoResponse"/> <wsdl:fault name="error" message="ds:DsService_Fault"/> </wsdl:operation> <wsdl:operation name="richiedi_commento"> <wsdl:input message="ds:DsService_richiedi_commento"/> <wsdl:output message="ds:DsService_richiedi_commentoResponse"/> <wsdl:fault name="error" message="ds:DsService_Fault"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="DsServiceBinding" type="ds:DsServicePort"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <!-- lo style ?pc perch? una remote procedure call --> <wsdl:operation name="richiedi_elenco"> <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#richiedi_elenco"/> <wsdl:fault name="error"/> <wsdl:input> <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="richiedi_parametri_extra"> <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#richiedi_elenco"/> <wsdl:fault name="error"/> <wsdl:input> <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="richiedi_scheda"> <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#richiedi_scheda"/> <wsdl:fault name="error"/> <wsdl:input> <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="richiedi_guida_completa"> <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#richiedi_guida_completa"/> <wsdl:fault name="error"/> <wsdl:input> <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="inserisci_scheda"> <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#inserisci_scheda"/> <wsdl:fault name="error"/> <wsdl:input> <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="inserisci_commento"> <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#inserisci_commento"/> <wsdl:fault name="error"/> <wsdl:input> <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="richiedi_commento"> <soap:operation soapAction="http://tw.web.cs.unibo.it/DsService#richiedi_commento"/> <wsdl:fault name="error"/> <wsdl:input> <soap:body use="literal" namespace="http://tw.web.cs.unibo.it/DsService"/> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="DsService"> <wsdl:port name="DsServicePortType" binding="ds:DsServiceBinding"> <soap:address location="http://ltw0716.web.cs.unibo.it/cgi-bin/data_source/DS.php5"/> <!-- ogni gruppo definirà la locazione del proprio wsdl --> </wsdl:port> </wsdl:service> </wsdl:definitions>
Il data source (o DS) è un modulo indipendente (cioè scollegato da qualunque altra applicazione) e passivo (cioè non ha comportamenti proattivi, ma risponde soltanto ad esplicita richiesta) che fornisce contenuti in formato XML
I data source possono essere data storage (cioè posseggono effettivamente i dati che sono in grado di restituire) oppure data intermediary (cioè estraggono i dati da qualche fonte su Internet e la restituiscono nel formato richiesto).
L'elenco è una collezione di schede, in particolare di riferimenti a PuntiDiInteresse, Itinerari e Guide. Si noti che, a differenza di questi elementi che sono interamente memorizzati nel DS, un elenco è una struttura dinamica, costruita on-the-fly dal DS sulla base dei parametri forniti in input. Meccanismi di caching possono essere comunque implementati per migliorare le prestazioni del sistema.
Prima di procedere con la richiesta di un elenco e' possibile attraverso la richiesta richiedi_parametri_extra ottenere i parametri di ricerca supportati da un determinato DS oltre quelli obbligatori, la grammatica dei parametri extra, che devono essere ritornati dal metodo, e' la seguente:
<xs:element name="supported" type="supportedQueryExtension"/> <xs:complexType name="supportedQueryExtension"> <xs:annotation> <xs:documentation> Risposta del DS al metodo supportedQueryExtension che chiede al DS quali sono le estensioni di ricerca sulle schede supportate</xs:documentation> </xs:annotation> <xs:sequence> <xs:element name="extension" type="percorso_t" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:simpleType name="percorso_t"> <xs:restriction base="xs:string"> <xs:pattern value="/scheda(/[a-zA-Z]+)+"/> </xs:restriction> </xs:simpleType>
Nell'elemento percorso va un Xpath sulla scheda, che descrive l'elemento scheda gestito. Un esempio potrebbe essere /scheda/info/modificatoIl.
Una richiesta di tipo elenco è realizzata con una richiesta SOAP di tipo richiedi_elenco; si ricorda che è necessario fornire una stringa contenente i parametri di ricerca. La stringa sarà in formato XML e dovrà rispondere alla seguente grammatica XML-Schema + Schematron:
L'elemento radice dell'elenco. E` l'elemento necessario per il corretto invio di informazioni di tipo "elenco" tramite SOAP. </xs:documentation> </xs:annotation> </xs:element> <xs:complexType name="parametri_ricerca_t"> <xs:annotation> <xs:appinfo> <sch:pattern name="coconstrain_query_param"> <sch:rule context="param"> <sch:assert test="not(./raggio) Or (./raggio And ./GPS)"> L'elemento raggio necessita l'elemento GPS per essere valido! </sch:assert> </sch:rule> </sch:pattern> </xs:appinfo> </xs:annotation> <xs:sequence> <xs:element name="tipo" type="ontologia_t" minOccurs="0"/> <xs:element name="GPS" type="GPS_t" minOccurs="0"/> <xs:element name="raggio" type="raggio_t" minOccurs="0"/> <xs:element name="nome" type="xs:string" minOccurs="0"/> <xs:element name="keyword" type="xs:string" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="extra" type="extra_t" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:schema>Il parametro extra e' definito nel seguente modo:
<xs:complexType name="extra_t"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="percorso" type="percorso_t" use="required" /> <xs:attribute name="criterio" type="criterio_t" use="optional" default="="/> </xs:extension> </xs:simpleContent> </xs:complexType> <xs:simpleType name="criterio_t"> <xs:restriction base="xs:string"> <xs:enumeration value="<"/> <!-- minore --> <xs:enumeration value=">"/> <!-- maggiore --> <xs:enumeration value=">="/> <!-- minore o uguale --> <xs:enumeration value="<="/> <!-- maggiore o uguale --> <xs:enumeration value="="/> <xs:enumeration value="in"/> <!-- match con una sottostringa --> </xs:restriction> </xs:simpleType> <xs:simpleType name="percorso_t"> <xs:restriction base="xs:string"> <xs:pattern value="/scheda(/[a-zA-Z]+)+"/> </xs:restriction> </xs:simpleType>
Il contenuto dell’elenco è appunto parametrizzato: i parametri di costruzione dell’elenco vengono specificati al momento della richiesta da parte del AC attraverso una query XML inviata tramite richiesta SOAP e questi parametri devono essere fra quelli supportati. Si ricorda che TUTTI i parametri descritti qui sopra, tranne extra devono essere supportati.Le keywords che ogni DataSource deve supportare, in riferimento alla grammatica delle schede, sono: nome, coordinateGPS, Raggio, Keywords, Tipo. Si ricorda che , come descritto nella grammatica, non può essere richiesto un elenco per raggio senza aver fornito anche le coordinate GPS. Nel caso di parametri extra (opzionali) e' necessario inserire il criterio: questo significa inserire la modalita' di ricerca su quello specifico parametro. Ad esempio se si tratta di un prezzo e' possibile dire se si vuole che sia minore o maggiore di 10 euro. Se si tratta di una stringa e' possibile, ad esempio, dire se sia uguale o che sia contenuta nella stringa che deve fare match.
Ad esempio una richiesta ('richiedi_elenco',$parametri) con parametri:
<ds:param xsi:schemaLocation="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS parametri.xsd" xmlns:ds="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <tipo>PdI</tipo> <GPS> <latitudine>-30.000000</latitudine> <longitudine>80.000000</longitudine> </GPS> </ds:param>
dovrebbe ritornare la lista contenente tutti i punti di interesse di coordinate -30 e 80.
In tutte le ricerche è ammesso l'utilizzo di wildcard (ossia simbolo *, per indicare qualunque valore non esplicito). Il simbolo di * indica una qualunque sequenza (anche vuota) di caratteri, secondo la sintassi di espressioni regolari. Quindi se cercherò il PdI? con il nome uguale a par* mi verrà restituito ad esempio Parigi. Dovranno essere supportati obbligatoriamente solo l'utilizzo di wildcard alla fine oppure, all'inizio e alla fine di una stringa, ad esempio dovranno essere supportati situazioni del tipo par* oppure par. Questo perche' Xpath 1.0 non fornisce corretto supporto ad altre operazioni di questo tipo.
Esiste inoltre una classificazione predefinita dei vari tipi di PuntiDiInteresse, organizzata in categorie e sottocategorie, ed un insieme di informazioni correlate che definiscono i meccanismi di organizzazione e ricerca sulla knowledge-base. La sezione 7 descrive questa ontologia. Comunque un esempio può essere che se io cerco "Locale" mi verranno forniti probabilmente sia "Ristoranti" sia "Pub".
Il DS restituisce alla query un documento composto da un elemento radice elenco
che contiene tanti elementi item
tutti uguali. L’elemento elenco
riporta nell’elemento figlio param
la query che è stata effettuata per
generare l’elenco stesso.
Ogni elemento item contiene una sequenza di elementi tratti dal vocabolario
LTGB e utili per la visualizzazione dell’elenco. La scelta degli effettivi elementi
utilizzati nella voce è definita dalla grammatica del DS. L’attributo idref
contiene un identificativo utile per richiedere al DS la scheda completa associata
alla voce in elenco.
Ad esempio, il seguente è un elenco di PuntiDiInteresse:
<ds:elenco xsi:schemaLocation="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS elenco.xsd" xmlns:ds="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <param> <tipo>PdI</tipo> </param> <item idref="a001"> <nome>Le strade di Parigi</nome> <tipo>PdI</tipo> <modificatoIl>2001-12-17T09:30:47.0Z</modificatoIl> <descrizioneBreve>Le luci e lo splendore di una città eterna</descrizioneBreve> </item> <item idref="a002"> <nome>La Vecchia Fattoria</nome> <tipo>PdI</tipo> <modificatoIl>2001-12-17T09:30:47.0Z</modificatoIl> <descrizioneBreve>Gli animali, le stalle e tutto quello che dovete sapere sulle fattorie più importanti</descrizioneBreve> </item> <item idref="a010"> <nome>Il Polo Nord</nome> <tipo>PdI</tipo> <modificatoIl>2001-12-17T09:30:47.0Z</modificatoIl> <descrizioneBreve>Beh...che dire se volete un posto unico al mondo potete essere sicuri che questo sia il posto giusto.</descrizioneBreve> </item> </ds:elenco>
Gli elenchi sono costruiti dinamicamente, secondo i parametri supportati da ciascun DS, e secondo i criteri di classificazione delle schede dichiarati nell'ontologia descritta in sezione 7
La scheda contiene tutte le informazioni associate ad un documento. Queste sono organizzate in sezioni che raggruppano informazioni tra loro omogenee per uso.
Ogni scheda o elenco restituito dal DS è un documento che deve essere formattato dal DF.
La grammatica XML-Schema + Schematron è la seguente:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" xmlns:df="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkingGroupACDF" targetNamespace="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS"> <xs:annotation> <xs:documentation>ahah </xs:documentation> </xs:annotation> <xs:include schemaLocation="logistica.xsd"/> <xs:include schemaLocation="testo.xsd"/> <!-- =============================================================================== RADICE DEL DOCUMENTO =============================================================================== --> <xs:element name="scheda" type="scheda_t"/> <!-- =============================================================================== DEFINIZIONE DEI (MACRO) TIPI DEGLI ELEMENTI DEL DATA SOURCE =============================================================================== --> <!-- Elemento Root: Scheda --> <xs:complexType name="scheda_t"> <xs:sequence> <xs:element name="info" type="info_t"/> <xs:choice> <xs:element name="PdI" type="PdI_t"/> <xs:element name="itinerario" type="itinerario_t"/> <xs:element name="guida" type="guida_t"/> </xs:choice> </xs:sequence> <xs:attribute name="id" type="xs:ID" use="required"/> </xs:complexType> <!-- Informazioni --> <xs:complexType name="info_t"> <xs:annotation> <xs:documentation> Definisce le meta-informazioni associate ad ua scheda. In particolari si hanno tutte le informazioni sulle proprieta` del file XML associato (e.g. autore, creazione, ...). </xs:documentation> </xs:annotation> <xs:all> <xs:element name="autore" type="xs:normalizedString"/> <xs:element name="team" type="xs:normalizedString"/> <xs:element name="origine" type="xs:anyURI" minOccurs="0"/> <xs:element name="creatoIl" type="xs:dateTime"/> <xs:element name="modificatoIl" type="xs:dateTime"/> <xs:element name="lang" type="lang_t" default="it_IT"/> <xs:element name="licence" type="xs:string" minOccurs="0"/> <xs:element name="tipo" type="ontologia_t"/> <xs:element name="keywords" type="keywords_t" minOccurs="0"/> </xs:all> </xs:complexType> <!-- Classe base astratta per PdI, Itinerari e Guide --> <xs:complexType name="schedaBase_t" abstract="true"> <xs:annotation> <xs:documentation> Elementi base comuni ad ogni scheda. Questi elementi sono utilizzati sia da un Punto di Interesse, che da un itinerario, che da una guida; sono raggruppati quindi in un'unica classe base, in modo che tutte le schede rispettino lo stesso ordine di definizione degli elementi. </xs:documentation> </xs:annotation> <xs:sequence> <xs:element name="nome" type="xs:normalizedString"/> <xs:element name="mappa" type="mappa_t" minOccurs="0"/> <xs:element name="immagini" type="immagini_t" minOccurs="0"/> <xs:element name="descrizione" type="descrizione_t"/> </xs:sequence> </xs:complexType> <!-- Punto d'Interesse --> <xs:complexType name="PdI_t"> <xs:annotation> <xs:documentation> Definisce un punto d'interesse. Estende gli elementi definiti in ds:schedaBase_t, con gli elementi specifici di un punto d'interesse (e.g. GPS, raggio, ...). </xs:documentation> </xs:annotation> <xs:complexContent> <xs:extension base="schedaBase_t"> <xs:sequence> <xs:element name="GPS" type="GPS_t"/> <xs:element name="raggio" type="raggio_t"/> <xs:element name="logistica" type="logistica_t" minOccurs="0"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <!-- Itinerario --> <xs:complexType name="itinerario_t"> <xs:annotation> <xs:documentation> Definisce un Itinerario. Estende gli elementi definiti in ds:schedaBase_t, con gli elementi specifici di un Itinerario (e.g. seqItem). </xs:documentation> <xs:appinfo> <sch:pattern name="item pdi"> <sch:rule context="item"> <sch:assert test="./tipo[name()!='Itinerario' and name() != 'Guida']"> Un itinerario puo` contenere solo item di genere PdI. </sch:assert> </sch:rule> </sch:pattern> </xs:appinfo> </xs:annotation> <xs:complexContent> <xs:extension base="schedaBase_t"> <xs:sequence maxOccurs="unbounded"> <xs:element name="sequenza" type="sequenza_t"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <!-- Guida --> <xs:complexType name="guida_t"> <xs:annotation> <xs:appinfo> <sch:pattern name="item itinerario"> <sch:rule context="item"> <sch:assert test="./tipo[name()='Itinerario']"> Una Guida puo` contenere solo item di genere Itinerario. </sch:assert> </sch:rule> </sch:pattern> </xs:appinfo> </xs:annotation> <xs:complexContent> <xs:extension base="schedaBase_t"> <xs:sequence> <xs:element name="prezzo" type="xs:nonNegativeInteger" minOccurs="0"/> <xs:element name="copertinaURL" type="xs:anyURI" minOccurs="0"/> <xs:element name="sequenza" type="sequenza_t"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <!-- Sequenza --> <xs:complexType name="sequenza_t"> <xs:sequence> <xs:element name="testo" type="testo_t" minOccurs="0"/> <xs:sequence maxOccurs="unbounded"> <xs:element name="item" type="item_t"/> <xs:element name="testo" type="testo_t" minOccurs="0"/> </xs:sequence> </xs:sequence> </xs:complexType> <!-- Item --> <xs:complexType name="item_t"> <xs:sequence> <xs:element name="nome" type="xs:string"/> <xs:element name="tipo" type="ontologia_t"/> <xs:element name="modificatoIl" type="xs:dateTime"/> <xs:element name="descrizioneBreve" type="xs:string"/> </xs:sequence> <xs:attribute name="idref" type="xs:string" use="required"/> </xs:complexType> </xs:schema>
Nella grammatica appena presentata manca la parte riguardante i tipi, che verranno descritti più avanti.La tabella seguente contiene una descrizione degli elementi contenuti.
Nome | Descrizione | Attributi |
---|---|---|
scheda |
L’elemento radice del documento scheda. Può essere ulteriormente specializzato in PuntoDiInteresse, Itinerario o Guida | id : obbligatorio |
PdI |
Elemento figlio di scheda relativa ad un PuntoDiInteresse | |
itinerario |
Elemento figlio di una scheda relativa ad un Itinerario | |
guida |
Elemento figlio di una scheda relativa ad una Guida | |
info |
Metadati informativi sulla scheda in quanto prodotto di un determinato DS | |
logistica |
Dati strutturati di descrizione della scheda e di un particolare luogo. Dipendono dal tipo di dato richiesto e fornito dal DS. Questi dati dipendono fortemente dal PuntoDiInteresse e rispondono all'ontologia in sezione 7. Nel paragrafo 3.4 verranno illustrati gli elementi contenuti in logistica. | |
immagini |
Una sequenza di immagini (di contenuto e non presentazionali) | |
sequenza |
Alternanza di elementi testo (che verrano descritti nel paragrafo 3.5) e di item, che contengono un set ridotto di informazioni relative ad un PuntoDiInteresse o di un Itinerario. Ogni elemento item contiene una sequenza di elementi tratti dal vocabolario LTGB e utili per la visualizzazione della entry. Si ricorda che nel caso di Itinerari le sequenze saranno di PdI? e nel caso di guide saranno di itinerari. | |
item |
è l'elemento figlio di elenco e della sequenza. E' una struttura che descrive informazioni riassuntive di un Pdi, di un itinerario o di una guida | idref : obbligatorio |
keywords |
Una sequenza dikeyword, che contengono un token di informazione relativo ad una scheda. | |
descrizione |
La composizione di due descrizioni una breve e una estesa, di un PuntoDiInteresse, di un Itinerario o di una Guida | |
descrizioneEstesa |
la descrizione completa di una scheda fornita dall'utente.Può contenere diversi elementi per caratterizzare il testo. Questi elementi verranno descritti nel paragrafo 3.5 | |
GPS |
tupla di coordinate: latitudine e longitudine |
<!-- Coordinate GPS --> <xs:complexType name="GPS_t"> <xs:sequence> <xs:element name="latitudine"> <xs:simpleType> <xs:restriction base="xs:decimal"> <xs:totalDigits value="8"/> <xs:fractionDigits value="6"/> <xs:minInclusive value="-90.000000"/> <xs:maxInclusive value="90.000000"/> </xs:restriction> </xs:simpleType> </xs:element> <xs:element name="longitudine"> <xs:simpleType> <xs:restriction base="xs:decimal"> <xs:totalDigits value="9"/> <xs:fractionDigits value="6"/> <xs:minInclusive value="-180.000000"/> <xs:maxInclusive value="180.000000"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:complexType> <!-- Raggio --> <xs:simpleType name="raggio_t"> <xs:restriction base="xs:decimal"> <xs:totalDigits value="8"/> <xs:fractionDigits value="6"/> <xs:minInclusive value="0.000000"/> <xs:maxInclusive value="90.000000"/> </xs:restriction> </xs:simpleType> <!-- Lista di Immagini --> <xs:complexType name="immagini_t"> <xs:sequence maxOccurs="unbounded"> <xs:element name="img" type="img_t"/> </xs:sequence> </xs:complexType> <!-- Descrizione breve ed estesa --> <xs:complexType name="descrizione_t"> <xs:sequence> <xs:element name="breve" type="xs:normalizedString"/> <xs:element name="estesa" type="testo_t"/> </xs:sequence> </xs:complexType> <!-- Mappa --> <xs:complexType name="mappa_t"> <xs:attribute name="url" type="xs:anyURI" use="required"/> </xs:complexType> <!-- Lista di Keywords --> <xs:complexType name="keywords_t"> <xs:sequence maxOccurs="unbounded"> <xs:element name="keyword" type="keyword_t"/> </xs:sequence> </xs:complexType> <!-- Keyword singola --> <xs:complexType name="keyword_t"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute name="seeAlso" type="xs:NMTOKEN" use="optional"/> </xs:extension> </xs:simpleContent> </xs:complexType> <!-- Lingua della scheda --> <xs:simpleType name="lang_t"> <xs:restriction base="xs:NMTOKEN"> <xs:enumeration value="it_IT"/> <xs:enumeration value="en_EN"/> <xs:enumeration value="en_US"/> <xs:enumeration value="de_DE"/> <xs:enumeration value="fr_FR"/> <xs:enumeration value="es_ES"/> <!-- And many others!!! --> </xs:restriction> </xs:simpleType>Di seguito una tabella che descrive i tipi appena presentati:
Nome | Descrizione | Attributi |
---|---|---|
autore |
L’autore della scheda | |
team |
Il team a cui appartiene l’autore | |
origine |
l’URI del documento originale da cui è tratto il contenuto della scheda se originata da un DS intermediary. | |
creatoIl |
La data di creazione della scheda | |
modificatoIl |
la data di ultima modifica della scheda | |
latitudine |
latitudine (nord/sud) di un PuntoDiInteresse.
Per semplicità, la coordinata è espressa nel formato DD (gradi decimali positivi e negativi (-90,+90), si veda ad es. Geographical_coordinates su Wikipedia) anzichè nella più classica forma con gradi, primi e secondi. Ad esempio, le coordinate GPS del tempio di Angkor Wat in Cambogia sono: 13.4125N,103.866667E |
|
longitudine |
longitudine (est/ovest) di un PuntoDiInteresse.
Per semplicità, la coordinata è espressa nel formato DD(-180,+180) anzichè nella più classica forma con gradi, primi e secondi. |
|
raggio |
Raggio di un PuntoDiInteresse.
Se le coordinate Ad esempio, un grado corrisponde a circa 111 Km, un decimillesimo di grado a circa 11 metri. |
|
nome |
Il nome di una scheda (PuntoDiInteresse, Itinerario o Guida) | |
tipo |
Il tipo di un PuntoDiInteresse, secondo la classificazione proposta nell'ontologia descritta in sezione 7. Utile anche per distinguere la tipologia nell'ambito del DS (scheda, pdi o guida). | |
keyword |
Una parole chiave (token) per descrivere una scheda. | |
mappa |
Una mappa dell'area vicina ad un punto di interesse. La mappa è calcolata da un'applicazione esterna, per cui è importante conoscere solo l'URL completo per inoltrare tale richiesta. N.B.: per evitare problemi di compatibilità si prega di inserire l'URL all'immagine di una mappa e NON un puntatore a GoogleMaps? o comunque pagine che contengono javascript. |
|
prezzo |
Il prezzo di una Guida | |
copertinaURL |
l'URL di una immagine da usare nella copertina della Guida | |
descrizioneBreve |
la descrizione sintetica di una scheda fornita dall'utente. |
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" xmlns:ds="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" xmlns:df="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkingGroupACDF" targetNamespace="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS"> <xs:annotation> <xs:documentation> Definisce lo schema per i commenti. L'elemento radice e` commenti, e deve essere qualificato dal nome del namespace. (e.g. <ltgb:commenti xmlns:ltgb="http://vitali.web.cs.unibo.it/view/TechWeb07">...</ltgb:commenti>). L'attributo elementFormDefault e` settato a unqualified, quindi non si deve specificare il namespace per gli elementi e gli attributi (a qualunque livello di annidamento) di commenti. </xs:documentation> </xs:annotation> <xs:include schemaLocation="testo.xsd"/> <xs:element name="commenti" type="commenti_t"/> <!-- Commenti --> <xs:complexType name="commenti_t"> <xs:sequence maxOccurs="unbounded"> <xs:element name="commento" type="commento_t"/> </xs:sequence> <xs:attribute name="idref" type="xs:string"/> </xs:complexType> <!-- Un Commento --> <xs:element name="commento" type="commento_t"/> <xs:complexType name="commento_t" mixed="true"> <xs:complexContent mixed="true"> <xs:extension base="testo_t"> <xs:attribute name="number" type="xs:nonNegativeInteger"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:schema>Nel caso in cui si inserisce un commento DEVE essere un elemento commento. Invece nella richiesta dovra' essere restituita una LISTA di commenti.
La logistica contiene tutti elementi opzionali che descrivono ulteriormente il PdI?, in base alle caratteristiche che deve avere il PdI? relativamente alla specializzazione all'interno dell'ontologia.Ad esempio un Museo avrà "orario" ma non può avere "tipoCucina". Il tipo ontologia_t descrive le stringhe che possono essere contenute all'interno di "tipo" che specifica la classe a cui appartiene il Pdi. Di seguito viene fornita la grammatica:
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:sch="http://purl.oclc.org/dsdl/schematron" xmlns="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS" targetNamespace="http://vitali.web.cs.unibo.it/view/TechWeb07/WorkinGroupACDS"> <xs:annotation> <xs:documentation> Definisce lo schema per l'ontologia. </xs:documentation> </xs:annotation> <xs:simpleType name="ontologia_t"> <xs:restriction base="xs:NMTOKEN"> <xs:enumeration value="PdI"/> <xs:enumeration value="Guida"/> <xs:enumeration value="Itinerario"/> <xs:enumeration value="Negozio"/> <xs:enumeration value="Profumeria"/> <xs:enumeration value="Libreria"/> <xs:enumeration value="Abbigliamento"/> <xs:enumeration value="Alimentari"/> <xs:enumeration value="Arredamento"/> <xs:enumeration value="Localita"/> <xs:enumeration value="Quartiere"/> <xs:enumeration value="Comune"/> <xs:enumeration value="Provincia"/> <xs:enumeration value="Contrada"/> <xs:enumeration value="ParchiNaturali"/> <xs:enumeration value="Frazione"/> <xs:enumeration value="Regione"/> <xs:enumeration value="Nazione"/> <xs:enumeration value="EntePubblico"/> <xs:enumeration value="Turismo"/> <xs:enumeration value="CallCenter"/> <xs:enumeration value="InformationPoint"/> <xs:enumeration value="InternetPoint"/> <xs:enumeration value="Emergenze"/> <xs:enumeration value="Ospedale"/> <xs:enumeration value="Polizia"/> <xs:enumeration value="Farmacia"/> <xs:enumeration value="Poste"/> <xs:enumeration value="Municipio"/> <xs:enumeration value="Ambasciata"/> <xs:enumeration value="Ostello"/> <xs:enumeration value="Pensione"/> <xs:enumeration value="BedBreakfast"/> <xs:enumeration value="Hotel"/> <xs:enumeration value="LuogoCulto"/> <xs:enumeration value="Museo"/> <xs:enumeration value="Monumento"/> <xs:enumeration value="Stazione"/> <xs:enumeration value="Aeroporto"/> <xs:enumeration value="Evento"/> <xs:enumeration value="Manifestazione"/> <xs:enumeration value="Concerto"/> <xs:enumeration value="Mostra"/> <xs:enumeration value="Teatro"/> <xs:enumeration value="Locale"/> <xs:enumeration value="Ristorante"/> <xs:enumeration value="Pub"/> <xs:enumeration value="Disco"/> <xs:enumeration value="Bar"/> <xs:enumeration value="Agriturismo"/> <xs:enumeration value="Montagna"/> <xs:enumeration value="ScuolaUniversita"/> <xs:enumeration value="Alloggio"/> <xs:enumeration value="Campeggio"/> <xs:enumeration value="Castello"/> <xs:enumeration value="CulturaSpettacolo"/> <xs:enumeration value="Mercato"/> <xs:enumeration value="Utente"/> <!-- And many others... --> </xs:restriction> </xs:simpleType> <xs:complexType name="logistica_t"> <xs:sequence> <xs:element name="orario" type="orario_t" minOccurs="0" maxOccurs="14"/> <!-- Incrementabile a richiesta (sensata) --> <xs:element name="accomodationPrice" type="service_t" minOccurs="0"/> <xs:element name="ticketPrice" type="service_t" minOccurs="0"/> <xs:element name="data" type="xs:date" minOccurs="0"/> <xs:element name="tipologiaTrasporti" type="xs:string" minOccurs="0"/> <xs:element name="tipoCucina" type="xs:string" minOccurs="0"/> <xs:element name="stelle" type="xs:integer" minOccurs="0"/> <xs:element name="ubicazione" type="xs:string" minOccurs="0"/> <xs:element name="nomeLocalita" type="xs:string" minOccurs="0"/> <xs:element name="calendario" type="calendario_t" minOccurs="0"/> <xs:element name="artista" type="xs:string" minOccurs="0"/> <xs:element name="contatti" type="contatti_t" minOccurs="0"/> <xs:element name="tipoMercato" type="xs:string" minOccurs="0"/> <xs:element name="formalismo" type="xs:string" minOccurs="0"/> <xs:element name="posizione" type="xs:string" minOccurs="0"/> <!-- And few others... possibly! --> </xs:sequence> </xs:complexType> <xs:complexType name="orario_t"> <xs:choice> <xs:element name="mese" type="mese_t" maxOccurs="12"/> </xs:choice> </xs:complexType> <xs:complexType name="mese_t"> <xs:choice> <xs:element name="giorno" type="giorno_t" maxOccurs="7"/> </xs:choice> <xs:attribute name="nome" type="nome_mese_t" use="required"/> </xs:complexType> <xs:complexType name="service_t"> <xs:sequence maxOccurs="unbounded"> <xs:element name="servizi"> <xs:complexType> <xs:sequence> <xs:element name="servizio" type="xs:string"/> <xs:element name="prezzo" type="xs:float"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="giorno_t"> <xs:sequence maxOccurs="unbounded"> <xs:element name="apertura" type="xs:time"/> <xs:element name="chiusura" type="xs:time"/> </xs:sequence> <xs:attribute name="nome" type="nome_giorno_t" use="required"/> </xs:complexType> <xs:simpleType name="nome_giorno_t"> <xs:restriction base="xs:string"> <xs:enumeration value="Lunedi"/> <xs:enumeration value="Martedi"/> <xs:enumeration value="Mercoledi"/> <xs:enumeration value="Giovedi"/> <xs:enumeration value="Venerdi"/> <xs:enumeration value="Sabato"/> <xs:enumeration value="Domenica"/> <xs:enumeration value="TuttiGiorni"/> <xs:enumeration value="TuttiNoDomenica"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="nome_mese_t"> <xs:restriction base="xs:string"> <xs:enumeration value="Gennaio"/> <xs:enumeration value="Febbraio"/> <xs:enumeration value="Marzo"/> <xs:enumeration value="Aprile"/> <xs:enumeration value="Maggio"/> <xs:enumeration value="Giugno"/> <xs:enumeration value="Luglio"/> <xs:enumeration value="Agosto"/> <xs:enumeration value="Settembre"/> <xs:enumeration value="Ottobre"/> <xs:enumeration value="Novembre"/> <xs:enumeration value="Dicembre"/> <xs:enumeration value="TuttiMesi"/> </xs:restriction> </xs:simpleType> <xs:complexType name="calendario_t"> <xs:sequence> <xs:element name="stagione" type="stagione_t"/> </xs:sequence> </xs:complexType> <xs:complexType name="stagione_t"> <xs:sequence> <xs:element name="spettacolo" type="spettacolo_t"/> </xs:sequence> <xs:attribute name="anno" type="xs:gYear"/> </xs:complexType> <xs:complexType name="spettacolo_t"> <xs:sequence> <xs:element name="titolo" type="xs:string"/> <xs:element name="produzione" type="xs:string"/> <xs:element name="data" type="xs:dateTime"/> </xs:sequence> <xs:attribute name="tipo" type="xs:string"/> </xs:complexType> <xs:complexType name="contatti_t"> <xs:sequence> <xs:element name="email" type="xs:string" minOccurs="0"/> <xs:element name="telefono" type="xs:string" minOccurs="0"/> <xs:element name="altri" type="xs:string" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:schema>Quella che segue è la tabella relativa agli elementi contenuti in "logistica":
Nome | Descrizione | Attributi |
---|---|---|
orario |
Lista degli orari organizzati per mesi e giorni. Questi ultimi infine contengono l'orario di apertura e chiusura dell'esercizio. Mese contiene un attributo che descrive il mese in questione. Esiste un valore particolare per non descrivere mese per mese, questo valore è "TuttiMesi". Giorno contiene un attributo che descrive il giorno della settimana in questione. Anche in queto caso ci sono stringhe particolari: "TuttiGiorni" e "TuttiNoDomenica", quest'ultimo descrive tutti i giorni tranne la domenica. | |
accomodationPrice |
lista dei servizi offerti da una struttura.Prezzo è già definito come elemento atomico. | |
ticketPrice |
Lista dei servizi generici per cui viene effettuato un pagamento.Prezzo è già definito come elemento atomico. | |
data |
Data e ora di uno specifico evento o di uno spettacolo. | |
tipologiaTrasporti |
Specifica il tipo di trasporti, necessario per Punti di Interesse che siano stazioni, aeroporti, etc.. | |
tipoCucina |
Specifica il tipo di cucina di un punto di ristoro. | |
servizio |
Specifica il tipo di servizio. | stelle |
Indica la qualità di una struttura alberghiera |
ubicazione |
Indica l'indirizzo più o meno preciso di un Punto di Interesse.N.B. è indicativo, l'informazione fondamentale per la localizzazione sono le coordinate. | |
nomeLocalità |
Indica il nome della località (ad es. Francia per una nazione o Parigi per una città) N.B. è indicativo, l'informazione fondamentale per la localizzazione sono le coordinate. | |
calendarioSpettacoli |
Indica il calendario degli spettacoli di un teatro o simile. | |
stagione |
Indica la stagione relativa ad un calendario | anno |
spettacolo |
è la radice della descrizione di uno spettacolo. L'attributo tipo indica la tipologia di spettacolo (es. commedia) | tipo (tragedia,commedia,etc.) |
titolo |
titolo spettacolo | |
produzione |
produzione spettacolo | |
artista |
l'individuo autore di un'opera | |
contatti |
contiene tre figli stringa email, telefono e altro che definiscono i contatti per un locale, ente, etc. | |
tipoMercato |
indica la tipologia di mercato (antiquariato, usato, etc.) | |
formalismo |
descrive il livello di formalismo di un dato locale (elegante, domestico, alla moda, [non so neanche io bene che termini usare]) | |
posizione |
descrive la posizione della struttura (mare, montagna, città, etc.) |
<xs:complexType name="testo_t" mixed="true"> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:group ref="blocco_g"/> </xs:choice> <xs:attributeGroup ref="DSaccessibilita_g"/> </xs:complexType> <!-- Elementi Blocco --> <xs:complexType name="blocco_t" mixed="true"> <xs:annotation> <xs:appinfo> <sch:pattern name="coconstrain_elementi_blocco"> <sch:rule context="//*[name()='h1' or name()='h2' or name()='h3' or name()='p']"> <sch:assert test="not((.//h1)and(.//h2)and(.//h3)and(.//p)) "> Un elemento di tipo 'blocco' (escluso li) non puo` contenere altri elementi di tipo blocco. </sch:assert> </sch:rule> </sch:pattern> </xs:appinfo> </xs:annotation> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:group ref="inline_g"/> <xs:group ref="atomici_g"/> </xs:choice> <xs:attribute name="semantica" type="xs:string"/> <xs:attributeGroup ref="DSaccessibilita_g"/> </xs:complexType> <xs:group name="blocco_g"> <xs:choice> <xs:element name="h1" type="blocco_t"/> <xs:element name="h2" type="blocco_t"/> <xs:element name="h3" type="blocco_t"/> <xs:element name="p" type="blocco_t"/> <xs:element name="ol" type="lista_t"/> <xs:element name="ul" type="lista_t"/> </xs:choice> </xs:group> <!-- Elementi Inline --> <xs:complexType name="inline_t" mixed="true"> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:group ref="inline_g"/> <xs:group ref="atomici_g"/> </xs:choice> <xs:attributeGroup ref="DSaccessibilita_g"/> </xs:complexType> <xs:group name="inline_g"> <xs:choice> <xs:element name="em" type="inline_t"/> <xs:element name="strong" type="inline_t"/> <xs:element name="a" type="a_t"/> <xs:element name="q" type="inline_t"/> <xs:element name="abbr" type="inline_t"/> <xs:element name="acronym" type="inline_t"/> </xs:choice> </xs:group> <!-- Elementi Atomici --> <xs:group name="atomici_g"> <xs:choice> <xs:element name="br" type="br_t"/> <xs:element name="img" type="img_t"/> </xs:choice> </xs:group> <!-- Ancore --> <xs:complexType name="a_t"> <xs:annotation> <xs:appinfo> <sch:pattern name="coconstrain_A"> <sch:rule context="a"> <sch:assert test="not(.//a)">'a' non puo` avere 'a' come discendente</sch:assert> <sch:assert test="( @href and not(@name) ) or (not(@href) and @name)"> Un elemento 'a' puo` contenere o l'attributo href o l'attributo name. </sch:assert> </sch:rule> </sch:pattern> </xs:appinfo> </xs:annotation> <xs:complexContent> <xs:extension base="inline_t"> <xs:attribute name="img" type="xs:anyURI" use="optional"/> <xs:attribute name="name" type="xs:anyURI" use="optional"/> </xs:extension> </xs:complexContent> </xs:complexType> <!-- Immagine --> <xs:complexType name="img_t"> <xs:attribute name="href" type="xs:anyURI" use="required"/> <xs:attribute name="alt" type="xs:normalizedString" use="required"/> <xs:attribute name="longdesc" type="xs:anyURI"/> <xs:attributeGroup ref="DSaccessibilita_g"/> <!-- longdesc: aggiunto per accessibilita' (e' proprio dell'elemento IMG) --> </xs:complexType> <!-- Line break --> <xs:complexType name="br_t"/> <!-- Elenchi (tolto "start" perchè deprecato nella versione xhtml strict)--> <xs:complexType name="lista_t"> <xs:sequence maxOccurs="unbounded"> <xs:element name="li" type="testo_t"/> </xs:sequence> <xs:attributeGroup ref="DSaccessibilita_g"/> </xs:complexType> <!-- ATTRIBUTI PER ACCESSIBILITA' --> <xs:attributeGroup name="DSaccessibilita_g"> <xs:annotation> <xs:documentation> Attributi standard xhtml (un sottinsieme sensato per il DS ) per permettere l'accessibilita': - title: titolo/descrizione aggiuntiva dell'elemento - dir : direzione di lettura del testo LeftToRight o RightToLeft - lang : language code che identifica la lingua in cui e' espresso il contenuto dell'elemento </xs:documentation> </xs:annotation> <xs:attribute name="title" type="xs:string" use="optional"/> <xs:attribute name="dir" use="optional"> <xs:simpleType> <xs:restriction base="xs:NMTOKEN"> <xs:enumeration value="ltr"/> <xs:enumeration value="rtl"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="lang" type="xs:language" use="optional"/> </xs:attributeGroup>
Questi sono alcuni degli elementi presenti:
Nome | Descrizione | Attributi |
---|---|---|
h1 |
Titolo di primo livello | semantica: opzionale |
h2 |
Titolo di secondo livello | semantica: opzionale |
h3 |
Titolo di terzo livello | semantica: opzionale |
p |
Paragrafo generico | semantica: opzionale |
ol |
lista ordinata | semantica: opzionale |
ul |
lista puntata | semantica: opzionale |
em
strong
a
href e name : opzionali, l'uno esclude l'altro
q
abbr
acronym
Le richieste inoltrate al DS possono generare diversi errori. Per gestirli il protocollo ASD prevede un messaggio di errore che riporta un codice ed una descrizione human-readable per l’errore.
Il messaggio deve essere spedito come SoapFault. in php basta ad esempio creare un soapfault e restituirlo. Al client basta catturarlo come risultato della richiesta. E' necessario utilizzare i codici della tabella sottostante.Viene riportata di seguito una tabella con gli errori e le relative descrizioni:
Codice errore | Descrizione Errore |
---|---|
00 | DS non disponibile |
10 | Parametri query errati |
20 | Scheda inesistente (id non valido) |
30 | Errore nell'inserimento della scheda |
40 | Commento inesistente (ID non valido) |
50 | Impossibile inserire commento | 60 | Errore di validazione | 70 | Impossibile restituire la guida completa |
I PuntiDiInteressi gestiti dall'applicazione LTGB sono classificati, organizzati in categorie e sottocategorie e descritte da informazioni specializzate per ogni tipo. Inoltre i PuntiDiInteresse sono identificati da keyword che ne descrivono la natura e che facilitano la navigazione per quanto riguarda il meccanismo di query. In allegato alla pagina OwlOntologia? è possibile scaricare un file .zip con lo schema relativo all'ontologia ed un insieme di pagine HTML per navigarla.
OwlOntolgia L'ontologia serve come punto di riferimento soprattutto per raffinare o comuqnue migliorare le ricerche.I data-source diventano attivi nel sistema LTGB al momento della registrazione. La registrazione non avviene in maniera automatica ma modificando manualmente la pagina del wiki. I team sono tenuti ad aggiungere una riga nella tabella contenuta nelle pagine di registrazione ed indicare:
I vari team, dopo aver comprato i data-source ed i formatter, inseriranno manualmente nel codice della loro applicazione gli URL dei cataloghi di queste componenti (e non dei singoli script per richiedere elenchi, schede e formattazione), leggendoli dalle pagine del wiki. L'AC estrae dal catalogo tutte le informazioni necessarie per comunicare con i DS ed i DF scelti.
Esistono due pagine separate per registrare i data-source e i Formatter, rispettivamente RegistrazioneDataSource e RegistrazioneFormatter. Ad esempio la pagina RegistrazioneFormatter presenta questa tabella:
NOME | CATALOGO XML | CATALOGO HTML |
---|---|---|
-- nome formatter -- | -- URL catalogo XML -- | -- URL catalogo HTML -- |
Se il gruppo TW vuole registrare il Formatter il cui catalogo è all’URL
http://tw.web.cs.unibo.it/format.xml
ed ha creato una pagina HTML (via trasformazione XSLT del catalogo XML) all’URL
http://tw.web.cs.unibo.it/format.html
deve editare la pagina wiki per produrre la seguente tabella:
NOME | CATALOGO XML | CATALOGO HTML |
---|---|---|
-- nome formatter -- | -- URL catalogo XML -- | -- URL catalogo HTML -- |
TW | http://tw.web.cs.unibo.it/format.xml | http://tw.web.cs.unibo.it/format.html |