【问题标题】:Page numbers in xsl-fo (and apache fop) with multiple page-sequences具有多个页面序列的 xsl-fo(和 apache fop)中的页码
【发布时间】:2014-03-26 12:42:27
【问题描述】:

我有一个包含多个子文档的文档。以下是子文档的外观:

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>

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

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

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

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

【问题讨论】:

  • 您没有显示足够的 XSL-FO 代码来可靠地诊断问题。请添加更多上下文和更少.......。
  • 问题可能是我有多个带有id="end" 的元素吗?
  • 我只能重复一遍:您没有显示足够的 XSL-FO 代码来可靠地诊断问题。但可以肯定的是,在整个文档中不是唯一的 ID总是是个问题。如果 ID 不明确,FOP 有时会发出警告。

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


【解决方案1】:

您能否将其写成答案(对我的两个问题),以便我接受?

当然。在 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发生在您引用它之后 , 同时 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 且出现在 ref-id 之前的对象。一旦找到具有相应 ID 的节点,搜索就会终止,并将该节点交给fo:page-number-citation。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2021-04-24
    • 2015-02-01
    • 2018-06-22
    相关资源
    最近更新 更多