我有一个由多个子文档组成的文档。以下是子文档的样子:
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
。
我有什么建议可以解决这个问题吗?
答案 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的对象是第一个子文档的页面序列。