【问题标题】:Table footer is not coming if table content extends to next page in PDF using xslt如果表格内容使用 xslt 扩展到 PDF 中的下一页,则表格页脚不会出现
【发布时间】:2018-05-09 11:34:09
【问题描述】:

如果表格扩展到下一页,则不显示表格页脚。

继续文本应该出现在第一页表格的末尾。类似于正确出现的表格标题。每当表格扩展到下一页时,“cont”应该出现在第一页的末尾。

示例 XML:

<NewDataSet>
    <DefaultView>
     <Department>2222</Department>
     <Title>Manish</Title>
   </DefaultView>
   <DefaultView>
     <Department>2223</Department>
     <Title>Santosh</Title>
   </DefaultView>
   <DefaultView>
     <Department>2224</Department>
     <Title>Naveen</Title>
   </DefaultView>
   <DefaultView>
     <Department>2225</Department>
     <Title>punith</Title>
   </DefaultView>
   <DefaultView>
     <Department>2226</Department>
     <Title>bharath</Title>
   </DefaultView>
   <DefaultView>
     <Department>2227</Department>
     <Title>vijay</Title>
   </DefaultView>
 </NewDataSet>

XSL 示例:

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                              xmlns:fo="http://www.w3.org/1999/XSL/Format"
                              xmlns:rx="http://www.renderx.com/XSL/Extensions"
                              xmlns:psmi="http://www.CraneSoftwrights.com/resources/psmi"
                              xmlns:exsl="http://exslt.org/common">
  <xsl:template match='NewDataSet'>
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master master-name="my-page">
          <fo:region-body margin="1in"/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="my-page">
        <fo:flow flow-name="xsl-region-body">
        <fo:table>  
              <fo:table-column column-width="25mm"/>
              <fo:table-column column-width="25mm"/>
              <fo:table-header  keep-together="always">
                        <fo:block text-align="center" font-style="italic" margin="5pt" keep-together="always">
                            <xsl:text>Table</xsl:text>
                        </fo:block>
                </fo:table-header>
        </fo:table>
          <fo:table-and-caption>  
            <fo:table rx:table-omit-initial-header="true">  
              <fo:table-column column-width="25mm"/>
              <fo:table-column column-width="25mm"/>
              <fo:table-header  keep-together="always">
                        <fo:block text-align="center" font-style="italic" margin="5pt" keep-together="always">
                            <xsl:text>Table (Cont.)</xsl:text>
                        </fo:block>
                </fo:table-header>

              <fo:table-header >
                <fo:table-row>
                  <fo:table-cell border-color="black" border-style="solid" width = "85pt" border-width="0.4pt" padding="3pt" align="left">
                    <fo:block font-weight="bold">Dept</fo:block>
                  </fo:table-cell >
                  <fo:table-cell border-color="black" border-style="solid" width = "85pt" border-width="0.4pt" padding="3pt" align="left">
                    <fo:block font-weight="bold">Title</fo:block>
                  </fo:table-cell>
                </fo:table-row>
              </fo:table-header>
              <xsl:for-each select="*">
                <fo:table-body>
                  <fo:table-row>
                    <fo:table-cell border-color="black" border-style="solid" width = "85pt" border-width="0.4pt" padding="3pt" align="left">
                      <fo:block>
                        <xsl:value-of select="Department"/>
                      </fo:block>
                    </fo:table-cell>
                    <fo:table-cell border-color="black" border-style="solid" width = "85pt" border-width="0.4pt" padding="3pt" align="left">
                      <fo:block>
                        <xsl:value-of select="Title"/>
                      </fo:block>
                    </fo:table-cell>
                  </fo:table-row>
                </fo:table-body>
              </xsl:for-each>
            </fo:table>
          </fo:table-and-caption>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>
</xsl:stylesheet>

示例输出:

【问题讨论】:

  • 您的示例 XSLT 中没有 fo:table-footer。 (另外,如果你把fo:table-body 放在xsl:for-each 之外,你只会生成一个fo:table-body,而你真的只需要一个。)
  • 注意:与省略表格的开始页眉不同,省略最后一个页脚并不等同。如果您的想法是有一个显示“表格在下一页继续”的页脚,您可以使用标记并拉入页脚区域并清除表格末尾的标记。
  • 嗨,Kevin,您能否提供一些示例来清除表格页脚中的标记,以便我们做同样的事情。提前致谢。
  • 请看答案,我给你加了cmets。您可以在表格后面看到它就像将标记设置为空元素一样简单。这将使其“空白”。因此,它不会将任何内容拉到页脚。您会重复围绕您的表格...将标记设置为连续文本,格式化表格,将标记设置为空。
  • 对于下面的数据,页脚也出现在页面末尾。仅当表格内容扩展到下一页时,页脚才应出现。如果表格内容未扩展到下一页,则只有表格不应出现在该页面上的页脚内容。 2222Manish2223Santosh

标签: xslt xsl-fo


【解决方案1】:

将此与关于表头的其他答案 (Table header is not getting repeated, if table content extended to next page in PDF using XSLT) 结合起来,这是一个完整的示例,显示了表头和页脚在表结转时作为标记拉入页脚区域。

    <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
        xmlns:fo="http://www.w3.org/1999/XSL/Format"
        xmlns:rx="http://www.renderx.com/XSL/Extensions"
        xmlns:psmi="http://www.CraneSoftwrights.com/resources/psmi"
        xmlns:exsl="http://exslt.org/common">


        <xsl:template match='NewDataSet'>
            <fo:root>
                <fo:layout-master-set>
                    <fo:simple-page-master master-name="my-page">
                        <fo:region-body margin="1in"/>
                        <fo:region-after extent="1in"/>
                    </fo:simple-page-master>
                </fo:layout-master-set>
                <fo:page-sequence master-reference="my-page">
                    <fo:static-content flow-name="xsl-region-after">
                       <!-- This retrieves the marker into the footer -->
                        <fo:block>
                           <fo:retrieve-marker retrieve-class-name="table" retrieve-position="last-ending-within-page"/>
                        </fo:block>
                    </fo:static-content>
                    <fo:flow flow-name="xsl-region-body">
                       <!-- This sets the marker content for the footer -->
                        <fo:block>
                            <fo:marker marker-class-name="table">
                                Table continued on next page
                            </fo:marker>
                        </fo:block>
                            <fo:table-and-caption>
                                <fo:table rx:table-omit-initial-header="true">  
                                    <fo:table-column column-width="25mm"/>
                                    <fo:table-column column-width="25mm"/>
                                    <fo:table-header  keep-together="always">
                                        <fo:table-row>
                                            <fo:table-cell number-columns-spanned="2"><fo:block text-align="center" font-style="italic" margin="5pt" keep-together="always">
                                                <xsl:text>Table (Cont.)</xsl:text>
                                            </fo:block>
                                        </fo:table-cell>
                                        </fo:table-row>
                                        <fo:table-row>
                                        <fo:table-cell border-color="black" border-style="solid" width = "85pt" border-width="0.4pt" padding="3pt" >
                                            <fo:block font-weight="bold">Department</fo:block>
                                        </fo:table-cell >
                                        <fo:table-cell border-color="black" border-style="solid" width = "85pt" border-width="0.4pt" padding="3pt" >
                                            <fo:block font-weight="bold">Title</fo:block>
                                        </fo:table-cell>
                                        </fo:table-row>
                                    </fo:table-header>
                                    <fo:table-body>
                                        <fo:table-row>
                                            <fo:table-cell border-color="black" border-style="solid" width = "85pt" border-width="0.4pt" padding="3pt" >
                                                <fo:block font-weight="bold">Depaartment</fo:block>
                                            </fo:table-cell >
                                            <fo:table-cell border-color="black" border-style="solid" width = "85pt" border-width="0.4pt" padding="3pt" >
                                                <fo:block font-weight="bold">Title</fo:block>
                                            </fo:table-cell>
                                        </fo:table-row>
                                        <xsl:apply-templates/>
                                    </fo:table-body>
                                </fo:table>
                            </fo:table-and-caption>
                        <!-- IMPORTANT -- This clears the marker so it does not appear on pages where the table ends -->
                        <fo:block keep-with-previous.within-page="always">
                            <fo:marker marker-class-name="table"/>
                        </fo:block>
                    </fo:flow>
                </fo:page-sequence>
            </fo:root>
        </xsl:template>
        <xsl:template match="DefaultView">
            <fo:table-row>
                <fo:table-cell border-color="black" border-style="solid" width = "85pt" border-width="0.4pt" padding="3pt" >
                    <fo:block>
                        <xsl:value-of select="Department"/>
                    </fo:block>
                </fo:table-cell>
                <fo:table-cell border-color="black" border-style="solid" width = "85pt" border-width="0.4pt" padding="3pt" >
                    <fo:block>
                        <xsl:value-of select="Title"/>
                    </fo:block>
                </fo:table-cell>
            </fo:table-row>
        </xsl:template>
    </xsl:stylesheet>

结果是:

如果你有很多页面是:

如果你的页面少于一页:

【讨论】:

  • 感谢您的更新。页脚内容来了,如果表格内容没有扩展到下一页。仅当特定表格内容扩展到下一页时,才应出现页脚内容。
  • 上图中第2页的页脚内容是什么?您可能没有清除标记。查看 XSL 中表格的最后,您会看到标记设置为无内容。
  • 我在 XSL 中添加了一些 cmets 并进行了一项更改,如果表格正好是一页长,您可能会获得第二页。
  • 对于下面的数据,页脚也出现在页面末尾。仅当表格内容扩展到下一页时,页脚才应出现。如果表格内容未扩展到下一页,则只有表格不应出现在该页面上的页脚内容。 2222Manish2223Santosh
  • 您应该指定所有要求。表格可以小于一页、两页、十页吗?然后你用一个块包围并使用retrieve-marker-position和像last-ending-within-page一样。
猜你喜欢
  • 2018-10-19
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 2015-10-06
  • 2019-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多