首页 > 解决方案 > xml, xslt - 所有页面上的页眉和页脚,具有连续的表格数据内容

问题描述

我需要从 XML 文档生成 PDF 文件。并且该 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>

标签: htmlxmlxslt

解决方案


试试下面的代码。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>

推荐阅读