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 è certamente
l'unica e forse nemmeno la migliore.
E' ovvio che sono ben accetti commenti ed eventuali suggerimenti.
powered by IMHO 1.2 with Emoticon Formatter