i fogli di stile xsl – 2 –. selezioni multiple : serve per applicare una regola in modo...
TRANSCRIPT
I fogli di stile
XSL – 2 –
Selezioni multiple
<xsl:for-each>: serve per applicare una regola in modo ricorsivo a nodi figli dell’elemento contestuale. Attributo select obbligatorio
<xsl:value-of>: serve per selezionare a quali fra gli elementi selezionati da <xsl:for-each> si deve applicare la regola. Attributo select obbligatorio
Un esempio<?xml version="1.0"?><xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><xsl:output method="html" indent="yes" /><xsl:template match="/">
<html><head><title>Antologia</title></head><body> <xsl:apply-templates /></body></html></xsl:template><xsl:template match="titolo"><p><center><xsl:apply-templates /></center></p></xsl:template>
<xsl:template match="stanza"><xsl:for-each select="verso"> <xsl:value-of select="." /><br/></xsl:for-each><br/> </xsl:template>
</xsl:stylesheet>
Alternativa:<xsl:template match=“stanza"><xsl:apply-templates /><br/> </xsl:template>
<xsl:template match="verso"><xsl:apply-templates /><br/> </xsl:template>
Alternativa 2:<xsl:template match=“stanza|verso"><xsl:apply-templates /><br/> </xsl:template>
Nel dettaglio…<xsl:template match="stanza">
“stanza” nodo contestuale
<xsl:for-each select="verso"> “verso” figlio dell’elemento contestuale e nuovo nodo contestuale
<xsl:value-of select="." />”.” = tutti i nodi selezionati
<br/>a capo dopo un verso
</xsl:for-each><br/> riga vuota dopo una stanza
</xsl:template>
Selezionare nodi per l’attributo select:XPathDove:
<xsl:apply-templates> <xsl:for-each> <xsl:value-of> <xsl:when> <xsl:if> <xsl:sort> <xsl:copy-of> …
XPath Raccomandazione W3C (16 novembre
1999) Consta di espressioni Oltre a quelle viste per l’attributo match
consente di: Trovare nodi anche per padri/antenati e
fratelli del nodo contestuale. Restituire valori booleani, stringhe, valori
numerici.
Espressioni XPath: percorsi di locazione Un percorso di locazione è costituito da
passi di locazione separati da / o da // Locazioni:
Assolute: cominciano con / parte dal nodo radice
Es: “/verso” tutti gli elementi <verso> figli diretti dell’elemento radice
Relative: cominciano senza / parte dal nodo contestuale
Es: “verso” tutti gli elementi <verso> figli del nodo contestuale
Un passo di locazione è costituito da: un asse: esprime la relazione di parentela
del nodo da selezionare rispetto al nodo contestuale o all’elemento radice
un nodo test: il nodo di cui si vuole testare l’esistenza e a cui si vuole applicare una regola
zero o più predicati: una caratteristica del nodo selezionato
Esempiochild::verso[position() = 1]
child:: è l’asse (qui: figlio del nodo contestuale) verso è il nodo test (il nodo da selezionare) [position() =1] è il predicato (qui: il primo
elemento)
= “fra tutti gli elementi <verso> figli del nodo contestuale, selezionare il primo”
Tipi di Assi
Asse Sintassi abbreviata
ancestor
ancestor-or-self
attribute @
child nome_figlio
descendant
descendant-or-self //
following
following-sibling
namespace
parent ..
preceeding
preceding-sibling
self .
Esempi di assiEsempio Sintassi abbreviata
child::verso verso
child::* *
attribute::rima @rima
descendant::verso //verso
ancestor::stanza
ancestor-or-self::stanza
descendant-or-self::verso
self::verso
child::stanza/descendant::verso stanza//verso
/
/descendant::stanza
/descendant::stanza/child::verso //stanza/verso
self::* .
Esempio<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"><xsl:output method="html" indent="yes" /><xsl:template match="/">
<html><head><title>Antologia</title></head><body> <xsl:apply-templates /></body></html></xsl:template>
<xsl:template match="titolo"><p><center><xsl:apply-templates /></center></p></xsl:template>
<xsl:template match="stanza"><xsl:for-each select="child::verso"> <xsl:value-of select="self::*" /><br/></xsl:for-each><br/> </xsl:template></xsl:stylesheet> antologia4.xml
Visualizzare il teiHeader: la root<xsl:template match="/"><html>
<head><title> <xsl:apply-templates select="//titleStmt/title" /></title>
</head><body>
<xsl:apply-templates /></body>
</html></xsl:template>
Visualizzare il teiHeaderPossibilità 1: ogni elemento un template
<xsl:template match="fileDesc"><xsl:apply-templates select="titleStmt"/></xsl:template>
<xsl:template match="titleStmt"><xsl:apply-templates select="title | author" />
</xsl:template>
<xsl:template match="title"><h2><xsl:apply-templates /></h2>
</xsl:template>
<xsl:template match="author"><h3><xsl:apply-templates /></h3>
</xsl:template>
Visualizzare il teiHeaderPossibilità 2: un template unico
<xsl:template match="fileDesc"><h2>
<xsl:apply-templates select="titleStmt/title" /></h2><h3>
<xsl:apply-templates select="titleStmt/author" /></h3></xsl:template> fileDesc.xml
Gestire più entrate omogeneeEs:<change> <date>20 aprile 2004</date> <respStmt> <resp>Codifica a cura di</resp> <name>Elena Pierazzo</name> </respStmt> <item>Correzione della Codifica</item> </change><change> <date>15 aprile 2004</date> <respStmt> <resp>Codifica a cura di</resp> <name>Elena Pierazzo</name> </respStmt> <item>Codifica TEI Lite</item> </change>
Questo:<xsl:template match="revisionDesc"><h4>Storia del documento:</h4><ul>
<li><b><xsl:apply-templates select="change/date" /></b>: <xsl:apply-templates select="change/respStmt/resp" /> <xsl:text> </xsl:text> <xsl:apply-templates
select="change/respStmt/name"/> — <xsl:apply-templates select="change/item" /> </li>
</ul></xsl:template>
Dà prova.xml
<xsl:apply-templates/> in questo caso non va bene perché mettere ogni occorrenza del medesimo elemento una di seguito all’altra
<xsl:for-each>!
Invece quest’altro…<xsl:template match="revisionDesc"><h4>Storia del documento:</h4><ul><xsl:for-each select="change">
<li><b><xsl:value-of select="date" /></b>: <xsl:value-of select="respStmt/resp" /> <xsl:text> </xsl:text> <xsl:value-of select="respStmt/name" /> — <xsl:value-of
select="item" /></li>
</xsl:for-each></ul></xsl:template>
Dà prova2.xml!
<xsl:apply-templates> quando:1. Quando si vuole processare tutti i nodi
figlio allo stesso modo
<xsl:template match="/"><html><head></head><body> <xsl:apply-templates /></body></html></xsl:template>
<xsl:apply-templates> quando:2. Quando si vuole selezionare un particolare nodo figlio e si
vuole ignorare gli altri
<xsl:template match="fileDesc"><h2>
<xsl:apply-templates select="titleStmt/title" /></h2><h3>
<xsl:apply-templates select="titleStmt/author" /></h3><!-- manca respStmt --><p><b>Edizione pubblicata da:</b><xsl:apply-templates select="publicationStmt/publisher" /></p>
<xsl:apply-templates select="sourceDesc" /></xsl:template>
<xsl:apply-templates> quando:3. Quando si vuole selezionare i figli di un nodo e disporli in
ordine diverso rispetto a quello che hanno nel documento XML
<xsl:template match="fileDesc"><h3>
<xsl:apply-templates select="titleStmt/author" /></h3><h2>
<xsl:apply-templates select="titleStmt/title" /></h2>
<xsl:apply-templates select="sourceDesc" />
<p><b>Edizione pubblicata da:</b><xsl:apply-templates select="publicationStmt/publisher" /></p>
</xsl:template>
<xsl:apply-templates> quando:4. Quando si vuole richiamare un template definito
dopo
<xsl:template match="fileDesc"><h2>
<xsl:apply-templates select="titleStmt/title" /></h2><xsl:apply-templates select="sourceDesc" /></xsl:template>
<xsl:template match="sourceDesc"><xsl:for-each select="bibl"> <b>Fonte:</b><br /> <xsl:value-of select="author" /> <br /></xsl:for-each></xsl:template>
<xsl:for-each> quando: Quando si vuole processare tutte le istanze di un figlio di un
nodo separatamente e ricorsivamente
<xsl:template match="revisionDesc"><h4>Storia del documento:</h4><ul><xsl:for-each select="change"><li><b><xsl:value-of select="date" /></b>:<xsl:value-of select="respStmt/resp" /> <xsl:text> </xsl:text><xsl:value-of select="respStmt/name" /> —<xsl:value-of select="item" /></li>
</xsl:for-each></ul>
</xsl:template>
Perché questo non va:<xsl:template match="revisionDesc"><h4>Storia del documento:</h4><ul>
<li><b><xsl:apply-templates select="change/date" /></b>: <xsl:apply-templates select="change/respStmt/resp" /> <xsl:text> </xsl:text> <xsl:apply-templates select="change/respStmt/name"/> — <xsl:apply-templates select="change/item" /> </li>
</ul></xsl:template>
Nel dettaglio:<li><b><xsl:apply-templates select="change/date" /> prende tutte le <date>
all’interno di <change> e le mette una di seguito all’altra</b>: <xsl:apply-templates select="change/respStmt/resp" />prende tutte i <resp> all’interno di <change> e di <respStmt> e li mette uno
di seguito all’altro <xsl:text> </xsl:text> <xsl:apply-templates select="change/respStmt/name"/>prende tutte i <name> all’interno di <change> e di <respStmt> e li mette
uno di seguito all’altro — <xsl:apply-templates select="change/item" />prende tutte i <resp>
all’interno di <change> e li mette uno di seguito all’altro </li>
Esercizio 36
<xsl:element> <xsl:attribute><xsl:element>: crea un nuovo elemento
nell’output
<xsl:attribute>: crea un nuovo attributo per un elemento dichiarato
Esempio<xsl:template match=“/”><html><xsl:apply-templates/></html></xsl:template>
<xsl:template match="teiHeader"><table border='1‘><tr><td><xsl:apply-templates /></td></tr></table></xsl:template>
<xsl:template match=“/”><xsl:element name=“html”><xsl:apply-templates/><xsl:element></xsl:template>
<xsl:template match="teiHeader"><table><xsl:attribute
name=“border”>1</xsl:attribute><tr><td><xsl:apply-templates /></td></tr></table></xsl:template>
Inserire le immagini in un file TEI<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="es25.xsl"?><!DOCTYPE TEI.2 PUBLIC "-//TEI//DTD TEI Lite XML ver. 1//EN""c:/TEI-EMACS/xml/dtds/tei/teixlite.dtd" [
<!ENTITY mummie1.jpg SYSTEM "mummie1.jpg" NDATA JPEG><!ENTITY mummie2.jpg SYSTEM "mummie2.jpg" NDATA JPEG><!ENTITY mummie3.jpg SYSTEM "mummie3.jpg" NDATA JPEG><!ENTITY mummie4.jpg SYSTEM "mummie4.jpg" NDATA JPEG><!ENTITY mummie5.jpg SYSTEM "mummie5.jpg" NDATA JPEG>
]>
Elemento <figure>
<head type="numerale">XIV <figure entity="mummie1.jpg">
<figDesc>Pagina 1</figDesc> </figure></head>
Visualizzazione<xsl:template match="figure"><img><xsl:attribute name="src"><xsl:apply-templates select="@entity" /></xsl:attribute><xsl:attribute name="alt"><xsl:apply-templates select="figDesc" /></xsl:attribute><xsl:attribute name="border">0</xsl:attribute><xsl:attribute name="width">100%</xsl:attribute><xsl:attribute name="heigth">100%</xsl:attribute></img></xsl:template>
Risultato
<img src=“mummie1.jpg” alt=“Pagina 1” border=“0” width=“100%” height=“100%”>
mummie.xml
Visualizzare le note: il testo
<head type="descrittivo">DIALOGO DI <name>FEDERICO RUYSCH</name> E DELLE SUE
MUMMIE<note n="39" place="end">Vedi, tra gli altri, circa queste
famose mummie, che in linguaggio scientifico si direbbero preparazioni anatomiche, il
<bibl><author>Fontenelle</author> <title lang="fra">Eloge de <abbr expan="monsignore"
type="title">mons.</abbr> <name>Ruysch</name></title></bibl>.</note>
</head>
HTML da ottenere<h3>DIALOGO DI FEDERICO RUYSCH E DELLE SUE MUMMIE<sup><a href=“#39”>39</a></sup></h3>
<!-- qui tutto il testo -->
<div> <hr><p><a name=“39”><b>39.</b></a> Vedi, tra gli
altri…</p></div>
Il rimando…<xsl:template match="note"><sup><a><xsl:attribute name="href">#<xsl:apply-templates select="@n"/></xsl:attribute><xsl:apply-templates select="@n"/></a></sup></xsl:template>
…e il testo<xsl:template match="body"><body><xsl:apply-templates /><div><hr/><xsl:for-each select="//note"><p><a><xsl:attribute name="name"><xsl:value-of select="@n" /></xsl:attribute></a><b><xsl:value-of select="@n" />.</b><xsl:text> </xsl:text> <xsl:value-of select="." /></p></xsl:for-each></div></body></xsl:template> mumm 22xmlie
Attenzione: non usare due <body>!<xsl:template match="/"><html>
<head><title> <xsl:apply-templates select="//titleStmt/title" /></title>
</head><body>
<xsl:apply-templates /></body>
</html></xsl:template>
<xsl:template match="body"><body>
…</body></xsl:template>