2013-10-09 23 views
11

Sto utilizzando XSLT per generare report PDF. I miei requisiti sono di visualizzare il numero di pagina nel formato di Pagina N di N (ad esempio pagina 1 di 3) al piè di pagina del rapporto. Per i valori statici funziona bene e si ripete su ogni pagina. Poiché il numero totale di pagine nel report non è noto e cambia il tempo di esecuzione, quindi come realizzerò questa attività.Come visualizzare il numero di pagina (N of N) utilizzando xslt nel report PDF

Il mio codice XSLT snippet

<xsl:template name="footerall"> 
<xsl:variable name="maxwidth" select="7.07000" /> 
<fo:static-content flow-name="xsl-region-after"> 
<fo:block> 
<xsl:variable name="tablewidth29" select="$maxwidth * 1.00000" /> 
<xsl:variable name="sumcolumnwidths29" select="0.04167 + 1.56250 + 0.04167" /> 
<xsl:variable name="factor29"> 
<xsl:choose> 
<xsl:when 
test="$sumcolumnwidths29 &gt; 0.00000 and $sumcolumnwidths29 &gt; $tablewidth29"> 
<xsl:value-of select="$tablewidth29 div $sumcolumnwidths29" /> 
</xsl:when> 
<xsl:otherwise> 
<xsl:value-of select="1.000" /> 
</xsl:otherwise> 
</xsl:choose> 
</xsl:variable> 
<xsl:variable name="defaultcolumns29" select="1" /> 
<xsl:variable name="defaultcolumnwidth29"> 
<xsl:choose> 
<xsl:when test="$factor29 &lt; 1.000"> 
<xsl:value-of select="0.000" /> 
</xsl:when> 
<xsl:when test="$defaultcolumns29 &gt; 0"> 
<xsl:value-of 
select="($tablewidth29 - $sumcolumnwidths29) div $defaultcolumns29" /> 
</xsl:when> 
<xsl:otherwise> 
<xsl:value-of select="0.000" /> 
</xsl:otherwise> 
</xsl:choose> 
</xsl:variable> 
<xsl:variable name="columnwidth29_0" select="$defaultcolumnwidth29" /> 
<xsl:variable name="columnwidth29_1" select="1.56250 * $factor29" /> 
<fo:table width="{$tablewidth29}in" border-collapse="separate" 
border-separation="0.04167in" color="black" display-align="center"> 
<fo:table-column column-width="{$columnwidth29_0}in" /> 
<fo:table-column column-width="{$columnwidth29_1}in" /> 
<fo:table-body> 
<fo:table-row> 
<fo:table-cell number-columns-spanned="2" 
padding-top="0.00000in" padding-bottom="0.00000in" padding-left="0.00000in" 
padding-right="0.00000in"> 
<fo:block padding-top="1pt" padding-bottom="1pt"> 
<fo:block text-align="center" space-before.optimum="-8pt"> 
<fo:leader leader-length="100%" leader-pattern="rule" 
rule-thickness="1pt" color="black" /> 
</fo:block> 
</fo:block> 
</fo:table-cell> 
</fo:table-row> 
<fo:table-row> 
<fo:table-cell 
font-size="inherited-property-value(&apos;font-size&apos;) - 2pt" 
text-align="left" padding-top="0.00000in" padding-bottom="0.00000in" 
padding-left="0.00000in" padding-right="0.00000in"> 
<fo:block padding-top="1pt" padding-bottom="1pt"> 
<fo:inline font-family="Courier" font-size="10px"> 
<xsl:value-of select="$My XPath to varaible" /> 
</fo:inline> 
<fo:inline font-family="Courier" font-size="10px"> 
<xsl:text> - </xsl:text> 
<xsl:text>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</xsl:text> 
<xsl:text>Page 1 of 1</xsl:text> 
</fo:inline> 
<fo:inline font-family="Courier" font-size="10px"> 
<xsl:value-of select="$My XPath to varaible" /> 
</fo:inline> 
</fo:block> 
</fo:table-cell> 
<fo:table-cell 
font-size="inherited-property-value(&apos;font-size&apos;) - 2pt" 
text-align="right" padding-top="0.00000in" padding-bottom="0.00000in" 
padding-left="0.00000in" padding-right="0.00000in"> 
<fo:block padding-top="1pt" padding-bottom="1pt" /> 
</fo:table-cell> 
</fo:table-row> 
</fo:table-body> 
</fo:table> 
</fo:block> 
</fo:static-content> 
</xsl:template> 

mi sostituirà la stringa (Pagina 1 di 1) da una variabile, ma come gestire questo.

Per favore aiutatemi.

risposta

17

ho risolto il mio problema seguendo le istruzioni qui di seguito.

Mettere un oggetto di formattazione con un ID alla fine dell'area. È quindi possibile eseguire un blocco etichettato che appare nell'ultima pagina del documento. Ecco come il markup appare:

<fo:flow flow-name="xsl-region-body"> 
... Lots and lots of content here 
<fo:block id="TheVeryLastPage"> </fo:block> 
</fo:flow> 

il codice crea un blocco con un id di TheVeryLastPage (un valore che è improbabile che possa essere utilizzato da chiunque), e ora è possibile fare riferimento a questo id per ottenere il numero di pagina del ultima pagina del documento. Ecco come il contenuto della zona dovrebbe essere:

<fo:block text-align="end"> 
Page <fo:page-number/> of 
<fo:page-number-citation 
ref-id="TheVeryLastPage"/> 
</fo:block> 

When formati FOP questo markup, genera qualcosa come "Pagina 2 di 5".

mio URL di riferimento è: http://www.ibm.com/developerworks/xml/tutorials/x-xslfo2/section4.html

+3

Una soluzione migliore senza aggiungere un blocco vuoto è la risposta precedente finché si posiziona l'attributo ID referenziato su un oggetto che termina sull'ultima pagina (come fo: flusso nell'esempio). In questo modo hai fo: flow flow-name = "xsl-region-body" id = "documento" e quindi usi fo: page-number-citation-last ref-id = "document" –

6

È necessario aggiungere un attributo id all'elemento fo:page-sequence e quindi utilizzare un page-number-citation-last.

<xsl:text>Page </xsl:text> 
<fo:page-number-citation /> 
<xs:text> of </xsl:text> 
<fo:page-number-citation-last page-citation-strategy="all" ref-id="my-sequence-id"/> 

Vedi le specifiche: http://www.w3.org/TR/xslfo20/#fo_page-number-citation e http://www.w3.org/TR/xslfo20/#fo_page-number-citation-last

+0

errore di battitura Minore alla terza riga del codice di esempio. masche

+0

Pagina / per una versione funzionante. – Jan