【问题标题】:XSL-FO: Forcing a page break between each <xi:include>XSL-FO:在每个 <xi:include> 之间强制分页符
【发布时间】:2011-01-12 22:55:51
【问题描述】:

我正在尝试生成带有 pdf 生成的 mod 规范。我生成它的方式是使用如下所示的 contents.xml 文件...

<?xml version="1.0" encoding="UTF-8"?>
<article xmlns="http://docbook.org/ns/docbook"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xi="http://www.w3.org/2001/XInclude"
xsi:schemaLocation="http://docbook.org/ns/docbook http://schema.5d.ca/docbook/docbook.xsd
                    http://www.w3.org/2001/XInclude http://schema.5d.ca/docbook/XInclude.xsd">

<title>Mod Spec</title>
<?dbfo-need height="8in" space-before="3em" ?>
<xi:include href="first.xml"/>    
<section>
    <title>View Stuff</title>
    <xi:include href="./stuff/panel.xml"/>
</section>
<section>
    <title>Nav things</title>
    <xi:include href="./things/about.xml"/>        
    <xi:include href="./things/control.xml"/>
    <xi:include href="./things/launch.xml"/>        
</section>
...(more sections with includes)
</article>

现在我还有一个样式表,用于在为 XSL-FO 发送上述 xml 之前设置页眉、页脚和表格样式,并且此样式表将需要添加分页符。

所以我的问题是:如何在 contents.xml 中的所有单独的 modspecs 之间添加分页符?

编辑 http://www.sagehill.net/docbookxsl/PageBreaking.html 声明我应该将此添加到我的 XSLT:

<xsl:template match="processing-instruction('hard-pagebreak')">
   <fo:block break-after='page'/>
</xsl:template>

这样它就会在 .xml 文件中获取&lt;?hard-pagebreak?&gt;。我想使解决方案尽可能紧凑,那么如何编辑我的样式表,以便第一次通过将在每个 &lt;xi:include&gt; 之后添加 &lt;?hard-pagebreak?&gt;,然后是给定我的 sagehill 的模板?

【问题讨论】:

  • @Ace:如果“分页符”是指 XSL-FO 分页符,那么这与 XSLT 本身无关。
  • @Alejandro:也许我太天真了,但是有一个“新页面”或“分页符”字符会产生效果吗?
  • @Ace:这将是一个公平的 DocBook 问题......
  • @Alejandro:是的,但样式表将是我实现此更改的唯一方法,无论是修复 content.xml 还是所有其他 .xml 文件
  • @Ace:也许,但首先您需要知道要使用的特定 XML 词汇表的元素。

标签: xml xslt xsl-fo docbook


【解决方案1】:

这个样式表:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 xmlns:xi="http://www.w3.org/2001/XInclude">
    <xsl:template match="@*|node()" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="xi:include">
        <xsl:call-template name="identity"/>
        <xsl:processing-instruction name="hard-pagebreak"/>
    </xsl:template>
</xsl:stylesheet>

输出:

<article xsi:schemaLocation=
          "http://docbook.org/ns/docbook http://schema.5d.ca/docbook/docbook.xsd
           http://www.w3.org/2001/XInclude http://schema.5d.ca/docbook/XInclude.xsd"
         xmlns="http://docbook.org/ns/docbook"
         xmlns:xlink="http://www.w3.org/1999/xlink"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:xi="http://www.w3.org/2001/XInclude">
    <title>Mod Spec</title>
    <?dbfo-need height="8in" space-before="3em" ?>
    <xi:include href="first.xml"></xi:include>
    <?hard-pagebreak?>
    <section>
        <title>View Stuff</title>
        <xi:include href="./stuff/panel.xml"></xi:include>
        <?hard-pagebreak?>
    </section>
    <section>
        <title>Nav things</title>
        <xi:include href="./things/about.xml"></xi:include>
        <?hard-pagebreak?>
        <xi:include href="./things/control.xml"></xi:include>
        <?hard-pagebreak?>
        <xi:include href="./things/launch.xml"></xi:include>
        <?hard-pagebreak?>
    </section> ...(more sections with includes) 
</article>

那么,您可以将模板匹配 fictitious hard-pagebreak 处理指令添加到 DocBook 到 FOP 样式表

【讨论】:

  • @Alejandro,这很接近。理想情况下,我想将此解决方案添加到我现有的样式表中,即第一遍它添加到&lt;?hard-pagebreak?&gt; 第二遍它处理它。
  • @Ace:您应该按照链接文档中的说明在 DocBook 样式表中添加第二步。
  • @Alejandro:我希望将它们放在同一个样式表中。我拥有的样式表在 xsl-fo 完成之前运行,并且仅适用于生成的 pdf。我不希望它影响生成的任何其他类型的文档。
  • @Alejandro,你为什么说 PI 是“虚构的”?我会说这是一个非常“真实”的 PI。
  • @mzjn:因为它对于 DocBook 处理是虚构的(因为它不会被 DocBook 样式表中的任何模板匹配,当然除了内置的......)。因此,@Ace 需要添加一个与此 PI 匹配的模板以转换为 XSL-FO 元素(此&lt;fo:block break-after='page'/&gt;)。为什么在 DocBook 样式表中而不是之前?因为我们不知道在找到这个 XSL-FO 元素时 DocBook 样式表会做什么。最有可能的是,它会忽略它,然后它不会到达 FOP 处理。
【解决方案2】:

要在输出中强制分页,想法是您应该直接手动将&lt;?hard-pagebreak?&gt; 处理指令添加到XML 源文档(与您已经添加&lt;?dbfo-need height="8in" space-before="3em"?&gt; 相同的方式),然后放入

<xsl:template match="processing-instruction('hard-pagebreak')">
  <fo:block break-after='page'/>  
</xsl:template> 

在样式表定制层中。如果您愿意,您可以使用@Alejandro 的建议,该建议使用额外的转换步骤添加 PI,但您实际上并不需要(恕我直言)。

【讨论】:

  • 不幸的是,添加 &lt;?hard-pagebreak?&gt; 是不现实的,因为我需要添加的文件数量很多,而且它还会降低 content.xml 文件的可读性(也用于html 生成。
  • 理想情况下,此解决方案与 Alejandro 的混合,所以他的第一个,然后是这个。
猜你喜欢
  • 1970-01-01
  • 2015-12-16
  • 2016-04-14
  • 2010-09-18
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
相关资源
最近更新 更多