Capitolo IV: Ampliare i documenti XML |
Utilizzo dei modelli Un foglio di stile comprende uno o più modelli che a loro volta contengono dei pattern. I modelli forniscono la struttura dei documenti generati dal codice. Gli elementi generati possono essere di qualsiasi tipo, poiché non è necessario che i modelli XSL contengano riferimenti ai dati XML. La reale potenzialità dei fogli di stile consiste nel generare dati XML in nuovi documenti. I modelli XSL fanno riferimento ai dati XML mediante i pattern. PATTERN Il linguaggio XSL utilizza i pattern per specificare gli elementi XML a cui viene applicato il modello XSL. Questo metodo di corrispondenza dei pattern rende XSL un linguaggio di dichiarazioni in contrapposizione con i linguaggi basati sulle procedure. Questo significa che i pattern definiscono il "livello" specifico della struttura del documento da far corrispondere identificandone la gerarchia della struttura. Per avere unidea della struttura di un modello, sarà sufficiente prendere in esame un semplice foglio di stile. Sarà quindi necessario creare un documento XML a cui applicare il foglio di stile: <CATALOG> <PLANT> <COMMON>Bloodroot</COMMON> <BOTANICAL>Sanguinaria canadensis</BOTANICAL> <ZONE>4</ZONE> <LIGHT>Mostly Shady</LIGHT> <PRICE>$7.05</PRICE> <AVAILABILITY USONLY="true">02/01/99</AVAILABILITY> </PLANT> </CATALOG> Quindi procedere con la creazione di un foglio di stile XSL per un unico modello dellelemento Common: <?xml version="1.0"?> <xsl:template xmlns:xsl="uri:xsl"> <HTML> <BODY> <xsl:repeat for="CATALOG/PLANT"> <DIV> <SPAN STYLE="font-weight:bold; font-size:20"> <xsl:get-value for="COMMON"/> </SPAN> </DIV> </xsl:repeat> </BODY> </HTML> </xsl:template> Quando il documento XML viene elaborato con il foglio di stile XSL, lelaboratore genera il seguente codice HTML: <HTML> <BODY> <DIV> <SPAN STYLE="font-weight:bold; font-size:20"> Bloodroot </SPAN> </DIV> </BODY> </HTML> ANALISI DEL MODELLO Ogni modello comprende uno o più pattern. Lesempio che segue riporta la sezione che contiene due pattern: <xsl:repeat for="CATALOG/PLANT"> <DIV> <SPAN STYLE="font-weight:bold; font-size:20"> <xsl:get-value for="COMMON"/> </SPAN> </DIV> </xsl:repeat> Il primo pattern specifica qualsiasi elemento Plant secondario allelemento Catalog. Il secondo pattern per questa regola specifica lelemento Common. In base alla regola, qualsiasi dato trovato nellelemento del pattern verrà inserito nellelemento Span a cui viene quindi applicato lo stile "font-weight:bold; font-size:20". Questo modello espresso in modo discorsivo, sarebbe formulato nel seguente modo: "Ripetere quanto segue per ogni elemento Plant secondario dellelemento Catalog: prendere il valore dellelemento Common e inserirlo nellelemento Span applicando il grassetto e una dimensione di carattere pari a 20". Il modello viene applicato a ogni elemento che risponda al pattern o ai criteri definiti in esso. Questa è una delle potenzialità del linguaggio XSL. Utilizzando le funzionalità di pattern matching, o corrispondenza dei pattern, del linguaggio XSL, è possibile riorganizzare in modo efficiente i dati XML, per soddisfare esigenze precise. Se non si desidera includere uno o più elementi nel risultato finale, sarà sufficiente escludere il pattern relativo a tali elementi. Se invece si desidera includere un unico elemento in una sezione specifica del documento, è possibile creare un pattern dettagliato per convertirlo per la visualizzazione. STRUTTURA A MODELLO SINGOLO Il modello inizia con il tag <xsl:template xmlns:xsl="uri:xsl"> e termina con il tag </xsl:template>. Questi due tag, o contenitori, facilitano lapplicazione di diverse sezioni del foglio di stile quando vengono utilizzati più modelli. Dal momento che questo foglio di stile contiene un solo modello, è possibile utilizzare anche il contenitore <xsl:document> </xsl:document>. Ad esempio il foglio di stile seguente equivale a quello precedente: <?xml version="1.0"?> <xsl:document xmlns:xsl="uri:xsl"> <HTML> <BODY> <xsl:repeat for="CATALOG/PLANT"> <DIV> <SPAN STYLE="font-weight:bold; font-size:20"> <xsl:get-value for="COMMON"/> </SPAN> </DIV> </xsl:repeat> </BODY> </HTML> </xsl:document> Ambedue i fogli di stile sono esempi di una struttura a modello singolo, ossia ciascuno dei due fogli di stile è costituito da un unico modello. Ma un foglio di stile può avere anche una struttura a più modelli, nella quale il foglio di stile contiene più modelli che possono essere applicati indipendentemente dagli altri. STRUTTURA A PIU MODELLI Un foglio di stile a più modelli utilizza i tag <xsl:stylesheet> </xsl:stylesheet>, che a loro volta possono contenere diverse coppie di tag <xsl:template> </xsl:template>. Ciascuna di queste coppie può essere applicata indipendentemente dalle altre. Nellesempio che segue è possibile esaminare in modo più approfondito questa struttura: <CATALOG> <PLANT BESTSELLER="no"> <NAME> <COMMON>Bloodroot</COMMON> <BOTAN>Sanguinaria canadensis</BOTAN> </NAME> <GROWTH> <ZONE>4</ZONE> <LIGHT>Mostly Shady</LIGHT> </GROWTH> <SALESINFO> <PRICE>$3.00</PRICE> <AVAILABILITY>4/21/99</AVAILABILITY> </SALESINFO> </PLANT> <PLANT BESTSELLER="yes"> <NAME> <COMMON>Columbine</COMMON> <BOTAN>Aquilegia canadensis</BOTAN> </NAME> <GROWTH> <ZONE>3</ZONE> <LIGHT>Mostly Shady</LIGHT> </GROWTH> <SALESINFO> <PRICE>$9.00</PRICE> <AVAILABILITY>4/10/99</AVAILABILITY> </SALESINFO> </PLANT> <PLANT BESTSELLER="no"> <NAME> <COMMON>Marsh Marigold</COMMON> <BOTAN>Caltha palustris</BOTAN> </NAME> <GROWTH> <ZONE>4</ZONE> <LIGHT>Mostly Sunny</LIGHT> </GROWTH> <SALESINFO> <PRICE>$9.00</PRICE> <AVAILABILITY>4/19/99</AVAILABILITY> </SALESINFO> </PLANT> </CATALOG> Nel listato seguente è riportato il foglio di stile dellesempio precedente, il quale contiene diversi modelli che vengono applicati in modo indipendente alle diverse sezioni del documento XML: <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="uri:xsl"> <xsl:template match="/"> <HTML> <BODY> <TABLE BORDER="1"> <TR STYLE="font-weight:bold"> <TD>Common Name</TD> <TD>Botanical Name</TD> <TD>Zone</TD> <TD>Light</TD> <TD>Price</TD> <TD>Availability</TD> </TR> <xsl:for-each select="CATALOG/PLANT"> <TR> <xsl:apply-templates/> </TR> </xsl:for-each> </TABLE> </BODY> </HTML> </xsl:template> <xsl:template match="NAME"> <TD><xsl:value-of select="COMMON"/></TD> <TD><xsl:value-of select="BOTAN"/></TD> </xsl:template> <xsl:template match="GROWTH"> <TD><xsl:value-of select="ZONE"/></TD> <TD><xsl:value-of select="LIGHT"/></TD> </xsl:template> <xsl:template match="SALESINFO"> <TD><xsl:value-of select="PRICE"/></TD> <TD><xsl:value-of select="AVAILABILITY"/></TD> </xsl:template> </xsl:stylesheet> Il foglio di stile inizia con il tag <xsl:stylesheet> e termina con il tag </xsl:stylesheet>. La sigla xmlns è una parola riservata e serve per identificare un particolare namespace; ad esempio in questo caso tutte le parole riservate che iniziano con xsl: fanno parte del vocabolario individuato dallURL htttp://www.w3.org/TR/WD-xsl. Dal momento che il documento XML può avere un solo elemento principale e che lXSL è un profilo di XML, il solo elemento xsl:stylesheet consente di includere più elementi xsl:template nel foglio di stile. Il pattern di questo modello è semplicemente "/" e definisce lelemento principale del documento XML. E presente anche lelemento xsl:for-each allinterno del modello, che definisce un altro pattern, CATALOG/PLANT, e stabilisce che la struttura generata che segue deve essere applicata a ogni sezione corrispondente al pattern. Allinterno di tale struttura è contenuto lelemento xsl:apply-templates che avvia la ricerca da parte dellelaboratore di altri modelli nel foglio di stile, ciascuno con il suo pattern. Poiché lelemento xsl:apply-templates si trova allinterno del pattern CATALOG/PLANT, gli altri modelli verranno applicati solo quando verrà trovata una corrispondenza allinterno dellelemento. Ad esempio, il modello NAME verrà applicato solo agli elementi nella gerarchia CATALOG/PLANT/NAME. Facciamo una sintesi di quanto visto fino ad ora. Il linguaggio XSL trasforma lXML in elementi di output. Questi elementi di output vengono tipicamente utilizzati per preparare i dati per la visualizzazione applicando formattazione ai dati XML, ma questo non ne costituisce lunico utilizzo possibile. Questa trasformazione avviene in questa sequenza:
|