2013-10-09 12 views
11

Ich verwende XSLT, um einen PDF-Bericht zu erstellen. Meine Anforderungen bestehen darin, die Seitenzahl in dem Format der Seite N von N (z. B. Seite 1 von 3) in der Fußzeile des Berichts anzuzeigen. Für statische Werte funktioniert es gut und es wiederholt sich auf jeder Seite. Da die Gesamtzahl der Seiten im Bericht nicht bekannt ist und die Laufzeit ändert, werde ich diese Aufgabe erledigen.So zeigen Sie die Seitenzahl (N von N) mithilfe von XSLT im PDF-Bericht an

Mein XSLT-Code-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> 

Ich werde die Saite (Seite 1 von 1) durch eine Variable ersetzen, sondern wie diese zu behandeln.

Bitte helfen Sie mir.

Antwort

17

ich mein Problem gelöst, indem unten folgen.

Setzen Sie ein Formatierungsobjekt mit einer ID am Ende des Bereichs. Sie können dann den markierten Block auf der letzten Seite des Dokuments bearbeiten. Hier ist, wie das Markup aussieht:

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

Der Code einen Block mit der ID TheVeryLastPage erzeugt (ein Wert, der unwahrscheinlich ist, von jedermann verwendet werden), und jetzt können Sie auf diese ID beziehen sich auf die Seitenzahl, der erhalten letzte Seite des Dokuments. Hier ist, wie der Inhalt im Bereich aussehen sollte:

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

Wenn FOP Formate dieses Markup, erzeugt es so etwas wie „Seite 2 von 5“.

Meine Referenz-URL ist: http://www.ibm.com/developerworks/xml/tutorials/x-xslfo2/section4.html

+3

Eine bessere Lösung, ohne einen leeren Block hinzuzufügen, ist die vorherige Antwort, solange Sie das ID-Attribut, auf das auf ein Objekt verwiesen wird, das auf der letzten Seite endet (z. B. fo: flow in Ihrem Beispiel). Auf diese Weise hast du: flow flow-name = "xsl-region-body" id = "document" und dann fo: page-number-citation-last ref-id = "document" –

6

Sie sollten ein id Attribut zu Ihrem fo:page-sequence Element hinzufügen und dann ein page-number-citation-last verwenden.

<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"/> 

Siehe die Spezifikationen: http://www.w3.org/TR/xslfo20/#fo_page-number-citation und http://www.w3.org/TR/xslfo20/#fo_page-number-citation-last

+0

Minor Tippfehler in der dritten Zeile in dem Beispielcode. masche

+0

Seite / für eine funktionierende Version. – Jan

Verwandte Themen