我在使用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的示例:
我需要在页脚部分之后进行分页(“ TEST2”应该只出现一次,然后中断)。任何帮助都会很棒。如果您需要其他任何信息,我会提供!
答案 0 :(得分: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>
及其属性来声明您希望名为“ footer”的标记的值(无论它是什么原来是)作为您的页脚内容。
我们逐页进行上述操作,每个页面由<page>
标签的存在来确定。现在,您的内容不必如此明确(可以使它们在没有这些<page>
父标记的情况下工作),并且如果其中包含非显式数据,则可能必须这样做。无法控制。但是,再次强调,例如,从每个<application>
标记开始的关键页面显示都是一件简单的事情。我只是以这种方式将其设置为演示目的。
最后但并非最不重要的一点是,与原始问题一样,分页符被包裹在标记周围,并且break-after
与{{1 }},以达到理想的断裂效果。
在FO中熟练使用标记通常对于高级打印格式至关重要,因为高级打印格式需要关注某些文档部分中动态内容的显示(表格是另一个非常有用的区域)。
请研究示例,让我知道是否有帮助。我认为这可能就是您想要发布的内容的地方。