TECNOLOGIE BASATE SU XML PER LA PUBBLICAZIONE DINAMICA DI ARCHIVI BIBLIOGRAFICI



Documenti analoghi
MODA-ML: Esempi di XSL (Extensible Stylesheet Language) Vocabolario di supporto alla creazione di un set di Schemi di documenti XML

XSL: extensible Stylesheet Language

XML e PHP. Gestire XML con PHP. Appendice

extensible Markup Language

XML INVITO ALLO STUDIO EUROPEAN NETWORK OF INNOVATIVE SCHOOLS

Corso di PHP. Prerequisiti. 1 - Introduzione

Corso di PHP. Prerequisiti. 1 - Introduzione

Database. Si ringrazia Marco Bertini per le slides

Al giorno d oggi, i sistemi per la gestione di database

XML: extensible Markup Language

Introduzione al linguaggio XSL (exensible Styles Language) XSLT(eXensible Styles Language Trasformations)

5.3 TABELLE RECORD Inserire, eliminare record in una tabella Aggiungere record Eliminare record

. A primi passi con microsoft a.ccepss SommarIo: i S 1. aprire e chiudere microsoft access Start (o avvio) l i b tutti i pro- grammi

MANUALE MOODLE STUDENTI. Accesso al Materiale Didattico

EXPLOit Content Management Data Base per documenti SGML/XML

Informatica A per Ingegneria Gestionale ( ) Il linguaggio HTML. Elisa Quintarelli-Laura Mandelli. HyperText Markup Language

Obiettivi d esame PHP Developer Fundamentals on MySQL Environment

Corso html 5. Di Roberto Abutzu. *********** Quarta parte: Body ed elementi strutturali. ********** Cos'è il Body e gli elementi strutturali?

Mon Ami 3000 Varianti articolo Gestione di varianti articoli

Capitolo 4 Pianificazione e Sviluppo di Web Part

Esercizi di JavaScript

Guida alla registrazione on-line di un NovaSun Log

Progettazione di un Database

Introduzione alla programmazione in C

5.6.1 REPORT, ESPORTAZIONE DI DATI

Università degli Studi "Roma Tre" Dipartimento di Informatica ed automazione. Facoltà di Ingegneria

GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL GUIDA RAPIDA PER LA COMPILAZIONE DELLA SCHEDA CCNL

Capitolo 3. L applicazione Java Diagrammi ER. 3.1 La finestra iniziale, il menu e la barra pulsanti

Università Politecnica delle Marche. Progetto Didattico

Verbalizzazione e Firma Digitale

Le Basi di Dati. Le Basi di Dati

DATABASE IN RETE E PROGRAMMAZIONE LATO SERVER

SITI-Reports. Progetto SITI. Manuale Utente. SITI-Reports. ABACO S.r.l.

Database 1 biblioteca universitaria. Testo del quesito

Guida all uso di Java Diagrammi ER

Guida alla Navigazione e Utilizzo dell Area Fattura PA

Manuale d uso Event Bureau

Mon Ami 3000 Ratei e Risconti Calcolo automatico di ratei e risconti

MANUALE PER L UTILIZZO DELLA FUNZIONE EVENTI Rel.1.2 del 29 gennaio 2004

19. LA PROGRAMMAZIONE LATO SERVER

ISTRUZIONI PER LA GESTIONE BUDGET

lo PERSONALIZZARE LA FINESTRA DI WORD 2000

GESTIONE NEWSLETTER 2 CREAZIONE NEWSLETTER

Il database management system Access

Scheda operativa Versione rif c00. Libro Inventari

SPORTELLO UNICO DELLE ATTIVITÀ PRODUTTIVE MANUALE OPERATIVO FUNZIONI DI PAGAMENTO ONLINE. Versione 05

Guida alla Navigazione e Utilizzo dell Area Fattura PA

Regione Toscana. ARPA Fonte Dati. Manuale Amministratore. L. Folchi (TAI) Redatto da

Progetto: ARPA Fonte Dati. ARPA Fonte Dati. Regione Toscana. Manuale Amministratore

Uso di base delle funzioni in Microsoft Excel

Organizzazione degli archivi

Introduzione a Dev-C++

Capitolo 5. Cercare informazioni sul Web

Informatica. Prof. M. Colajanni Università di Modena Reggio Emilia

Manuale Operativo per l utilizzo della piattaforma E-Learning@AQ. Versione 1.1

BDCC : Guida rapida all utilizzo

Versione 7.0 Taglie e Colori. Negozio Facile

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Gestione ed analisi di base dati nell epidemiologia. delle malattie infettive

FISH Sardegna ONLUS. Manuale Utente.

Capitolo 2. Operazione di limite

Client - Server. Client Web: il BROWSER

Esercizio data base "Biblioteca"

1. Le macro in Access 2000/2003

Corso di Laurea Specialistica in Ingegneria Informatica. Corso di Linguaggi e Tecnologie Web A. A Language) Stylesheet.

WG-TRANSLATE Manuale Utente WG TRANSLATE. Pagina 1 di 15

CREAZIONE E MODIFICA DELLA PAGINA WEB DELLA BIBLIOTECA Andare nel modulo Biblioteche in alto a sinistra. Digitare nel campo Nome Biblioteca la

STAMPA UNIONE DI WORD

Protocollo di tracciamento e valutazione degli studenti dei corsi di italiano ICoNLingua A.A

Introduzione Ai Data Bases. Prof. Francesco Accarino IIS Altiero Spinelli Via Leopardi 132 Sesto San giovanni

MANUALE UTENTE. In questo manuale verranno descritte tutte le sue funzioni. Il sistema OTRS è raggiungibile al seguente link:

PSG Table Builder Manuale Utente. PSG TABLE BUILDER Manuale Utente

CONTROLLO DI GESTIONE DELLO STUDIO

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

Strutturazione logica dei dati: i file

PULSANTI E PAGINE Sommario PULSANTI E PAGINE...1

Appunti sulla Macchina di Turing. Macchina di Turing

Accreditamento Soggetti Formatori in materia di Sicurezza sul Lavoro

Accise Settore Prodotti Alcolici Manuale d uso

Registratori di Cassa

GIOCHI MATEMATICI PER LA SCUOLA SECONDARIA DI I GRADO ANNO SCOLASTICO

Progettaz. e sviluppo Data Base

Università degli Studi di Padova Corso di Laurea in Informatica

Che differenza c è tra una richiesta XML ed una domanda XML? (pag. 4)

ACCESSO AL SISTEMA HELIOS...

PROGRAMMA GESTIONE TURNI MANUALE UTENTE. Programma Gestione Turni Manuale Utente versione 1.1

Corso introduttivo all utilizzo di TQ Qualifica

Corso di Informatica

PRINCIPALI AGGIORNAMENTI DELLA NUOVA VERSIONE DI WEBDIOCESI. 1 Nuovo menù di gestione

Manuale Utente Albo Pretorio GA

Automatizzare i compiti ripetitivi. I file batch. File batch (1) File batch (2) Visualizzazione (2) Visualizzazione

Guida per la gestione del proprio profilo in Scopus utilizzando la piattaforma Scival di Elsevier

Pagina 2 di 14. Indice

Corso Analista Programmatore Web PHP Corso Online Analista Programmatore Web PHP

MANUALE PER LA GESTIONE DEL SERVIZIO DI NEWSLETTER

Gestione Risorse Umane Web

Novità di Access 2010

Per accedere clicca su START o AVVIO (in basso a sinistra sul tuo schermo), poi su PROGRAMMI, ACCESSORI e infine su BLOCCO NOTE.

Scuola Digitale. Manuale utente. Copyright 2014, Axios Italia

Dispensa di database Access

Transcript:

POLITECNICO DI TORINO FACOLTÀ DI ORGANIZZAZIONE D IMPRESA E INGEGNERIA GESTIONALE CORSO DI LAUREA IN INGEGNERIA LOGISTICA E DELLA PRODUZIONE TESI DI LAUREA TECNOLOGIE BASATE SU XML PER LA PUBBLICAZIONE DINAMICA DI ARCHIVI BIBLIOGRAFICI Relatore: Prof. Fulvio Corno Laureando: Nico Tanzarella Anno Accademico 2006-2007

INDICE Capitolo I - INTRODUZIONE Capitolo II - LINGUAGGI UTILIZZATI 1. Il linguaggio XML pag. 3 2. Il linguaggio XSD 4 3. Il linguaggio XSL 5 4. Elaborazione di file XML nel linguaggio PHP 7 Capitolo III - CASO DI STUDIO 1. Campo di applicazione 8 2. Obiettivi del progetto 8 Capitolo IV - XML e XMLSchema 1. Il documento XML 9 2. e il relativo Schema 11 Capitolo V - SPECIFICA DEL PROBLEMA 1. Output desiderato 15 2. Principali costrutti PHP per la manipolazione di file XML 18 Capitolo VI - IL FOGLIO DI STILE XSL 1. Costrutti XSLT 20 2. Il codice PHP 24 3. Risultato ottenuto 29 Capitolo VII - CONCLUSIONI Appendice 1. Il file publications.xsd 33 2. Il file xml_action.php 36 I

CAPITOLO I INTRODUZIONE L argomento della tesi che ora esamineremo riguarda l impiego di tecnologie web volte a consentire un facile utilizzo e un rapido aggiornamento dell informazione destinata ad essere condivisa sul web. Obiettivo di questa introduzione è enunciare il campo di applicazione di tali tecnologie e i linguaggi web utilizzati per l implementazione delle stesse. Entrambi gli argomenti verranno affrontati in dettaglio nel corso della trattazione. L idea che sta alla base del progetto è il rifacimento della sezione pubblicazioni del sito www.cad.polito.it. che comprende quasi quattrocento voci. I motivi del rifacimento consistono sostanzialmente nell invecchiamento delle tecnologie utilizzate per realizzare la prima versione della sezione in questione e saranno illustrati nel terzo capitolo. L elenco di pubblicazioni presente sul sito è oggetto di ricerche e statistiche, perciò, il rifacimento ha reso necessario l impiego di tecnologie e linguaggi che consentano di interagire con l informazione disponibile. Si è pertanto deciso di ricopiare tutte le pubblicazioni in un documento XML accompagnato da un opportuno Schema che ne definisce la struttura. La visualizzazione del contenuto dell XML è invece affidata ad un foglio di stile XSL che trasforma il documento XML di partenza in HTML. La realizzazione dell XSL costituisce la particolarità del caso di studio affrontato: il documento XSL non è un file statico ma viene costruito dinamicamente sfruttando le potenzialità messe a disposizione dal linguaggio PHP. Tale procedimento è necessario poiché, come abbiamo già detto, l elenco delle pubblicazioni può essere oggetto di ricerche perciò il contenuto del foglio di stile cambia in funzione delle stesse. Concludiamo questa breve introduzione riassumendo il contenuto dei prossimi capitoli. Il secondo capitolo presenta una descrizione non dettagliata dei linguaggi XML, XSD e XSL e illustra i vantaggi della trasformazione XML-HTML lato server. Il capitolo successivo offre una rapida descrizione del sito web www.cad.polito.it e dei motivi che hanno determinato il rifacimento della sezione dedicata alle pubblicazioni. La realizzazione del documento XML contenente le pubblicazioni e del relativo Schema è invece l argomento del quarto capitolo. Il quinto capitolo precisa quale è il risultato che si intende ottenere mediante il foglio di stile XSL, descrive il meccanismo che consente all utente di effettuare le ricerche e introduce i principali costrutti PHP utilizzati per la costruzione e l applicazione del foglio di stile XSL al documento XML (si tratta di alcune delle funzioni delle librerie DOM e XSL). Infine, il sesto capitolo è

dedicato alla costruzione del foglio di stile XSL e alla presentazione del risultato ottenuto mentre l ultimo capitolo contiene le conclusioni. 2

CAPITOLO II LINGUAGGI UTILIZZATI 1. Il linguaggio XML L acronimo XML sta per: Extensible Markup Language. Si tratta di un linguaggio pensato per contenere, descrivere e condividere informazione sul web. Così come il ben più noto HTML, anche i documenti XML sono formati da marcatori (o tag) ognuno dei quali può contenere un pezzo di informazione (o semplicemente dato ). Il tag e l informazione in esso contenuta prendono il nome di elemento (o nodo). Un semplice esempio di elemento XML può essere il seguente: <colore>rosso</colore> Il tag colore contiene il dato rosso. Ogni elemento può inoltre essere accompagnato da uno o più attributi la cui sintassi riprende quella dell HTML: gli attributi vengono inseriti nel tag di apertura e il valore ad essi associato deve essere racchiuso tra apici (singoli o doppi). In definitiva, possiamo dire che un documento XML è una lista più o meno lunga di elementi ordinati secondo una precisa struttura gerarchica: ogni elemento può contenere un numero illimitato di elementi figli e può essere contenuto in elementi padri. Come l esempio della pagina precedente lascia intuire, l XML consente all autore del documento di decidere il nome dei vari tag con alcune limitazioni: i nomi non possono contenere spazi; i nomi non possono cominciare con un carattere numerico o con un carattere di punteggiatura; i nomi non possono cominciare con la sequenza di caratteri xml (o XML, o Xml ecc ). Oltre a queste semplici direttive riguardanti i nomi dei tag, un documento XML deve rispettare le seguenti regole di sintassi: ogni documento XML deve contenere un solo elemento di massimo livello (root element o elemento radice) che contenga tutti gli altri elementi del documento; ogni elemento deve avere un tag di chiusura; gli elementi devono essere correttamente annidati: i tag di chiusura devono seguire l ordine inverso dei rispettivi tag di apertura; 3

l XML fa distinzione tra caratteri minuscoli e caratteri maiuscoli (linguaggio case sensitive), perciò il tag di apertura e il tag di chiusura di un elemento devono coincidere anche sotto questo aspetto; i valori degli attributi devono sempre essere racchiusi tra apici. Un documento XML che rispetta tutte queste regole è detto ben formato (dall inglese well formed). 2. Il linguaggio XSD Come abbiamo detto nel paragrafo precedente, un documento XML è caratterizzato da una precisa struttura gerarchica che stabilisce le relazioni di parentela tra i nodi. Tale struttura viene definita, mediante il linguaggio XSD, all interno di un altro documento chiamato XMLSchema (o semplicemente Schema). Così come accade per un documento XML, anche uno Schema possiede un root element che racchiude l intero contenuto dello stesso: <xs:schema xmlns:xs="http://www.w3.org/2001/xmlschema"> contenuto </xs:schema> L attributo xmlns:xs definisce il namespace di riferimento. Oltre alla gerarchia di un documento XML, uno Schema permette di definire il tipo di dato contenuto in ogni elemento (uno o più sotto-elementi, testo puro, valore numerico ecc ) e gli attributi eventualmente associati ad ognuno di essi. Consideriamo il seguente frammento di Schema: <xs:element name="bookstore"> <xs:complextype> <xs:sequence> <xs:element name="book" type="xs:string" minoccurs="1" maxoccurs="unbounded"/> </xs:sequence> <xs:attribute name="id" type="xs:string"/> </xs:complextype> </xs:element> Tale blocco di codice definisce struttura e contenuto di due diversi elementi : bookstore e book. Il primo, definito complesso poiché contiene sottoelementi, consiste in una sequenza di elementi figli chiamati book contenenti una stringa di caratteri (type="xs:string"). La numerosità minima di tali elementi (definiti semplici perché non contengono sotto-elementi) è pari ad uno (minoccurs="1") mentre la numerosità massima degli stessi è illimitata (maxoccurs="unbounded"). L istruzione : 4

<xs:attribute name="id" type="xs:string"/> stabilisce inoltre che l elemento bookstore è accompagnato da un attributo id il cui contenuto è una stringa di caratteri. Una volta stabilita la struttura del documento XML mediante lo Schema, è possibile mettere in relazione i due file in modo tale che lo Schema convalidi la struttura del documento XML. In definitiva, mentre il documento XML racchiude il contenuto, lo Schema definisce tutte le specifiche strutturali relative al contenuto stesso. L uso degli Schema non è obbligatorio ma è consigliato poiché impedisce di commettere errori strutturali e logici nella stesura o nell aggiornamento di un documento XML. Il quarto capitolo contiene un esempio commentato di documento XML a cui è associato il relativo Schema. 3. Il linguaggio XSL Nel capitolo precedente abbiamo presentato l XML come un linguaggio pensato per il web ma non abbiamo spiegato come un documento XML riesca ad interagire positivamente con i browser. In altre parole, è necessario descrivere come vengono definite le specifiche di visualizzazione di un documento XML. A differenza dell HTML, un documento XML non è direttamente interpretabile dai browser ed è quindi necessario trasformare il documento XML in un altro tipo di documento riconosciuto dai browser (generalmente HTML). Ciò è reso possibile grazie al linguaggio XSL (Extensible Stylesheet Language). Se volessimo continuare il parallelo con l HTML, potremmo dire che,mentre il linguaggio CSS definisce i fogli di stile per i documenti HTML, l XSL definisce i fogli di stile per i documenti XML. In realtà, questo non è propriamente esatto poiché l XSL è un linguaggio molto più complesso rispetto ai semplici CSS. Per meglio comprendere le reali potenzialità dell XSL, distinguiamo innanzitutto le tre componenti principali di quest ultimo: XSLT (XSL Transformations): un linguaggio per trasformare un documento XML in un altro tipo di documento (ad es.: HTML); XPath (XML Path Language): un linguaggio per fare riferimento a parti specifiche di un documento XML (elementi, attributi ecc ); XSL-FO (XSL Formatting): un linguaggio per la formattazione di documenti XML. Oggetto di questa tesi saranno il linguaggio XSLT e il linguaggio XPath perciò la descrizione dei fogli di stile XSL presentata di seguito farà 5

riferimento a queste due sole componenti. Analogamente a quanto visto per gli Schema, anche il contenuto di un foglio di stile XSL viene inserito in un file esterno richiamato dal relativo documento XML mediante la direttiva di elaborazione: <?xml-stylesheet type= text/xsl href= stylesheet.xsl?> Per quanto riguarda invece la struttura di un foglio di stile, osserviamo innanzitutto che l intero contenuto di quest ultimo deve essere racchiuso all interno dell elemento radice <xsl:stylesheet>: <xsl:stylesheet version= 1.0 xmlns:xsl= http://www.w3.org/1999/xsl/transform> contenuto </xsl:stylesheet> L attributo version specifica la versione del linguaggio XSL utilizzato mentre l attributo xmlns:xsl definisce il namespace di riferimento. Il contenuto del foglio di stile può ospitare qualunque costrutto (o elemento ) messo a disposizione dal linguaggio XSLT, ognuno dei quali è caratterizzato da un tag di apertura e uno di chiusura. Il costrutto più importante è indubbiamente l elemento template che presenta la seguente sintassi: <xsl:template match= espressione XPath > contenuto </xsl:template> Un template contiene un set di regole di visualizzazione che vengono applicate ogni qual volta viene incontrato un nodo del documento XML che soddisfa l espressione XPath adottata come valore dell attributo match. La selezione del nodo desiderato mediante il linguaggio XPath avviene specificando il percorso che separa il nodo stesso dal root element. Ad esempio, l istruzione: <xsl:template match= bookstore/book > </xsl:template> specifica che il template verrà applicato a tutti gli elementi book figli di bookstore, dove bookstore è il root element. Il contenuto di un template può includere, oltre a qualunque costrutto definito dall XSLT, tutti i tag tipici dell HTML (<html>, <body>, <div>, <table> ecc ). Proprio questa particolarità rende possibile la traduzione da XML a HTML. In definitiva, un foglio di stile XSL è un insieme di template ognuno dei quali processa una parte del documento XML associato all XSL. A questo punto è facile intuire che il tassello mancante tra XML e browser è un opportuno foglio di stile XSL che trasformi il documento XML di 6

partenza in HTML. I browser più recenti possiedono infatti un processore XSLT che, presi in input il documento XML e il relativo foglio di stile, opera autonomamente la trasformazione. Anche se questa soluzione funziona correttamente, possono comunque sorgere problemi legati al tipo e alla versione del browser utilizzato: come abbiamo detto, solo i browser più recenti possiedono un processore XSLT e ogni browser utilizza il proprio processore diverso da quello degli altri. Il prossimo paragrafo presenterà una più efficiente alternativa alla trasformazione lato client. 4. Elaborazione di file XML nel linguaggio PHP Il PHP (PHP: Hypertext Preprocessor) è un linguaggio open source potente e complesso utilizzato per numerose applicazioni una delle quali è la realizzazione di pagine web dinamiche (pagine web in grado di modificare autonomamente il proprio contenuto). Ad eccezione di alcuni particolari costrutti, la sintassi del PHP non sarà oggetto di questo elaborato. Il codice PHP può essere integrato direttamente nell HTML ma, a differenza di quest ultimo, viene interpretato lato server cioè prima che la pagina web giunga al browser. Questa caratteristica ci permette di superare i problemi descritti nel paragrafo precedente legati alla particolare tipologia di browser utilizzato dall utente. Il PHP permette infatti di definire un processore XSLT che, come nel caso descritto nel paragrafo precedente, sfrutta un opportuno foglio di stile XSL per trasformare un documento XML in HTML. La differenza fondamentale rispetto alla trasformazione lato browser consiste nel fatto che, sfruttando le potenzialità del server, è possibile fare in modo che il browser riceva HTML puro evitando che il browser stesso compia operazioni che vanno al di là della sua normale competenza. Il linguaggio PHP comprende inoltre numerose funzioni orientate agli oggetti (PHP DOM functions e XSL functions) che permettono di modificare e interagire sia con il documento XML, che con il foglio di stile ad esso associato. Il funzionamento del processore XSLT e le potenzialità delle funzioni in questione saranno descritte in dettaglio nel quinto capitolo. 7

CAPITOLO III CASO DI STUDIO 1. Campo di applicazione Le tecnologie web oggetto di questo elaborato sono state utilizzate per il rifacimento della sezione pubblicazioni del sito web: www.cad.polito.it. Si tratta del sito del gruppo di ricerca CAD che ha sede presso il Dipartimento di Automatica e Informatica del Politecnico di Torino. Le informazioni disponibili al suddetto indirizzo riguardano non solo i progetti, le pubblicazioni e le proposte di tesi realizzati dal gruppo, ma anche i docenti e i ricercatori che ne fanno parte. Per quanto riguarda invece i motivi che hanno determinato il rifacimento della sezione pubblicazioni, diciamo innanzitutto che il motore di ricerca che gestisce attualmente le pubblicazioni è stato scritto in PERL con una struttura dati simil-xml. Tale applicazione, presenta però alcuni difetti: difficile manutenzione dell informazione contenuta; nessun controllo su eventuali errori legati al codice; difficile estrapolazione di dati necessari per generare statistiche. 2. Obiettivi del progetto L obiettivo del progetto è sostanzialmente la risoluzione dei problemi prima enunciati mediante la rielaborazione del motore di ricerca con tecnologie più moderne. Tale risultato deve però essere ottenuto mantenendo tutte le funzionalità attualmente offerte dal sito. 8

CAPITOLO IV XML E XMLSCHEMA 1.Il documento XML Come anticipato nel primo capitolo, il punto di partenza del progetto in esame è il linguaggio XML. Più in particolare, tutte le pubblicazioni attualmente presenti sul sito cad.polito.it verranno ricopiate in un documento XML che costituirà una sorta di database continuamente aggiornabile ogni volta che ciò sarà necessario. Tale documento non esiste ancora poiché, per testare il funzionamento di quella che sarà la nuova sezione pubblicazioni, è stato sufficiente ricorrere a un piccolo estratto dell intero elenco disponibile. È importante sottolineare che vi sono sei diverse tipologie di pubblicazione: article (un articolo di giornale o rivista); book (un libro completo pubblicato da un editore); inbook (una parte di libro: capitolo, sezione o gruppo di pagine); inproceedings (un articolo discusso durante una conferenza); thesis (una tesi di Dottorato); techport (un report pubblicato da una scuola o da altra istituzione). Inoltre, uno stesso lavoro può essere pubblicato più di una volta (ad es. sia come articolo sia come parte di libro). Per rendere possibile la traduzione di tutte le informazioni associate ad ogni pubblicazione (o entry ) secondo la sintassi dell XML, sono stati definiti una serie di campi globali e specifici. Tutte le entry possiedono i seguenti campi globali: author(s), title, keyword(s), diffusion, language e abstract. Oltre a questi, vi sono due campi globali non obbligatori: url(s) e note. I campi specifici dipendono invece dal tipo di pubblicazione: article: journal, year, pages, volume, number, year, isbn, issn, doi; book: publisher, year, volume, edition, numpages, isbn, issn, doi; inbook: booktitle, pages, publisher, year, editor(s), volume, edition, isbn, issn, doi; inproceedings: conferencename, year, pages, booktitle, editor(s), organization, publisher, conferencelocation, isbn, issn, doi; thesis: school, year, advisor(s); techport: institution, year, type, number. I campi in grassetto sono obbligatori. È interessante notare che il campo year, pur essendo presente in ogni tipo di pubblicazione come campo 9

obbligatorio, non è stato inserito tra i campi globali. Ciò è dovuto al fatto che ogni entry può essere pubblicata più di una volta non necessariamente nello stesso anno. Riportiamo adesso un estratto del documento XML (publications.xml) contenente una sola entry (cioè una pubblicazione): <?xml version="1.0" encoding="utf-8"?> <publications xsi:nonamespaceschemalocation="publications.xsd" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"> <entry code="tcad96a"> <title>gatto: a Genetic Algorithm for Automatic Test Pattern Generation for Large Synchronous Sequential Circuits</title> <authors> <author>f. Corno</author> <author>p. Prinetto</author> <author>m. Rebaudengo</author> <author>m. Sonza Reorda</author> </authors> <keywords> <keyword>approximate Methods</keyword> <keyword>evolutionary Algorithms</keyword> <keyword>genetic Algorithms</keyword> </keywords> <diffusion>int</diffusion> <language>en</language> <article> <journal>ieee Transactions on Computer-Aided Design</journal> <year>1996</year> <pages>pp. 943-951</pages> <volume>vol. 15</volume> <number>no. 8</number> <isbn>320</isbn> </article> <inbook> <booktitle>from Theory to Sound Practice</booktitle> <pages>pp. 554-557</pages> <publisher>ios Press</publisher> <year>1992</year> <editors> <editor> W. Joosen </editor> <editor> E. Milgrom </editor> </editors> </inbook> <abstract>...</abstract> </entry> </publications> 10

La prima riga del documento definisce la versione dell XML (1.0) e il set di caratteri utilizzato (utf-8). Subito dopo incontriamo il root element (publications) al quale sono associati due attributi: il primo lega il documento XML al relativo Schema (publications.xsd) mentre il secondo precisa il namespace di riferimento. Il successivo elemento è entry anch esso accompagnato da un attributo: code. Si tratta di un identificatore univoco la cui funzione verrà chiarita nel sesto capitolo. L elemento entry contiene tutte le informazioni che prima erano state definite campi ed è interessante osservare come ogni campo è stato tradotto in un elemento XML. Terminiamo questa descrizione facendo notare che il documento XML non è associato a nessun foglio di stile. Il motivo di questa scelta sarà spiegato nel prossimo capitolo. 2. e il relativo Schema In questo paragrafo ci limiteremo ad illustrare il codice XSD che definisce la struttura dell elemento entry e dell elemento article. La restante parte di codice non verrà descritta poiché contiene le medesime istruzioni che ci accingiamo a commentare. Ad ogni modo, l appendice di pag. 35 riporta l intero contenuto del file publications.xsd. Cominciamo con l elemento entry: <xs:element name="entry"> <xs:complextype> <xs:sequence> <xs:element name="title" type="xs:string"/> <xs:element ref="authors"/> <xs:element ref="keywords"/> <xs:element ref="diffusion"/> <xs:element ref="language"/> <xs:element ref="urls" minoccurs="0"/> <xs:sequence> <xs:element ref="article" minoccurs="0" maxoccurs="unbounded"/> <xs:element ref="book" minoccurs="0" maxoccurs="unbounded"/> <xs:element ref="inbook" minoccurs="0 maxoccurs="unbounded"/> <xs:element ref="inproceedings" minoccurs="0" maxoccurs="unbounded"/> <xs:element ref="thesis" minoccurs="0" maxoccurs="unbounded"/> 11

<xs:element ref="techreport" minoccurs="0" maxoccurs="unbounded"/> </xs:sequence> <xs:element name="abstract" type="xs:string"/> <xs:element name="note" type="xs:string" minoccurs="0"/> </xs:sequence> <xs:attribute name="code" type="xs:string"/> </xs:complextype> </xs:element> L immagine seguente mostra un diagramma ad albero che riproduce la struttura gerarchica dell elemento in questione: Come è possibile osservare, entry è un elemento complesso consistente in una sequenza di numerosi sotto-elementi obbligatori o facoltativi. 12

L obbligatorietà o la discrezionalità dei vari elementi viene definita mediante gli attributi minoccurs e maxoccurs: fissare entrambi gli attributi a 1 equivale a rendere un particolare elemento obbligatorio e non ripetibile mentre fissare minoccurs a 0 rende un elemento non obbligatorio. Inoltre, precisiamo che, nel caso in cui gli attributi minoccurs e/o maxoccurs non vengano definiti dal programmatore, gli stessi vengono automaticamente impostati a 1. Terminiamo la descrizione spiegando la funzione dell istruzione: ref. Tale istruzione sta a significare che la struttura dell elemento specificato come valore della stessa ref viene definita in un blocco di codice esterno a quello corrente (si veda il file publications.xsd in appendice). Esaminiamo adesso la struttura dell elemento article: <xs:element name="article"> <xs:complextype> <xs:sequence> <xs:element name="journal" type="xs:string"/> <xs:element name="year" type="xs:integer"/> <xs:element name="pages" type="xs:string"/> <xs:element name="volume" type="xs:string" minoccurs="0"/> <xs:element name="number" type="xs:string" minoccurs="0"/> <xs:group ref="codes"/> </xs:sequence> </xs:complextype> </xs:element> Anche in questo caso riportiamo il relativo diagramma ad albero: 13

Rispetto al codice precedente, osserviamo la presenza di un nuovo costrutto: xs:group. Si tratta di un istruzione XSD utilizzata per definire una serie di elementi comuni a due o più padri. Nel nostro caso le tipologie article, book, inbook e inproceedings possono essere accompagnate dal relativo codice bibliografico composto dagli elementi isbn e/o issn e/o doi. Per questo motivo, tali elementi sono stati raggruppati nel costrutto xs:group. Per evitare confusione, concludiamo precisando che CODES non è un elemento XML ma unicamente un costrutto interno allo Schema. 14

CAPITOLO V SPECIFICA DEL PROBLEMA 1. Output desiderato Il capitolo precedente ha descritto la realizzazione del documento XML e del relativo Schema ovvero l input da fornire al PHP affinché quest ultimo generi l HTML desiderato (cioè il nostro output). Per avere un idea del risultato che intendiamo ottenere lato browser, possiamo considerare le immagini seguenti che mostrano alcune delle pagine attualmente presenti sul sito cad.polito.it: 15

L immagine qui sopra mostra il form che consente all utente di selezionare le pubblicazioni di maggiore interesse mediante l esecuzione di opportune ricerche. Questa utile funzionalità, che la nuova sezione dedicata alle pubblicazioni dovrà garantire, ci permette di enunciare la particolarità del caso di studio affrontato: il foglio di stile XSL utilizzato per convertire in HTML il documento publications.xml non può essere un file esterno puramente statico ma deve essere generato dinamicamente in modo tale da adattarsi, di volta in volta, alla richiesta dell utente. In altre parole, il foglio di stile deve visualizzare l intero l elenco delle pubblicazioni oppure solo quelle entry che soddisfano l eventuale ricerca eseguita dall utente. Questo è anche il motivo per cui il documento XML non è stato preventivamente associato a nessun foglio di stile. Prima di procedere, è opportuno illustrare in quale modo è stato ricostruito il meccanismo che consente all utente di effettuare una ricerca. Diciamo innanzitutto che l utente non ha alcuna interazione con la pagina web che esegue la trasformazione del documento XML in HTML (xml_action.php). Tale pagina viene infatti richiamata dalla pagina web ricerca.php che interagisce con l utente dando a quest ultimo la possibilità di visionare l intero elenco delle pubblicazioni o di effettuare ricerche mediante la compilazione di un form. Più in particolare, l utente ha a disposizione le seguenti chiavi di ricerca: year (anno di pubblicazione); type (tipo di pubblicazione: articolo, libro ecc ); author (autore della pubblicazione); key (chiave di ricerca scelta da una lista predefinita); free (ricerca, nel titolo della pubblicazione, una parola o una frase inserita dall utente). I parametri della ricerca, se selezionati, vengono poi inviati alla pagina xml_action.php che li utilizzerà per generare un opportuno foglio di stile XSL. Osserviamo infine che, in termini di XML, tutte le chiavi di ricerca ad eccezione di year corrispondono ad elementi XML che presentano una struttura gerarchica fissa: type è sempre figlio di entry, author è sempre figlio di authors che è a sua volta figlio di entry ecc L elemento year può invece avere sei diversi elementi padri: article, book, inbook, inproceedings, thesis e techport. Questa particolarità ha richiesto, in termini di codice PHP, una più attenta implementazione per le chiavi di ricerca year e type. Tornando al sito esistente, se l utente ha utilizzato il precedente form di ricerca, cliccando sul pulsante Search viene visualizzato il risultato della ricerca: 16

In questo caso, l utente ha richiesto tutte le pubblicazioni del 1992. Come l immagine lascia intuire, i titoli delle pubblicazioni sono link che rimandano alla pagina di dettaglio. Ad esempio, se l utente cliccasse sul primo titolo, verrebbero visualizzate le seguenti informazioni: 17

La pagina di dettaglio mostra chiaramente le parole chiave associate alla pubblicazione (keywords) e una sintesi del contenuto di quest ultima (abstract). 2. Principali costrutti PHP per la manipolazione di file XML Il processo di costruzione del foglio di stile XSL sarà il principale argomento del prossimo capitolo. In questo paragrafo ci limitiamo ad anticipare la descrizione delle principali istruzioni PHP utilizzate per effettuare la trasformazione del documento publications.xml in HTML. L istruzione: 18

oggetto_domdocument = new DOMDocument(); crea un oggetto di tipo DOMDocument. Tali oggetti vengono utilizzati per contenere file HTML o XML (cioè aventi estensione.xml,.xsd o.xsl) poiché possono fare riferimento alle funzioni della libreria DOM che, come anticipato precedentemente, consente di modificare queste tipologie di file. Una delle funzioni presenti nella libreria DOM è la funzione load: oggetto_domdocument->load('file xml o html'); Come è lecito pensare, l istruzione appena scritta associa all oggetto DOMDocument il file specificato nella lista dei parametri. Se tale file è di tipo XML ed è provvisto di Schema, è possibile verificare se l XML rispetta la struttura definita nello Schema mediante l istruzione: oggetto_domdocument->schemavalidate('file xsd'); Una volta che il documento XML e il relativo XSL sono stati caricati in due oggetti diversi, è necessario definire un processore XSLT che applichi il foglio di stile al documento XML. L istruzione: processore_xslt = new XSLTProcessor(); crea un processore XSLT. Il passo successivo consiste nell associare al processore il foglio di stile contenuto nell oggetto DOMDocument. Ciò è reso possibile dalla funzione importstylesheet: processore_xslt->importstylesheet(domdocument tipo XSL); A questo punto il processore è pronto per applicare il foglio di stile al documento XML. Tale operazione viene eseguita dalla funzione transformtoxml: processore_xslt->transformtoxml(domdocument tipo XML); Terminiamo la descrizione precisando che le funzioni importstylesheet e transformtoxml appartengono alla libreria XSL. 19

CAPITOLO VI IL FOGLIO DI STILE XSL 1. Costrutti XSLT La costruzione del foglio di stile XSL verrà illustrata in parte in questo paragrafo, in parte nel successivo. Più in particolare, descriveremo dapprima l intero foglio di stile e successivamente il meccanismo dinamico, contenuto nella pagina xml_action, che genera il foglio di stile stesso. Commentiamo la parte iniziale dell XSL: <?xml version="1.0" encoding="utf-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:template match="/"> <html> <head> <title>www.cad.polito.it - pubblicazioni</title> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/> <style type="text/css"> h2 { font-family:arial; text-align:center } span.title { font-family:verdana; font-size:11pt; color:blue; text-decoration:underline } span.authors { font-style:italic } span.codes { font-style:italic } span.confname { font-style:italic } span.note { font-weight:bold } </style> </head> <body> <h2> </h2> Il template: <xsl:template match="/"> seleziona l intero documento XML e lo racchiude all interno dei tag html e body. Subito dopo troviamo un primo esempio dell aspetto dinamico del foglio di stile: il titolo della pagina HTML risultato dell applicazione del foglio di stile XSL al documento publications.xml cambia a seconda che l utente abbia richiesto l elenco completo delle pubblicazioni o abbia effettuato una ricerca. La scelta di un titolo opportuno verrà descritta nel prossimo paragrafo. Continuiamo a commentare il codice: 20

<xsl:for-each select="publications/entry"> Il costrutto iterativo for-each seleziona, uno alla volta, tutti gli elementi entry presenti nel file publications.xml (notare l espressione XPath inserita come valore dell attributo select). A questo punto, la pagina xml_action provvede a inserire uno o più costrutti di selezione if per scegliere le entry che soddisfano la richiesta dell utente nel caso in cui quest ultimo abbia effettuato una ricerca. Ad esempio, se l utente avesse richiesto tutte le pubblicazioni che presentano come parola chiave il termine php, verrebbe aggiunto il costrutto: <xsl:if test="keywords/keyword='php'"> In questo modo verrebbero selezionate solo quelle entry che presentano un elemento keyword contenente la stringa php. Procediamo con l analisi del foglio di stile: <p> <xsl:number value="position()"/>. <xsl:apply-templates select="..."/> </p> La prima istruzione apre un paragrafo che racchiude il contenuto della entry corrente. Quest ultimo è preceduto dalla posizione della stessa entry: la funzione XSLT position restituisce la posizione dell elemento correntemente processato mentre la funzione number stampa il valore numerico contenuto nell attributo value. L istruzione seguente provvede ad inserire il costrutto xsl:apply-templates. Tale istruzione si trova sempre all interno di un template e svolge simultaneamente due operazioni: visualizza il contenuto dell elemento correntemente elaborato (una delle pubblicazioni); controlla, all interno del foglio di stile, l eventuale presenza di altri template applicabili al contenuto dell elemento stesso (questo aspetto sarà illustrato tra breve). Più in particolare, apply-templates visualizza unicamente i sotto-elementi dell elemento corrente specificati dall attributo select. Se tale attributo è assente, apply-templates visualizza l intero contenuto dell elemento. Come è facile intuire, il contenuto dell attributo select dipende fortemente dalla richiesta dell utente perciò descriveremo il codice PHP che lo definisce nel paragrafo successivo. L ultima riga di codice chiude il paragrafo dedicato alla pubblicazione. Il blocco di codice che segue deve innanzitutto provvedere a chiudere i costrutti if eventualmente aperti in precedenza mediante l istruzione: 21

</xsl:if> Fatto ciò, viene chiuso il costrutto iterativo for-each e viene inserita l ultima parte del contenuto del template: </xsl:for-each> <xsl:if test="boolean(publications/entry[ ])=false"> <p><b>nessun riscontro ottenuto con i parametri inseriti</b></p> </xsl:if> <p><a href="ricerca.php">ricerca</a></p> </body> </html> </xsl:template> Come vedremo nel prossimo paragrafo, il costrutto xsl:if precedente viene inserito solo se l utente ha effettuato una ricerca ed è utilizzato per verificare l effettiva presenza di pubblicazioni che soddisfano la richiesta dell utente. La funzione XSLT boolean verifica infatti l esistenza di entry aventi caratteristiche uguali a quelle specificate dall utente. Queste ultime costituiscono il contenuto delle parentesi quadre (anche questo aspetto sarà descritto in dettaglio nel prossimo paragrafo). Nel caso in cui il documento XML non contenga pubblicazioni in grado di soddisfare i parametri della ricerca, il costrutto if consente la visualizzazione del messaggio: Nessun riscontro ottenuto con i parametri inseriti. Le ultime righe di codice inseriscono un link alla pagina ricerca.php e chiudono sia la pagina HTML che il template. Il prossimo frammento di codice presenta una serie di template che elaborano alcuni degli elementi comuni a tutte le tipologie di pubblicazione (title, authors e note): <xsl:template match="title"> <a> <xsl:attribute name="href"> dettaglio.php?code=<xsl:value-of select="../@code"/> </xsl:attribute> <span class="title"><xsl:value-of select="."/></span> </a> </xsl:template> <xsl:template match="authors"> <br/> <xsl:for-each select="author"> <a> <xsl:attribute name="href"> xml_action.php?spy&author=<xsl:value-of select="."/> 22

</xsl:attribute> <span class="authors"> <xsl:value-of select="."/> </span> </a> <xsl:choose> <xsl:when test="position()=last()">; </xsl:when> <xsl:otherwise>, </xsl:otherwise> </xsl:choose> </xsl:for-each> </xsl:template> <xsl:template match="note"> <br/><span class="note"><xsl:value-of select="."/></span> </xsl:template> Il primo template elabora l elemento title: dopo aver estratto il valore dell elemento mediante l istruzione <xsl:value-of select="."/>, lo stesso viene racchiuso all interno del tag HTML <a>. L attributo href di quest ultimo viene inserito dal costrutto xsl:attribute il cui contenuto rimanda alla pagina dettaglio.php. I titoli delle entry diventano quindi una serie di link che indirizzano l utente a tale pagina la cui funzione è quella di mostrare tutte le informazioni disponibili relative ad una particolare entry. Dettaglio.php presenta un meccanismo di funzionamento del tutto simile a xml_action.php. Anche in questo caso possiamo infatti distinguere tre operazioni fondamentali: acquisizione del documento publications.xml; costruzione dinamica di un opportuno foglio di stile XSL; applicazione del foglio di stile al documento XML e restituzione del risultato al browser. Poiché dettaglio.php prende in input l intero elenco delle entry, è necessario consentire alla pagina stessa di riconoscere quale pubblicazione elaborare. Per questo motivo, l URL di redirezione è accompagnata dal parametro code che contiene l identificatore univoco della pubblicazione su cui l utente a cliccato: l istruzione <xsl:value-of select="../@code"/> estrae il valore dell attributo code della entry corrente. Il foglio di stile XSL utilizzerà il parametro code per selezionare ed elaborare l unica entry il cui attributo code risulta uguale all omonimo parametro ricevuto mediante link. Dopo questa breve parentesi sulla pagina dettaglio.php terminiamo la spiegazione del codice precedente descrivendo il template che si occupa dell elemento authors. Tale costrutto presenta una struttura simile a quella del caso precedente: ogni autore è un link alla pagina xml_action.php alla quale viene inviato il nome dell autore stesso. In altre parole, cliccare su uno degli autori di una qualunque pubblicazione equivale a richiedere tutte le pubblicazioni di quel particolare autore proprio come se fosse stato 23

utilizzato il form di ricerca. Infine, il template in questione fa uso del costrutto xsl:choose. Si tratta di un istruzione che opera come uno switch del linguaggio PHP e, in questo caso, serve unicamente a inserire una virgola dopo il nome di ogni autore (o un punto e virgola se l autore è l ultimo dell elenco). La restante parte di codice contiene i template dedicati all elaborazione delle sei diverse tipologie di pubblicazione. Ci limitiamo a descrivere il template relativo all elemento article poiché tutti presentano la medesima struttura: <xsl:template match="article"> <br/> ARTICLE - <span class="journal"><xsl:value-of select="journal"/>, </span> <span class="year"><xsl:value-of select="year"/>, </span> <xsl:value-of select="pages"/> <xsl:if test="boolean(isbn or issn or doi)">, <span class="codes">codes: <xsl:value-of select="isbn"/> <xsl:if test="isbn and (issn or doi)">-</xsl:if> <xsl:value-of select="issn"/> <xsl:if test="issn and doi">-</xsl:if> <xsl:value-of select="doi"/> </span> </xsl:if> </xsl:template>... </xsl:stylesheet> Come è possibile osservare, ad eccezione del codice bibliografico dell articolo, gli unici elementi che vengono processati corrispondono ai campi obbligatori della tipologia article (tutte le altre informazioni sono visibili nella pagina di dettaglio). Prima di concludere, precisiamo che i template descritti in questo e nel precedente blocco di codice vengono richiamati dall istruzione xsl:apply-templates per elaborare i relativi elementi. L ultima riga di codice chiude il foglio di stile XSL. 2. Il codice PHP In questo paragrafo descriveremo il processo dinamico che consente alla pagina xml_action di costruire il foglio di stile XSL illustrato nel precedente paragrafo. Precisiamo che le parti puramente statiche dell XSL vengono scritte in file esterni e incorporate al resto del documento mediante la funzione PHP file_get_contents( nome_file ). 24

Anche in questo caso commenteremo un blocco di codice per volta: <?php $xml_file=new DOMDocument(); $xml_file->load('publications.xml'); $xsl_file=new DOMDocument(); $xsl_string=file_get_contents("inizio_xsl.txt"); if(isset($_request["spy"])) $xsl_string=$xsl_string."<h2>risultati della ricerca</h2>"; else $xsl_string=$xsl_string."<h2>elenco completo delle pubblicazioni</h2>"; $xsl_string=$xsl_string."<xsl:for-each select=\"publications/entry\">"; Le prime righe di codice presentano alcune delle istruzioni descritte in precedenza: la variabile $xml_file contiene il file XML publications.xml mentre la variabile $xsl_file sarà utilizzata per fare riferimento al foglio di stile XSL. Quest ultimo viene memorizzato nella variabile $xsl_string sotto forma di stringa (il file inizio_xsl.txt contiene la parte di foglio di stile compresa tra la riga iniziale e il tag body). A questo punto è necessario spiegare perché il foglio di stile non viene scritto in un file esterno come accade per il documento XML. Tale ipotesi non è accettabile poiché darebbe vita a problemi di condivisione delle risorse nel momento in cui due o più utenti richiedessero contemporaneamente l elenco delle pubblicazioni o effettuassero simultaneamente una ricerca. In altre parole, xml_action cercherebbe di scrivere due o più volte lo stesso file nello stesso momento. Torniamo al codice: il costrutto if-else che segue applica un titolo opportuno alla pagina HTML grazie alla variabile $_REQUEST[ spy ]. Tale variabile viene inviata dalla pagina ricerca.php se l utente ha utilizzato il form di ricerca. Se la variabile in questione esiste (cioè se è stata ricevuta) il titolo della pagina HTML sarà: Risultati della ricerca. In caso contrario verrà stampato il titolo: Elenco delle pubblicazioni. L ultima riga di codice aggiunge il già citato costrutto iterativo for-each. La parte di codice che segue si occupa di implementare l eventuale richiesta di ricerche da parte dell utente. Poiché le istruzioni PHP utilizzate per gestire ognuna delle sei chiavi di ricerca sono essenzialmente le stesse, ci limiteremo a descrivere i costrutti XSL che vengono aggiunti al foglio di stile per consentire a quest ultimo di selezionare le pubblicazioni adatte alla richiesta dell utente. L intero codice è comunque disponibile in appendice. Il frammento di codice che gestisce le ricerche definisce innanzitutto un contatore e una variabile sentinella: 25

$if_counter=0; $opened_if=false; Come il nome del contatore stesso lascia intendere, tale variabile conta quanti costrutti xsl:if sono stati aperti al fine di inserire nell XSL un ugual numero di tag di chiusura. La funzione della variabile $opened_if sarà invece descritta tra breve. Adesso possiamo descrivere come viene modificato il foglio di stile XSL in caso di ricerche. Supponiamo che l utente abbia richiesto tutte le pubblicazioni di un particolare anno. In questo caso la pagina xml_action.php provvederà ad inserire nell XSL il seguente costrutto: <xsl:if test="*/year='$year'"> dove la variabile $year all interno dell espressione XPath contiene l anno specificato dall utente. Il carattere * viene interpretato dal processore XSLT come qualunque nodo e la sua presenza è giustificata dal fatto che, secondo la struttura dell XML, l elemento year può avere sei diversi padri: article, book, inbook, inproceedings, thesis o techreport. In altre parole, l istruzione precedente seleziona tutte le entry che presentano un elemento year il cui valore risulta uguale al contenuto della variabile $year indipendentemente da quale sia il nodo padre di year. Subito dopo xml_action.php eseguirà l istruzione seguente: $last_if="<xsl:if test=\"boolean(publications/entry [*/year='$year'"; La variabile $last_if contiene la parte iniziale del costrutto if che verifica l effettiva presenza di pubblicazioni rispondenti alla richiesta dell utente. Come il codice in appendice mostra, tale costrutto viene realizzato pezzo per pezzo in base ai parametri scelti dall utente e, proprio per questo motivo, è necessario impiegare una variabile sentinella che ricordi l avvenuta apertura del costrutto. Questo compito è assolto dalla variabile booleana $opened_if: la variabile vale false se l if non è ancora stato aperto, true in caso contrario. Il costrutto in questione viene memorizzato nella variabile $last_if poiché verrà aggiunto al foglio di stile quando ciò sarà necessario. Le istruzioni appena descritte vengono ripetute per ogni chiave di ricerca selezionata in modo tale da aggiungere nuovi costrutti xsl:if che filtrano ulteriormente l elenco delle pubblicazioni. Terminiamo la descrizione di questa parte di codice con un osservazione relativa al frammento di PHP che si occupa della chiave di ricerca free (si veda il file xml_action.php in appendice). Tale blocco di codice sfrutta due funzioni XSLT: translate e contains. La prima viene utilizzata per trasformare in minuscolo il titolo di ogni entry al fine di evitare che il processo di ricerca faccia distinzione tra caratteri minuscoli e maiuscoli: il testo inserito dall utente viene infatti convertito in minuscolo dalla funzione 26

PHP strtr. La seconda verifica che la parola (o la frase) inserita dall utente sia contenuta all interno del titolo della pubblicazione corrente. A dire il vero, il linguaggio XSLT mette a disposizione del programmatore la funzione lower-case(stringa) che converte in minuscolo la stringa di caratteri inserita nella lista dei parametri. Tuttavia, tale funzione non è stata utilizzata perché il processore XSLT presente nell ultima versione del PHP (5.0) sembra non supportarla. Proseguiamo con il successivo blocco di codice: if($opened_if) $last_if=$last_if."])=false\"> <p><b>nessun riscontro ottenuto con i parametri inseriti</b></p></xsl:if>"; $xsl_string=$xsl_string."<p><xsl:number value=\"position()\"/>."; $xsl_string=$xsl_string."<xsl:apply-templates select=\"title authors note "; if( isset($type) && isset($year) ) $xsl_string=$xsl_string.$type."[year='$year']\"/> </p>"; else if(isset($type)) $xsl_string=$xsl_string."$type\"/></p>"; else if(isset($year)) $xsl_string=$xsl_string."*[year='$year']\"/> </p>"; else $xsl_string=$xsl_string."article book inbook inproceedings thesis techport\"/></p>"; for($i=1;$i<=$if_counter;$i++) $xsl_string=$xsl_string."</xsl:if>"; $xsl_string=$xsl_string."</xsl:for-each>"; if($opened_if) $xsl_string=$xsl_string.$last_if; $xsl_string=$xsl_string.file_get_contents ("chiusura_xsl.txt"); La prima istruzione completa l if contenuto nella variabile $last_if di cui abbiamo già discusso. Subito dopo viene aperto il paragrafo che ospita il contenuto della entry corrente e viene aggiunto il costrutto apply-templates. Come anticipato, tale istruzione è accompagnata dall attributo select il cui contenuto dipende dalla richiesta dell utente. Più in particolare, al di là degli elementi title, authors e note presenti in ogni caso, il contenuto di select viene completato dai tre costrutti if-else che seguono. Il primo di questi controlla se le variabili $type e $year esistono (cioè se l utente ha 27

effettuato una ricerca che coinvolge una particolare tipologia e uno specifico anno di pubblicazione). Se questa condizione è soddisfatta, il completamento del valore dell attributo select è affidato alla stringa: $type."[year='$year']\"/> In altre parole vengono elaborati gli elementi: title, authors, note e il particolare tipo di pubblicazione che soddisfa la richiesta dell utente. I due if successivi gestiscono eventuali ricerche riguardanti una particolare tipologia o uno specifico anno di pubblicazione (rispettivamente). L istruzione contenuta all interno del terzo if fa uso del carattere * che viene interpretato dal processore XSLT come qualunque nodo : stiamo cioè selezionando qualunque tipologia di pubblicazione il cui figlio year contiene un valore uguale a quello della variabile $year. Nel caso in cui i tre if dovessero fallire, perchè l utente non ha effettuato ricerche riguardanti la tipologia e/o l anno di pubblicazione, la pagina esegue l istruzione racchiusa all interno dell ultimo else che seleziona indistintamente tutte le tipologie di pubblicazione. A questo punto è opportuno spiegare per quale motivo i costrutti appena descritti non prendono in considerazione le altre chiavi di ricerca disponibili (author, key e free). Il trattamento speciale riservato a type e year è necessario perché, come abbiamo già detto, uno stesso lavoro può essere pubblicato in due o più modi diversi non necessariamente nello stesso anno. Un esempio chiarirà questo aspetto. Consideriamo l unica entry contenuta nel documento XML descritto nel quarto capitolo e ipotizziamo che l utente desideri soltanto gli articoli disponibili. Tale richiesta rende necessario un opportuno attributo select che impedisca la visualizzazione delle informazioni relative alla tipologia inbook. Un esempio analogo può essere fatto considerando l anno di pubblicazione piuttosto che il tipo di entry. L utilizzo delle altre chiavi di ricerca non causa invece questo genere di problemi. Proseguendo la descrizione del codice, osserviamo che, dopo la chiusura del paragrafo dedicato alla pubblicazione, un ciclo for chiude tutti i costrutti xsl:if eventualmente aperti dal precedente blocco di codice. Subito dopo, viene chiuso il costrutto xsl:for-each e, se la variabile $opened_if vale true (cioè se l utente ha effettuato una ricerca), viene aggiunto l if contenuto nella variabile $last_if. Infine, l ultima istruzione aggiunge la restante parte del foglio di stile contenuta nel file chiusura_xsl.txt. A questo punto è possibile definire un processore XSLT che effettui la trasformazione del documento XML in HTML: $xsl_file->loadxml($xsl_string); $proc=new XSLTProcessor(); $proc->importstylesheet($xsl_file); echo $proc->transformtoxml($xml_file); 28

?> Le istruzioni appena scritte utilizzano le funzioni descritte nel precedente capitolo ad eccezione della funzione loadxml. Quest ultima esegue un operazione del tutto simile alla funzione load con l unica differenza che il documento XML viene caricato da una stringa anziché da un file. 3. Risultato ottenuto Terminata la descrizione del codice, possiamo presentare il risultato ottenuto lato browser. Anticipiamo che le pagine realizzate presentano una grafica essenziale poiché la realizzazione di un estetica accattivante esula dagli obiettivi del progetto. L immagine seguente mostra la pagina ricerca.php che contiene il form utilizzato per le ricerche: Il link Elenco completo e il pulsante Cerca rimandano entrambi alla pagina xml_action.php che, come abbiamo visto, è in grado di distinguere 29

le due modalità di accesso. Supponiamo adesso che l utente abbia richiesto tutte le pubblicazioni che presentano come autore il prof. P. Prinetto. Dopo aver cliccato sul pulsante Cerca, xml_action.php provvederà a mostrare il seguente risultato: Infine, cliccando su uno dei titoli delle pubblicazioni, si accede alla pagina di dettaglio (dettaglio.php): 30

31

CAPITOLO VII CONCLUSIONI Il progetto che abbiamo esaminato aveva come obiettivi principali il rinnovamento della tecnologia utilizzata per realizzare la prima versione della sezione pubblicazioni del sito web www.cad.polito.it e la conservazione di tutte le funzionalità preesistenti. Entrambi gli obiettivi sono stati raggiunti ricorrendo a tecnologie di facile comprensione e impiego considerato anche l enorme quantitativo di informazione a riguardo disponibile in rete. L unica parte del progetto che richiede un minimo di familiarità con la programmazione informatica è quella riguardante il codice PHP che conferisce dinamicità al processo di costruzione del foglio di stile XSL. Un argomento che nel corso della trattazione non è stato affrontato riguarda le motivazioni che hanno determinato l impiego di un database gerarchico invece di una base di dati relazionale. Tale scelta è dovuta al fatto che la numerosità e la discrezionalità di alcuni campi appartenenti alle varie tipologie di pubblicazione renderebbe la formulazione di un modello relazionale eccessivamente elaborata. Concludiamo l elaborato anticipando un possibile sviluppo futuro del progetto: la creazione di un interfaccia automatica di inserimento che consenta di aggiungere una nuova pubblicazione al file publications.xml senza dover scrivere l intero codice. 32