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

use*_*745 6 pdf xslt xsl-fo page-numbering apache-fop

我有一个由多个子文档组成的文档。子文档如下所示:

1 页
2-n 页

然后是具有相同结构的下一个子文档:

1 页
2 米页

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

这是我的 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: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>
Run Code Online (Sandbox Code Playgroud)

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

1/4
2/4
3/4
4/4
1/4
2/2
Run Code Online (Sandbox Code Playgroud)

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

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

Mat*_*ler 6

您能否将此作为(我的两个问题)的答案,以便我可以接受?

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

ID 必须由任意字母数字字符序列组成_(即,其值必须是有效的 NCName,请参阅此处的规范)。

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

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

您可以在 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>
Run Code Online (Sandbox Code Playgroud)

当您通过 ID ( ) 引用对象时ref-id="end",将在 XSL-FO 文档中搜索具有此 ID 且出现在ref-id. 一旦找到具有相应ID的节点,搜索就终止,并将该节点交给fo:page-number-citation

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