xml, xslt - верхний и нижний колонтитулы на всех страницах с продолжающимся содержанием данных таблицы - PullRequest
0 голосов
/ 07 мая 2018

У меня есть требование для создания PDF-файла из XML-документа. И этот PDF должен иметь верхний и нижний колонтитулы на каждой странице, а в теле PDF должны быть данные таблицы из XML, которые должны охватывать страницы с верхним и нижним колонтитулами

например:

Страница 1

Header Contents :

Table :
Line 1
Line 2

Footer Contents :

Страница 2

Header Contents :

Table :
Line 3
Line 4

Footer Contents :

Как будто я должен отображать ограниченные строки в таблице на страницу. только 2 строки в таблице на страницу, оставаясь следующей страницей с некоторым содержанием верхнего и нижнего колонтитула.

Пожалуйста, найдите мой XML:

<receipt>
    <order>
        <page></page>
        <page>
            <line_number>1</line_number>
            <product_code>S10</product_code>
            <line_number>2</line_number>
            <product_code>S20</product_code>
        </page>
        <page>
            <line_number>3</line_number>
            <product_code>S92</product_code>
            <line_number>4</line_number>
            <product_code>S31</product_code>
        </page>
    </order>
</receipt>

Пожалуйста, найдите мою таблицу стилей xsl:

xmlns: date = "http://exslt.org/dates-and-times" extension-element-prefixes =" date ">

    <xsl:template match="/receipt">
        <html>
            <head>
            <style>@page {size: a4 landscape;}</style>
            </head>
            <body>

                <table >
                    <thead>
                        <tr >
                            <th >Line</th>
                            <th>Item Code</th>
                        </tr>
                    </thead>
                <tbody>
                  <xsl:for-each select="order/page/line_number">
                            <tr style="font-size: 9px; ">
                                <td><xsl:value-of select="." /></td>
                                <td><xsl:value-of select="following-sibling::product_code[1]" /></td>
                            </tr>
                 </xsl:for-each>
                </tbody>
                </table>
                <br />

            </body>
        </html>
    </xsl:template>
</xsl:stylesheet>

1 Ответ

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

Попробуйте следующий код. Добавление стиля page-break-before:always; для первого поколения элемента tr разделит таблицу на элемент <page>. Это решит ваше требование.

<tbody>
    <xsl:for-each select="order/page[exists(*)]">
        <xsl:for-each-group select="*" group-adjacent="count(self::line_number|preceding-sibling::line_number)">
            <xsl:variable name="pos" as="xs:integer" select="position()"/>
            <tr style="{concat('font-size: 9px;',if ($pos eq 1) then 'page-break-before:always;' else '')}">
                <td>
                    <xsl:value-of select="current-group()[1]"/>
                </td>
                <td>
                    <xsl:value-of select="current-group()[2]"/>
                </td>
            </tr>
        </xsl:for-each-group>
    </xsl:for-each>
</tbody>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...