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 è certamente l'unica e forse nemmeno la migliore.

E' ovvio che sono ben accetti commenti ed eventuali suggerimenti. Pollice Su

powered by IMHO 1.2 with Emoticon Formatter

Print | posted on martedì 8 febbraio 2005 11:38

Copyright © Gabriele Gaggi

Design by Bartosz Brzezinski

Design by Phil Haack Based On A Design By Bartosz Brzezinski