Xslt

XSLT: reperire la data corrente

Come reperire la data corrente in Xslt? Come sempre quando vogliamo fare cose esoteriche in Xslt dobbiamo chiamare in soccorso Javascript: <msxsl:script language="JScript" implements-prefix="user"><![CDATA[function GetCurrentDate(){     var today = new Date();    var day   = today.getDate();    var month = today.getMonth() + 1;        if(day < 10)   day   = "0" + day;    if(month < 10) month = "0" + month;            return  day + "/" + month + "/"+ today.getFullYear();}]]></msxsl:script> A questo punto come sempre in Xslt scriviamo: <xsl:variable name="Data" select="user:GetCurrentDate()"/> E nella variabile $Data ci ritroviamo la data corrente. Da non dimenticare in testa all'xslt l'inclusione dei due namespace aggiuntivi: xmlns:msxsl="urn:schemas-microsoft-com:xslt"xmlns:user="urn:user-namespace-here" Google's Words: Current Date Xslt powered by IMHO 1.2 with Emoticon Formatter

XSLT: Il nodo esiste?

Come accertarsi dell'esistenza di uno specifico nodo: <xsl:choose>    <xsl:when test="NodeName">        Exists    </xsl:when>    <xsl:otherwise>        Not Exists    </xsl:otherwise></xsl:choose> Google's Words: Node exists xslt powered by IMHO 1.2 with Emoticon Formatter

Xslt: Righe di colore alternato in una tabella

Questa è banale ma ogni volta devo andare a riguardarmela. Inoltre avevo già scritto qualche cosa di analogo per reporting services, quindi ci stava bene anche per Xslt . Torniamo al problema: come alternare il colore delle righe di una tabella in Xslt? Prendiamo come esempio il solito xml: <?xml version="1.0" encoding="UTF-8"?><rubrica><persona>    <Nome>Mario</Nome>    <Cognome>Rossi</Cognome>    <Telefono>1213243252345</Telefono></persona><persona>    <Nome>Antonio</Nome>    <Cognome>Bianchi</Cognome>    <Telefono>1213243252345</Telefono></persona></rubrica> Ed ecco l'esempio in Xslt sfruttando il tag xsl:attribute: <xsl:stylesheet version="1.0"                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                 xmlns:xs="http://www.w3.org/2001/XMLSchema"><xsl:template match="/"><html>    <body>    <xsl:for-each select="//rubrica">    <table border="1">        <xsl:for-each select="persona">            <tr>            <xsl:attribute name="style">                <xsl:choose>                <xsl:when test="position() mod 2 = 0">                    background-color:silver;                </xsl:when>                <xsl:otherwise>                    background-color:#EFEFEF;                </xsl:otherwise>                </xsl:choose>            </xsl:attribute>                <td><xsl:value-of select="Nome" /></td>                <td><xsl:value-of select="Cognome" /></td>                <td><xsl:value-of select="Telefono" /></td>            </tr>        </xsl:for-each>    </table>    </xsl:for-each>    </body></html></xsl:template></xsl:stylesheet> That's all folks  Google's Words: alternate color odd even background-color xslt powered by IMHO 1.2 with Emoticon Formatter

Paginazione in Xslt

Supponiamo di avere l'esigenza di gestire la paginazione in fase di stampa attraverso un Xslt. Questo significa gestire il cambio pagina a seguito di un determinato numero di righe stampate. Per gestire questa funzionalità attraverso l'html dobbiamo utilizzare i fogli di stile per creare una classe che effettui il cambio pagina: @media print {.break {page-break-before:always;}} Qui viene il difficile: decidere quando è il momento di cambiare pagina. Dobbiamo utilizzare del javascript all'interno del nostro xslt che tenga traccia del numero di righe stampate: <msxsl:script language="JScript" implements-prefix="user"><![CDATA[    var counter = 0;    function resetCounter() {        counter = 0;        return true;    }    function incCounter(){        counter++        return true;    }    function getCounter(){        return counter;    }]]></msxsl:script> All'interno dell'xslt potremo prelevare/incrementare/resettare il contatore nel seguente modo: <xsl:variable name="counter"    select="user:getCounter()"/><xsl:variable name="incrementa" select="user:incCounter()"/><xsl:variable name="res"        select="user:resetCounter()"/> Quindi vediamo un esempio completo, l'xml da trasformare: <?xml version="1.0" encoding="UTF-8"?><rubrica><!-- Per verificare il corretto funzionamento della paginazione  -- creare più elementi persona --><persona>    <Nome>Mario</Nome>    <Cognome>Rossi</Cognome>    <Telefono>1213243252345</Telefono></persona></rubrica> L'xslt che gestisce la paginazione: <?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0"                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"                 xmlns:xs="http://www.w3.org/2001/XMLSchema"                  xmlns:msxsl="urn:schemas-microsoft-com:xslt"                xmlns:user="urn:user-namespace-here">                              <msxsl:script language="JScript" implements-prefix="user"><![CDATA[    var counter = 0;    function resetCounter() {        counter = 0;        return true;    }    function incCounter(){        counter++        return true;    }    function getCounter(){        return counter;    }]]></msxsl:script>        <xsl:variable name="RowForPage">40</xsl:variable><xsl:template match="/"><html>    <body>    <head><style>    @media print {.break {page-break-before:always;}}                </style></head>    <xsl:for-each select="//rubrica">    <table border="1">        <xsl:for-each select="persona">            <xsl:variable name="counter" select="user:getCounter()"/>            <xsl:if test="$counter &gt; $RowForPage">                <xsl:variable name="res" select="user:resetCounter()"/>                <xsl:text disable-output-escaping="yes">                <![CDATA[                    </table><div class="break"></div><table  border="1">                ]]>                                </xsl:text>                                                </xsl:if>            <tr><td><xsl:value-of select="Nome" /></td>                <td><xsl:value-of select="Cognome" /></td>                <td><xsl:value-of select="Telefono" /></td>            </tr>            <xsl:variable name="incrementa" select="user:incCounter()"/>        </xsl:for-each>    </table>    </xsl:for-each>    </body></html></xsl:template></xsl:stylesheet> Questa è la soluzione che ho trovato. Non è...

Copyright © Gabriele Gaggi

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski