在XSL-FO(和Apache FOP)中使用多个页面序列时如何填写页码?

6

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

1页
2-n页

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

1页
2-m页

正如我所说,这些子文档被合并在单个.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>

我有两个相同的块,每个块都包含两个页面序列。以我的例子为例,假设子文档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"/> 返回子文档1的值4。所以,我得到了1/4而不是1/2
有什么建议可以解决这个问题吗?

您没有展示足够的XSL-FO代码来可靠地诊断问题。请添加更多上下文,减少....... - Mathias Müller
问题可能是我有多个 id="end" 的元素吗? - user1414745
1
我只能重复一遍:您没有展示足够的XSL-FO代码来可靠地诊断问题。但是,如果在整个文档中ID不唯一,这绝对是一个问题。如果ID不明确,FOP有时会发出警告。 - Mathias Müller
1个回答

6

请你把这个问题的答案写成一个回答,这样我才能接受它吗?

当引用XSL-FO中的特定元素时,前提条件是你需要有一种方法能够明确地标识它。最好的方法是为要标识的元素使用一个ID属性。

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

你可以手动输入每个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文档会搜索在ref-id之前出现的具有此ID的对象。一旦找到相应ID的节点,搜索就会终止,并将此节点传递给fo:page-number-citation
在这种情况下,与ref-id之前匹配的对象是第一个子文档的页面序列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接