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 |