XML: XSLT - Dipartimento di Scienze Ambientali, Informatica e
Transcript
XML: XSLT - Dipartimento di Scienze Ambientali, Informatica e
XML: Visualizzazione Per modificare la visualizzazione di un documento XML in un browser si possono usare i CSS (Cascade Style Sheet) come avviene abitualmente per HTML ed in particolare per XHTML. Per ciascun elemento del documento XML che si intende formattare occorre definire una regola del tipo: paragrafo { display: block; font-size: 12pt; text-align: left } Nel documento XML si inserisce un riferimento al CSS con un'apposita direttiva di elaborazione (processing instruction): <?xml-stylesheet type="text/css" href="CorsodiXML.css" ?> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: CSS ● ● ● I CSS mancano di alcune caratteristiche fondamentali in ambiti diversi dal Web. I CSS sono limitati all'ambito dei browser, e tale limitazione crea problemi per la presentazione di documenti su carta dove si richiedono maggiori funzionalità per l'impaginazione. Nei CSS non è prevista la possibilità di estrarre il valore degli attributi degli elementi in modo da poterli visualizzare (nell'esempio il titolo dell'articolo). Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSL Per risolvere questi problemi il W3C ha definito un'insieme di specifiche volte a gestire in maniera altamente flessibile la presentazione e la trasformazione di documenti XML: l'eXtensible Stylesheet Language (XSL). XSL è un insieme di tre linguaggi che forniscono gli strumenti per l'elaborazione e la presentazione di documenti XML in modo molto flessibile e si basa su tre meccanismi di base: ● ● ● un meccanismo per l'individuazione dei dati da presentare. un meccanismo per il controllo dell'elaborazione dei dati e di come la presentazione deve essere effettuata. un meccanismo per la definizione della formattazione da applicare ai dati per la presentazione vera e propria. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSL A ciascuno di questi tre meccanismi, XSL associa uno specifico linguaggio: ● ● ● XPath consente di individuare gli elementi e gli attributi di un documento XML sui quali verranno applicate le operazioni necessarie per la presentazione dei dati XSLT (XSL transformation) consente di controllare le operazioni che rendono i dati presentabili XSL-FO (XSL Formatting Objects) definisce un insieme di tag di formattazione Questa suddivisione dei compiti nel processo di presentazione è il punto di forza di XSL e ne garantisce la flessibilità. Infatti, questi tre linguaggi non sono strettamente dipendenti l'uno dall'altro. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSL La presentazione dei dati racchiusi in un documento XML è basata su due elementi: ● ● un documento che descrive come i dati devono essere elaborati per la presentazione, chiamato foglio di stile XSLT un componente software, chiamato processore XSLT, in grado di prendere in input un documento XML e un foglio di stile XSLT e di produrre in output i dati secondo il formato di presentazione prescelto (XSL-FO, XHTML, testo, ecc.) La definizione di un foglio di stile XSLT è quindi il punto cruciale della presentazione dei dati XML, individuare gli elementi di un documento XML rappresenta il primo passo di un'elaborazione per la presentazione dei dati. Nei CSS questo ruolo è svolto dal selettore, cioè l'elemento sintattico di una regola CSS che individua gli elementi da formattare. Abbiamo visto come Xpath sia molto più potente e flessibile di CSS. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT Nella terminologia di XSLT, il documento da trasformare è chiamato source document (documento origine), mentre il documento generato dal processo di trasformazione è chiamato result document (documento risultante). Il documento risultante di una trasformazione XSLT può essere un documento XML o un documento di altro tipo. Ad esempio, a partire da un documento XML possiamo generare un documento HTML, PDF, RTF o altri formati testuali. La trasformazione avviene in base alle informazioni contenute in un particolare tipo di documento e interpretate da un processore XSLT. Questo documento di trasformazione, chiamato foglio di stile XSLT, non è altro che un documento XML che fa uso di tag appartenenti alla grammatica di XSLT in grado di controllare il processo di trasformazione. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/transorm"> ... template di trasformazione ... </xsl:stylesheet> XSLT consente di ● ● trasformare ciascun elemento del documento XML di origine in un altro elemento del formato del documento risultante aggiungere al documento risultante elementi completamente nuovi ● non considerare particolari elementi del documento origine ● riordinare gli elementi ● ● fare elaborazioni in base al risultato di determinate condizioni etc etc Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT Le espressioni XPath individuano gli elementi del documento origine sui quali viene applicato un template (o modello) di trasformazione. Da un punto di vista sintattico, un template è un elemento del linguaggio XSLT che ha la seguente forma di base: <xsl:template match="espressione XPath"> ... Definizione dell'output... </xsl:template> Un template XSLT individua un elemento o un insieme di elementi di un documento XML sfruttando un'espressione XPath e vi applica una serie di elaborazioni per ottenere un output. Per fare una analogia con i CSS, un template corrisponde approssimativamente ad una regola CSS. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT Un documento XSLT è a tutti gli effetti un documento XML ben formato. ● ● Un Prologo XML Un unico Elemento Radice (ovvero il nodo principale) che contiene tutti gli altri nodi del documento. Nel caso dell'XSLT l'Elemento Radice è obbligatoriamente di questo tipo: <xsl:stylesheet version="1.0" xmlns:xsl=" http://www.w3.org/1999/XSL/Transform"> <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> ● All'interno del documento tutti i TAG devono essere chiusi Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT - dichiarativo XSLT è un linguaggio di tipo dichiarativo a differenza di altri linguaggi (JavaScript, Java, C, php etc...) che sono di tipo imperativo. In un linguaggio imperativo, il programmatore scrive cosa deve essere fatto, ma soprattutto esattamente come deve essere fatto. In un linguaggio dichiarativo, il programmatore scrive solo cosa deve essere fatto. XSLT in quanto dichiarativo non soffre di possibili effetti collaterali (side effects) Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT - dichiarativo XSLT è una W3C Recommendation del 16 Novembre 1999 Attualmente è implementato nei browser più diffusi: ● ● Firefox supporta XML, CSS e XSLT Mozilla utilizza Expat come parser per XMLe supporta XML e CSS; ne esiste una versione con l'implementazione di XSLT ● Netscape, dalla versione 8, utilizza il motore di Mozilla ● Opera, dalla versione 9, supporta XML, CSS e XSLT ● MS Internet Explorer, dalla versione 6, supporta XML, CSS e XSLT Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT TOP-LEVEL elements (elementi figli diretti di <xsl:stylesheet>): xsl:import (modifica il document tree, deve stare per primo) xsl:include (inclusione) xsl:strip-space (rimuove nodi di soli spazi) xsl:preserve-space (mantiene ogni spazio nei contenuti) xsl:output xsl:key xsl:decimal-format xsl:namespace-alias xsl:attribute-set xsl:variable xsl:param xsl:template Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:template> <xsl:template match="XPath pattern" name="template name" priority="number" mode="mode name"> PRIORITA' <xsl:template match="item"> <xsl:template match="order/item"> Un template più specifico ha una maggiore priorità rispetto ad uno meno specifico. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:apply-templates> <xsl:apply-templates select="XPath expression" mode="mode name"> Utilizzato all'interno di un template per richiamare altri template. (esempio: simple1.xml, simple1.xslt) <xsl:value-of> <xsl:value-of select="XPath expression" disable-output-escaping="yes or no"/> (default no) Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT Ad esempio: <xsl:value-of select="customer/@id"> inserisce il valore dell'attributo id dell'elemento <customer> <xsl:value-of select="."> inserisce il contenuto del context node nell'output (esempio: simple2.xml, simple2.xslt) Il valore dell'attributo disable-output-escaping permette di inviare in output “&” al posto di & etc... Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:output> (permette di definire il tipo di output) <xsl:output method="xml or html or text" version="version" encoding="encoding" omit-xml-declaration="yes or no" standalone="yes or no" cdata-section-elements="CDATA sections" (customer) indent="yes or no"/> <customer>A&P</customer> -> <customer><![CDATA[A&P]]></customer> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:element> (permette la creazione dinamica di elementi) <xsl:element name="element name" use-attribute-sets="attribute set names" namespace="namespace URI"> <xsl:element name="pippo">testo</xsl:element> <pippo>testo</pippo> <xsl:element name="{.}">testo</xsl:element> <name>Alessandro</name> -> <Alessandro>testo</Alessandro> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:attribute> / <xsl:attribute-set> (permette la creazione dinamica di attributi) <xsl:attribute name="attribute name" namespace="namespace URI"> <name><xsl:attribute name="id">123</xsl:attribute>Alessandro</name> -> <name id="123">Alessandro</name> COSA AVVIENE IN QUESTO CASO? <name><xsl:attribute name="{.}">123</xsl:attribute>Alessandro</name> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:text> (permette inserimento di testo PCDATA) <xsl:text disable-output-escaping="yes or no"> Preserva tutti gli spazi ed è possibile disabilitare l'output escaping <xsl:text disable-output-escaping="yes">6 is < 7 & 7 > 6</xsl:text> -> 6 is < 7 & 7 > 6 <xsl:value-of select="'John'"/> <xsl:value-of select="'Fitzgerald Johansen'"/> <xsl:value-of select="'Doe'"/> -> JohnFitzgerald JohansenDoe Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT TEMPLATE di DEFAULT NODI E ROOT <xsl:template match="*|/"> <xsl:apply-templates/> </xsl:template> TESTO E ATTRIBUTI <xsl:template match="text()|@*"> <xsl:value-of select="."/> </xsl:template> PIs E COMMENTI <xsl:template match="processing-instruction()|comment()"/> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:if> / <xsl:choose> (istruzioni condizionali) <xsl:if test="Boolean expression"> <xsl:choose> <xsl:when test="Boolean expression"> <xsl:when test="Boolean expression"> <xsl:otherwise> </xsl:choose> ● Valore numerico: 0 = false, altro valore (+ o -) = true. ● Valore stringa: (strlen > 0) = true ● Node set: non vuoto = true Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:if test="name">Name encountered.</xsl:if> E' da notare che <xsl:if> non modifica il context node, come invece fa template match!!! Anche se l'espressione XPath restituisce true, e vengono valutate le istruzioni interne a <xsl:if>, il context node rimane quello precedente alla valutazione dell'espressione booleana. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:choose> <xsl:when test="salary[number(.) > 2000]">A big number</xsl:when> <xsl:when test="salary[number(.) > 1000]">A medium number</xsl:when> <xsl:otherwise>A small number</xsl:otherwise> </xsl:choose> OTHERWISE Un numero <= 1000 Potrebbe non esserci il nodo <number> <number> potrebbe contenere una stringa non valutabile ad un numero (“John”) -> NaN -> false Il break è automatico, ovvero viene valutata solo la prima istruzione. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:for-each> (per ogni) <xsl:for-each select="XPath expression"> Forma un template all'inteno di un template, quindi essendo un template vero e proprio, va a modificare il context node!!! <names> <name> <first>John</first> <last>Doe</last> </name> <name> <first>Jane</first> <last>Smith</last> </name> <xsl:template match="names"> <xsl:for-each select="name"> <P><xsl:value-of select="first"/></P> </xsl:for-each> </xsl:template> </names> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:copy-of> (copia) <xsl:copy-of select="XPath expression"/> Copia dal source tree nel result tree quanto identificato dall'espressione Xpath. Anche i figli e gli attributi vengono copiati. <xsl:copy> (copia) <xsl:copy use-attribute-sets="att set names"> Copia dal source tree nel result tree solo il context node. I figli e gli attributi NON vengono copiati. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:sort> (permette l'ordinamento) <xsl:sort select="XPath expression" lang="lang" data-type="text or number" order="ascending or descending" (default ascending) case-order="upper-first or lower-first"/> T: 1, 10, 11, 5 1 – 10 – 5 – 11 N: 1, 5, 10, 11 U: A, a, B, b A–B–a–b L: a, A, b, B Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT MODES – MODALITA' <xsl:apply-templates select="name" mode="TOC"/> <xsl:template match="name" mode="TOC"/> <xsl:template match="name" mode="body"/> <xsl:template match="name"/> I Mode sono comodi quando è necessario processare la stessa sezione XML più di una volta. Si possono creare più template e “chiamare” solamente quello che si vuole applicare. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:variable> (definizione di variabile) <xsl:variable name="PI">3.14</xsl:variable> La variabile può essere utlizzata in una espressione XPath. <math pi="{$PI}"/> oppure <xsl:value-of select="$PI"/> Le variabili possono contenere non solo valori ma anche XML markup o elementi XSLT. Le variabili NON possono fare riferimento a sé stesse e NON sono ammessi nemmeno riferimenti circolari. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT AUTO RIFERIMENTO <xsl:variable name="name"> <name><xsl:value-of select="$name"/></name> </xsl:variable> RIFERIMENTO CIRCOLARE <xsl:variable name="A"> <b><xsl:value-of select="$B"/></b> </xsl:variable> <xsl:variable name="B"> <a><xsl:value-of select="$A"/></a> </xsl:variable> Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:variable> può avere l'attributo 'select', in modo da avere il valore della variabile come risultato dell'espressione Xpath valore dell'attributo: <xsl:variable name="name" select="/people/name"/> Se si utilizza l'attributo 'select', non è ammesso contenuto! Il valore della variabile è fissato, significa che NON è possibile modificarlo dopo la sua dichiarazione (no side effects). Per fare un raffronto con i linguaggi imperativi, è meglio pensare alle variabili XSLT come a delle costanti più che a “vere e proprie” variabili. Inoltre quando si parla di variabili si deve sempre considerare il loro “scope”. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <xsl:variable name="age">30</xsl:variable> <xsl:template match="/"> <xsl:variable name="name">Fred</xsl:variable> <xsl:value-of select="concat($name, ' is ', $age)"/> </xsl:template> </xsl:stylesheet> Fred is 30 La variabile $age è globale, in quanto definita fuori da qualsiasi template, quindi accessibile in ogni parte dello stylesheet; $name è locale, in quanto definita all'interno di un template, quindi accessibile solo all'interno di quel template. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari XML: XSLT <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" encoding="UTF-8"/> <xsl:variable name="name">Fred</xsl:variable> <xsl:template match="/"> <xsl:variable name="name">Barney</xsl:variable> <xsl:value-of select="$name"/> </xsl:template> </xsl:stylesheet> Barney Quale variabile viene utilizzata? Viene utilizzata la variabile con il binding più restrittivo. $name "Fred" è globale e $name "Barney" è locale al template, quindi viene utilizzata la seconda. Alessandro Sorato - Linguaggi per la rete: XML – Dipartimento di Informatica – Università di Venezia Ca' Foscari