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 &amp; 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&amp;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 &lt; 7 &amp; 7 &gt;
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(.) &gt; 2000]">A big
number</xsl:when>
<xsl:when test="salary[number(.) &gt; 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