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

问题描述 投票:0回答:1

我在使用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>

下面是生成的PDF的示例:

PDF example

我需要在页脚部分之后进行分页('TEST2'应该只出现一次然后中断)。任何帮助都会很棒。如果您需要其他任何信息,我会提供!

xml pdf xslt xsl-fo xml-formatting
1个回答
0
投票

我同意@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>

现在,我知道您似乎由XSL负责,但我不知道您对传入数据有什么控制权。但是,此示例中的XML和XSL都应该相对容易地进行编辑以满足您的需求。 XML是一种设置示例,其中新页面由标签(在本示例中为<page>标签)明确标定。

注意以下内容:

  • 我们使用<fo:marker>作为占位符,将其设置为定义变量值时可能设置的变量。在此示例中,只要我们匹配所需标签作为其内容(在本例中为<footer>),就会发生这种情况。

  • 上面,在实际显示页脚的<fo:static-content>定义中,我们使用<fo:retrieve-marker>及其属性声明您希望名为“页脚”的标记的值(无论结果如何)为您的页脚内容。

  • 我们逐页进行上述操作,每页由<page>标签的存在来确定。现在,您的内容不必如此明确(无需这些<page>父标记就可以正常工作),并且如果输入的是非明示数据,您可能必须这样做。 t控制。但是,再次强调,例如,从每个<application>标签开始显示关键页面是一件简单的事情。我只是以这种方式将其设置为演示目的。

  • FO中标记的熟练使用通常对于高级打印格式至关重要,这种格式涉及某些文档部分中动态内容的显示(表是另一个非常有用的区域)。

    请研究示例,让我知道是否有帮助。如果是,请标记为答案。我认为这可能就是您想要发布的内容的地方。 :)

谢谢,

-Tony

© www.soinside.com 2019 - 2024. All rights reserved.