5

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

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>

所以,我有 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

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

4

1 回答 1

3

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

当然。在 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>

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

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

于 2014-03-26T19:52:24.327 回答