具有多个页面序列的xsl-fo(和apache fop)中的页码

时间:2014-03-26 12:42:28

标签: xslt pdf xsl-fo apache-fop page-numbering

我有一个由多个子文档组成的文档。以下是子文档的样子:

1页
2-n页

接下来是具有相同结构的下一个子文档:

1页
2米页

正如我所说,这些子文档合并在一个.pdf文件中。

这是我的xsl-fo tempalte:

<?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:output method="xml" indent="yes" />
  <xsl:template match="/">
    <fo:root font-size="11pt" font-family="serif">
      <fo:layout-master-set>
        <fo:simple-page-master master-name="A4-portrait"
          page-height="29.7cm" page-width="21.0cm" margin-top="1cm"
          margin-left="1.5cm" margin-right="1cm" margin-bottom="1cm">
          <fo:region-body />
          <fo:region-after region-name="footer" extent="15mm"/>
        </fo:simple-page-master>
      </fo:layout-master-set>

      <!-- first sub-document -->
      <fo:page-sequence master-reference="A4-portrait" initial-page-number="1">
      ...........
        <fo:block text-align="center">
            Page <fo:page-number/>/<fo:page-number-citation-last ref-id="end"/>
        </fo:block>
      ...........
      </fo:page-sequence>
      <fo:page-sequence master-reference="A4-portrait" id="end">
      ...........
        <fo:block text-align="center">
            Page <fo:page-number/>/<fo:page-number-citation-last ref-id="end"/>
        </fo:block>
      ...........
      </fo:page-sequence>

      <!-- second sub-document -->
      <fo:page-sequence master-reference="A4-portrait" initial-page-number="1">
      ...........
        <fo:block text-align="center">
            Page <fo:page-number/>/<fo:page-number-citation-last ref-id="end"/>
        </fo:block>
      ...........
      </fo:page-sequence>
      <fo:page-sequence master-reference="A4-portrait" id="end">
      ...........
        <fo:block text-align="center">
            Page <fo:page-number/>/<fo:page-number-citation-last ref-id="end"/>
        </fo:block>
      ...........
      </fo:page-sequence>

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

所以,我有2个相同的块,每个块由2个页面序列组成。在我的例子中,假设子文档1有4页(n = 4),子文档2有2页(m = 2)。以下是我获得的页码:

1/4
2/4
3/4
4/4
1/4
2/2

除了第二个子文档的第一页外,一切正常。此时,<fo:page-number-citation-last ref-id="end"/>返回4,这是子文档1中的值。因此,我得1/2而不是1/4

我有什么建议可以解决这个问题吗?

1 个答案:

答案 0 :(得分:3)

  

请你写一下这个答案(对我的两个问题),以便我能接受吗?

不确定。在XSL-FO中引用特定元素的前提条件是您可以明确地识别它。执行此操作的最佳方法是对要标识的元素使用ID属性。

ID必须包含任何字母数字字符序列和_(即,其值必须是有效的NCName,请参阅the specification here)。

您可以手动输入每个ID,但通常使用xsl:generate-id()完成(这是XSLT的功能,而不是XSL-FO)。 generate-id()会自动确保ID在整个文档中都是唯一的。

请注意,generate-id()实际上为当前模板匹配或正在xsl:for-each的迭代中处理的节点生成ID。

您可以在XML中的每个元素上放置一个ID,因此可以为XSL-FO中的任何元素引用ID。


由于您在此处提供了更多背景信息,因此我将提供更广泛的答案。现在应该清楚如何解决这个问题,但目前还不清楚为什么问题首先出现。

原始样式表中页码错误的原因是,在第二个子文档的第一页序列中,您打算引用之后出现的ID 引用它,同时ID在文档中不是唯一的。

换句话说,在此页面序列中:

  <!-- second sub-document -->
  <fo:page-sequence master-reference="A4-portrait" initial-page-number="1">
  <!--...-->
    <fo:block text-align="center">
        Page <fo:page-number/>/<fo:page-number-citation-last ref-id="end"/>
    </fo:block>
  <!--...-->
  </fo:page-sequence>

当您通过其ID(ref-id="end")引用对象时,将在XSL-FO文档中搜索具有此ID的对象,该ID出现在ref-id之前。只要找到具有相应ID的节点,搜索就会终止,并将此节点传递给fo:page-number-citation

在这种情况下,在ref-id之前出现匹配ID的对象是第一个子文档的页面序列。