xsl-fo标题没有出现在第一章的第二页

时间:2014-01-13 03:05:08

标签: xml xslt xsl-fo dita

我正在使用AntennaHouse格式引擎从DITA bookmap创建自定义PDF输出。我正在尝试创建一个仅出现在本书第一页的自定义标题。这些书可以有多个章节,所以我使用的策略是为第一章创建一个页面序列,然后为其余章节创建不同的页面序列。

我区分第一章处理和其他章节要处理(在文件commons.xsl中)。第一个块确定章节号并将其放在变量“chapterNumber”中。第二个块描述了如何处理章节,具体取决于chapterNumber变量的内容:

    <xsl:variable name="id" select="@id"/>
    <xsl:variable name="topicChapters">
        <xsl:copy-of select="$map//*[contains(@class, ' bookmap/chapter ')]"/>
    </xsl:variable>
    <xsl:variable name="chapterNumber">
        <xsl:number format="1" value="count($topicChapters/*[@id = $id]/preceding-sibling::*) + 1"/>
    </xsl:variable>

    <xsl:when test="$topicType = 'topicChapter'">
    <xsl:choose>
        <xsl:when test="$chapterNumber = '1'">
            <xsl:call-template name="processFirstChapter"/>
        </xsl:when>
        <xsl:otherwise>
            <xsl:call-template name="processTopicChapter"/>
        </xsl:otherwise>
    </xsl:choose>

第一章的页面序列如下所示:

    <fo:page-sequence-master master-name="body-first-sequence">
        <fo:repeatable-page-master-alternatives>
            <fo:conditional-page-master-reference page-position="first" master-reference="body-first"/>
            <fo:conditional-page-master-reference page-position="rest" master-reference="body-rest"/>
            <fo:conditional-page-master-reference master-reference="body-rest"/>
        </fo:repeatable-page-master-alternatives>
    </fo:page-sequence-master>

其余章节的页面顺序如下:

    <fo:page-sequence-master master-name="body-sequence">
        <fo:repeatable-page-master-alternatives>
            <fo:conditional-page-master-reference page-position="any" master-reference="body-rest"/>
        </fo:repeatable-page-master-alternatives>
    </fo:page-sequence-master>

在处理过程中,我会调用两个模板,一个用于第一章,另一个用于其他章节:

    <xsl:template name="insertBodyStaticContents">
        <xsl:call-template name="insertBodyFootnoteSeparator"/>
        <xsl:call-template name="insertBodyRestHeader"/>          
        <xsl:call-template name="insertBodyFooter"/>
    </xsl:template>

    <xsl:template name="insertBodyFirstStaticContents">
        <xsl:call-template name="insertBodyFootnoteSeparator"/>
        <xsl:call-template name="insertBodyFirstHeader"/>
        <xsl:call-template name="insertBodyFooter"/>
    </xsl:template>

这些模板依次调用标题模板,一个用于第一章的第一页,另一个用于所有剩余的页面:

    <xsl:template name="insertBodyFirstHeader">
        <fo:static-content flow-name="first-body-header">
            <fo:block-container z-index="-1" position="absolute" top="0pt" left="0pt" height="1.5in" width="100%">
                <fo:block>
                    <fo:external-graphic src="Configuration/OpenTopic/cfg/common/artwork/qrgraphic.png"/>
                </fo:block>
            </fo:block-container>
            <!-- set the title -->
            <fo:block xsl:use-attribute-sets="__qrc__title__header">
                <xsl:value-of select="//*[contains(@class,' bookmap/mainbooktitle ')]"/>
            </fo:block>
            <!-- set the subtitle -->
            <fo:block xsl:use-attribute-sets="__first__heading__qrctext">
                    Quick Reference Card
            </fo:block>
        </fo:static-content>
    </xsl:template>

    <xsl:template name="insertBodyRestHeader">
        <fo:static-content flow-name="rest-body-header">
            <!-- set the title -->
            <fo:block xsl:use-attribute-sets="__qrc__title__header2">
                <xsl:value-of select="//*[contains(@class,' bookmap/mainbooktitle ')]"/>
            </fo:block>
            <!-- set the subtitle -->
            <fo:block xsl:use-attribute-sets="__firstheading__subtitle">
                Quick Reference Card
            </fo:block>
        </fo:static-content>
    </xsl:template>

除了一个奇怪的故障外,一切都有效 - 如果本书的第一章长于一页,那么第一章的第一页就有正确的标题(流名称为first-body-header的标题) )但在该章的后续页面中,标题为空白。第二章和第二章也有正确的标题(一个名为rest-body-header的流名称)。我知道该标头的代码是正确的,因为它出现在第二章及以后。但是,完全相同的标题应该出现在第一章的第2页上,并且它不会出现。我不能为我的生活弄清楚我的代码出了什么问题。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

你可能会使事情变得比你需要的更复杂。如果所有章节的页面区域的几何形状相同,那么第一章不需要不同的页面序列主页,只需要标题区域的静态内容中的不同内容。

要做的另一件事是保存.fo文件并检查它以确保它以您的方式生成。将Ant参数“retain.topic.fo”设置为“yes”,将clean.temp设置为“no”。

干杯,

埃利奥特

答案 1 :(得分:0)

我不确定你在哪里打电话,但基本上你需要两个简单的页面母版(4,计算空白页面)。 1是你的第一章开场白,一个是你的每一页其他页面。

为每个人定义一个fo:region-before。然后,在您的流程中,调用适用的静态内容。现在,当你生成第一章时,看起来你的BodyRestHeader根本就没有被调用。

一个非常基本的例子:

<fo:root>
    <fo:layout-master-set>
        <fo:simple-page-master master-name="chapfirstopen">
            <fo:region-body/>
            <fo:region-before region-name="firstopenhead"/>
        </fo:simple-page-master>
        <fo:simple-page-master master-name="everythingelse">
            <fo:region-body/>
            <fo:region-before region-name="elsehead"/>
        </fo:simple-page-master>
        <fo:page-sequence-master master-name="firstchap">
          <fo:repeatable-page-master-alternatives>
            <fo:conditional-page-master-reference master-reference="chapfirstopen" page-position="first">
            <fo:conditional-page-master-reference master-reference="everythingelse">
          </fo:repeatable-page-master-alternatives>
        </fo:page-sequence-master>
        <fo:page-sequence-master master-name="everyotherchap">
          <fo:repeatable-page-master-alternatives>
            <fo:conditional-page-master-reference master-reference="everythingelse">
          </fo:repeatable-page-master-alternatives>
        </fo:page-sequence-master>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="firstchap">
        <fo:static-content flow-name="firstopenhead">
            <!--your first page static content.-->
        </fo:static-content>
        <fo:static-content flow-name="elsehead">
            <!--your every-other-page static content.-->
        </fo:static-content>
        <fo:flow><!--first chapter--></fo:flow>
    </fo:page-sequence>
    <fo:page-sequence master-reference="everyotherchap">
        <fo:static-content flow-name="elsehead">
            <!--your every-other-page static content.-->
        </fo:static-content>
        <fo:flow><!--other chapter--></fo:flow>
    </fo:page-sequence>
</fo:root>

这些方面的东西。