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