web-dev-qa-db-ja.com

PDFレポートでxsltを使用してページ番号(N / N)を表示する方法

XSLTを使用してPDFレポートを生成しています。私の要件は、レポートのフッターにページN/N(例:ページ1/3)の形式でページ番号を表示することです。静的な値の場合レポート内の合計ページ数は不明であり、実行時間を変更するため、このタスクをどのように実行するかを説明します。

私のXSLTコードスニペット

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

文字列(1/1ページ)を変数に置き換えますが、これをどのように処理するかを説明します。

私を助けてください。

14
sns

以下の手順で問題を解決しました。

エリアの最後にIDのあるフォーマットオブジェクトを配置します。次に、ドキュメントの最後のページに表示されるラベル付きブロックに対してaを実行できます。マークアップは次のようになります。

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

コードは、TheVeryLastPage(誰も使用する可能性が低い値)のIDを持つブロックを作成し、そのIDを参照して、ドキュメントの最後のページのページ番号を取得できます。エリア内のコンテンツは次のようになります。

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

FOPがこのマークアップをフォーマットすると、「Page 2 of 5」のようなものが生成されます。

私の参照URLは http://www.ibm.com/developerworks/xml/tutorials/x-xslfo2/section4.html

22
sns

id属性をfo:page-sequence要素に追加してから、page-number-citation-lastを使用する必要があります。

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

仕様を参照してください: http://www.w3.org/TR/xslfo20/#fo_page-number-citation および http://www.w3.org/TR/xslfo20/ #fo_page-number-citation-last

9
glmxndr