Генерировать PDF из XML количество страниц неправильно - PullRequest
0 голосов
/ 08 мая 2018

Генерирую PDF из XML, все идет хорошо, как и ожидалось, проблема в том, что он генерирует одну дополнительную страницу.

Я подробно объяснил проблему ниже.

Номер страницы идет неправильно. Если у меня есть 20 строк в таблице, и я показываю 5 строк на странице (с верхним и нижним колонтитулами). Таким образом, он должен сгенерировать 4 страницы, а не 5 страниц PDF, а последняя страница имеет только заголовок и нижний колонтитул, что неверно.

Пожалуйста, найдите мой код таблицы стилей XSL ниже

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:js="urn:extra-functions">
    <xsl:output method="html" indent="yes"/>
    <xsl:template match="Data">
            <html>
                <head>
                    <title>Invoice</title>
            </head>


                <body>

                    <xsl:call-template name="Filler">
                        <xsl:with-param name="fillercount" select="1" />
                    </xsl:call-template>


                    <xsl:copy-of select="$OrderHeader"/>


                    <xsl:copy-of select="$OrderRowsHeader"/>

                    <xsl:for-each select="Order/OrderRows/OrderRow">

                        <table class="tabledetails" cellspacing="0" style="table-layout:fixed">
                            <tr>
                                <td class="tdmargin" />
                                <td style="width:70px" align="right" class="blueline">
                                    <xsl:value-of select="ProductID" />
                                    <xsl:value-of select="translate(' ', ' ', '&#160;')"/>
                                </td>

                                <td class="tdmargin" />
                            </tr>
                        </table>
                        <xsl:if test="(position() mod 40) = 0 ">
                            <!--40 rows per page-->
                            <xsl:call-template name="Filler">
                                <xsl:with-param name="fillercount" select="1" />
                            </xsl:call-template>

                            <br class="pagebreak" /> <br />

                            <xsl:copy-of select="$ReportHeader" />



                            <xsl:copy-of select="$OrderRecipient"/>

                            <xsl:call-template name="Filler">
                                <xsl:with-param name="fillercount" select="1" />
                            </xsl:call-template>

                            <xsl:copy-of select="$OrderHeader"/>



                            <xsl:copy-of select="$OrderRowsHeader"/>

                        </xsl:if>
                    </xsl:for-each>
                  <!--Filler -->
                <xsl:choose>
                    <!-- case of only one page-->
                    <xsl:when test="count(delivery_receipt/order_items) &lt;= 5">
                        <xsl:call-template name="Filler">
                            <xsl:with-param name="fillercount" select="5 - (count(delivery_receipt/order_items))"/>
                        </xsl:call-template>
                    </xsl:when>
                    <!-- case of more than one page-->
                    <xsl:otherwise>
                        <xsl:call-template name="Filler">
                            <!--(Rows per page = 5) -  (Rows in current page) - (Total section rows = 1 ) + (Filler Row = 1)-->
                            <xsl:with-param name="fillercount" select="5 - ( ( count(delivery_receipt/order_items)-5 ) mod 5 ) - 3 + 1"/>
                        </xsl:call-template>
                    </xsl:otherwise>
                </xsl:choose>
                <!--End Filler -->

                </body>
            </html>


        </xsl:template>
    <!-- variable OrderHeader-->
    <xsl:variable name="OrderHeader">
        <table class="tabledetails" cellspacing="0" >
            <tr>
                <td class="tdmargin" />
                <th>
                    Order ID:
                </th>

                <td class="tdmargin" />
            </tr>
            <tr>
                <td class="tdmargin" />
                <td class="tdorderHeader">
                    <xsl:value-of select="/Data/Order/OrderID" />
                    <xsl:value-of select="translate(' ', ' ', '&#160;')"/>
                </td>

                <td class="tdmargin" />
            </tr>
        </table>
    </xsl:variable>

    <!--variable OrderRowsHeader-->
    <xsl:variable name="OrderRowsHeader">
        <table class="tabledetails" cellspacing="0" style="table-layout:fixed">
            <tr>
                <td class="tdmargin" />
                <th style="width:70px">
                    Product ID:
                </th>

            </tr>
        </table>
    </xsl:variable>

   <!-- Template Filler-->
<xsl:template name="Filler">
    <xsl:param name="fillercount" select="1"/>
    <xsl:if test="$fillercount > 0">
        <table class="tabledetails">
            <tr>
                <td>
                    <xsl:value-of select="translate(' ', ' ', '&#160;')"/>
                </td>
            </tr>
        </table>
        <xsl:call-template name="Filler">
            <xsl:with-param name="fillercount" select="$fillercount - 1"/>
        </xsl:call-template>
    </xsl:if>
</xsl:template>
<!-- Template Filler End-->

</xsl:stylesheet>

1 Ответ

0 голосов
/ 08 мая 2018

Модифицировано ниже строка

<xsl:if test="(position() mod 40) = 0 ">

с

<xsl:if test="(position() mod 40) = 0 and ( position() !=  last() )">

Следовательно, эта проблема была исправлена.

...