370 likes | 502 Views
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
E N D
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
<?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> Un esempio
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:XPath Dove: • <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
Esempio child::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”
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 teiHeader Possibilità 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 teiHeader Possibilità 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 omogenee Es: <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: • 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
<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> Esempio
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> mummie2.xml
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>