Заголовок xsl-fo не отображается на второй странице первой главы
Я создаю пользовательский вывод PDF из карты DITA, используя механизм форматирования AntennaHouse. Я пытаюсь создать собственный заголовок, который появляется только на первой странице книги. Эти книги могут состоять из нескольких глав, поэтому я использую стратегию - создать одну последовательность страниц для первой главы, а затем другую последовательность страниц для остальных глав.
Я различаю обработку первой главы и остальные главы, которые будут обработаны следующим образом (в файле 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 ответа
Я не уверен, где вы делаете некоторые из ваших звонков, но в основном вам нужны два простых мастера страниц (4, считая пустую страницу). 1 - ваш первый открыватель глав, один - ваша каждая другая страница в книге.
Определите fo:region-before для каждого из них. Затем в своем потоке вызовите соответствующее static-content. В данный момент не похоже, что ваш 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>
Что-то в этом роде.
Вы можете делать вещи сложнее, чем нужно. Если геометрия областей страницы одинакова для всех глав, то вам не нужен другой мастер последовательности страниц для первой главы, просто другое содержимое в статическом содержимом области заголовка.
Другая вещь, которую нужно сделать, это сохранить файл.fo и проверить его, чтобы убедиться, что он генерируется так, как вы его представляете. Установите для параметра Ant "retain.topic.fo" значение "yes" и для clean.temp значение "no".
Ура,
Элиот