如何使用XSLT在XML中插入分页符

如何使用XSLT在XML中插入分页符,xml,pdf,xslt,xsl-fo,xml-formatting,Xml,Pdf,Xslt,Xsl Fo,Xml Formatting,我在使用XML和XLST样式表生成带有分页符的PDF文档时遇到问题。这是我试图修复的现有代码,但对XML知之甚少!这是我第一次看它 我曾尝试使用break before=“page”,但没有成功 这是XSLT样式表: <xsl:template match="/"> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:

我在使用XML和XLST样式表生成带有分页符的PDF文档时遇到问题。这是我试图修复的现有代码,但对XML知之甚少!这是我第一次看它

我曾尝试使用break before=“page”,但没有成功

这是XSLT样式表:

 <xsl:template match="/">
   <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
     <fo:page-sequence-master master-name="alternating">
      <fo:repeatable-page-master-alternatives maximum-repeats="no-limit">
        <fo:conditional-page-master-reference master-reference="lastsimpleA4" odd-or-even="odd"/>
        <fo:conditional-page-master-reference master-reference="lastsimpleA4"/>
        <fo:conditional-page-master-reference master-reference="lastsimpleA4" odd-or-even="even"/>
       </fo:repeatable-page-master-alternatives>
     </fo:page-sequence-master>
     <fo:simple-page-master master-name="lastsimpleA4" page-height="29.7cm" page-width="20.99cm" margin-right="1cm" margin-left="1cm" margin-bottom="1cm" margin-top="1cm">
          <fo:region-body margin-bottom="41mm"/>
          <fo:region-after extent="41mm"/>
      </fo:simple-page-master>
    </fo:layout-master-set>
  </fo:root>
 </xsl:template>

  <fo:page-sequence master-reference="alternating" initial-page-number="1">
      <fo:static-content flow-name="xsl-region-after">
        <fo:block>
          <xsl:apply-templates select="root/footer"/>
        </fo:block>
      </fo:static-content>
      <fo:flow flow-name="xsl-region-body">
        <xsl:apply-templates select="root/application"/>
      </fo:flow>
  </fo:page-sequence>

  <xsl:template match="block">
       <fo:block break-before="page">         
       </fo:block>       
   <xsl:apply-templates/>
  </xsl:template>
  <xsl:template match="/root/application">
      <xsl:apply-templates/>
  </xsl:template>
  <xsl:template match="/root/footer">
      <xsl:apply-templates/>
  </xsl:template>

这是一个简单的XML示例:

<root>
    <application><block></block><data>TEST1</data></application>
    <footer><data>TEST2</data></footer>

    <application><block></block><data>TEST1</data></application>
    <footer><data>TEST2</data></footer>
</root>


我需要在页脚部分后面加一个分页符('TEST2'应该只出现一次,然后再分页符)。任何帮助都会很好。如果你需要任何其他信息,我会提供的

我同意@MartinHonnen的观点,即您应该“考虑向我们展示一个最小但完整的XML示例,以及最小但完整且有效的XSLT,以演示问题”,但我发布本文的目的是希望您能够理解它,它可以帮助解决您的问题,您和任何新接触XSL-FO的人都可以从这篇文章中学习

考虑这个样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:fo="http://www.w3.org/1999/XSL/Format">

    <xsl:template match="/">
        <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
            <fo:layout-master-set>

                <fo:page-sequence-master master-name="alternating">
                    <fo:repeatable-page-master-alternatives maximum-repeats="no-limit">
                        <fo:conditional-page-master-reference master-reference="lastsimpleA4" odd-or-even="odd"/>
                        <fo:conditional-page-master-reference master-reference="lastsimpleA4"/>
                        <fo:conditional-page-master-reference master-reference="lastsimpleA4" odd-or-even="even"/>
                    </fo:repeatable-page-master-alternatives>
                </fo:page-sequence-master>

                <fo:simple-page-master master-name="lastsimpleA4" page-height="29.7cm" page-width="20.99cm" margin-right="1cm" margin-left="1cm" margin-bottom="1cm" margin-top="1cm">
                    <fo:region-body margin-bottom="41mm"/>
                    <fo:region-after extent="41mm"/>
                </fo:simple-page-master>

            </fo:layout-master-set>

            <xsl:for-each select="/root/page">
                <fo:page-sequence master-reference="alternating" format="1">
                    <fo:static-content flow-name="xsl-region-after">
                        <fo:retrieve-marker retrieve-class-name="footer" retrieve-position="first-starting-within-page"/>
                    </fo:static-content>

                    <fo:flow flow-name="xsl-region-body">
                        <fo:block>
                            <xsl:apply-templates select="application"/>
                        </fo:block>

                        <fo:block break-after="page">
                            <!-- dynamic footer content -->
                            <fo:marker marker-class-name="footer">
                                <fo:block>
                                    <xsl:apply-templates select="footer"/>
                                </fo:block>
                            </fo:marker>
                        </fo:block>
                    </fo:flow>
                </fo:page-sequence>
            </xsl:for-each>

        </fo:root>
    </xsl:template>

</xsl:stylesheet>

这个XML…

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <page>
        <application>APP #1</application>
        <footer>FOOTER #1</footer>
    </page>

    <page>
        <application>APP #2</application>
        <footer>FOOTER #2</footer>
    </page>
</root>

附录1
页脚#1
附录2
页脚#2
现在我知道您似乎负责XSL,但我不知道您对传入数据有什么控制。尽管如此,本例中的XML和XSL都应该相对容易编辑,以满足您的需要。XML是一个设置示例,其中新页面由标记(在本例中为
标记)明确划分

请注意以下事项:

  • 我们使用名为
    的东西作为占位符,将其设置为定义其值时可能设置的变量。在本例中,每当我们匹配要作为其内容的标记(在本例中为
    )时,就会发生这种情况

  • 在它上面,在实际显示页脚的
    定义中,我们使用
    及其属性来声明您希望名为“footer”的标记的值(不管它是什么)作为页脚内容

  • 我们逐页执行上述操作,每一页都由
    标记确定。现在,您的内容不必如此明确(可以在没有这些
    父标记的情况下工作),如果有无法控制的非显式数据进入,您可能需要这样做。但是,再次强调一点,例如,为每个
    标记的起始页设置键是一件简单的事情。我只是以这种方式设置它以供演示

  • 最后但并非最不重要的一点是,正如最初的问题一样,分页符块被包装在标记上,使用
    break after
    page
    的值来实现所需的分页符效果

FO中标记的熟练使用对于高级打印格式来说通常是至关重要的,因为高级打印格式涉及到在某些文档节中显示动态内容(表格是另一个非常有用的领域)


请研究一下这个例子,让我知道它是否有帮助。我想这可能正是您想要使用您发布的内容的地方。

A
match=“block”如果您的XML示例没有任何代码>块/代码>元素,则您的XSLT将不被使用。Hi @ MartinHonnen,我已经尝试将元素添加到XML中,但是它不会在页脚之后的正确位置中断。您有建议将块放在XML中吗?或者可以更改XSLT?演示问题的XML示例,以及最小但完整且有效的XSLT(创建所需的XSL-FO,但要添加的分页符除外)。如果每个
/root/footer
元素都应该强制执行分页符,那么您似乎希望在与之匹配的模板中创建,尽管在我不确定是否了解您当前的结构后,您将页脚填充到了该区域。嗨@MartinHonnen,我已尝试使我的帖子更简单。我还包括了一个PDF e例如。我希望这能有所帮助,有人能帮助我!@MartinHonnen,我现在知道了页脚为什么会这样工作。页脚就像是一个页面标题,不会改变。我不能这样使用它。我这样做证明了这一点:TEST1 TEST2 FOOTER1 FOOTER1在两个页面上都重复了。现在我需要弄清楚如何将数据显示出来ay位于页面底部,但不使用/region after。