Xslt
			
				
				
				
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
				
						
					posted @ giovedì 3 marzo 2005 13:27 | 
				
			 
	
			
				
				
				
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
				
						
					posted @ giovedì 3 marzo 2005 11:48 | 
				
			 
	
			
				
				
				
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
				
						
					posted @ venerdì 25 febbraio 2005 14:51 | 
				
			 
	
			
				
				
				
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 > $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 è...
				
						
					posted @ martedì 8 febbraio 2005 10:38 |