[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]
Subject: Re: [docbook-apps] How to remove page breaks between articles in book
Hi Michael,I thought about this some more and created a more general solution that does not require modifying the book template, and handles mixed content in a book. The book template does xsl:apply-templates on all of its children. I created one template that matches on the first article of a sequence and creates a fo:page-sequence for the set of articles. After processing its content, it applies templates in a new mode to the next element *if* it is an article. That template just processes its content without creating a fo:page-sequence, and then processes the next element if it is an article. This recursive processing stops when the next element is not an article. You have to use a new mode so that you can turn off the normal processing of those subsequent articles so they are not processed twice.
<!-- this template selects the first of a sequence of articles and creates the fo:page-sequence for the sequence --><xsl:template match="d:article[not(preceding-sibling::*[1]/self::d:article)]">
<xsl:variable name="id">
<xsl:call-template name="object.id"/>
</xsl:variable>
<xsl:variable name="master-reference">
<xsl:call-template name="select.pagemaster"/>
</xsl:variable>
<fo:page-sequence hyphenate="{$hyphenate}"
master-reference="{$master-reference}">
<xsl:attribute name="language">
<xsl:call-template name="l10n.language"/>
</xsl:attribute>
<xsl:attribute name="format">
<xsl:call-template name="page.number.format">
<xsl:with-param name="master-reference" select="$master-reference"/>
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name="initial-page-number">
<xsl:call-template name="initial.page.number">
<xsl:with-param name="master-reference" select="$master-reference"/>
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name="force-page-count">
<xsl:call-template name="force.page.count">
<xsl:with-param name="master-reference" select="$master-reference"/>
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name="hyphenation-character">
<xsl:call-template name="gentext">
<xsl:with-param name="key" select="'hyphenation-character'"/>
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name="hyphenation-push-character-count">
<xsl:call-template name="gentext">
<xsl:with-param name="key"
select="'hyphenation-push-character-count'"/>
</xsl:call-template>
</xsl:attribute>
<xsl:attribute name="hyphenation-remain-character-count">
<xsl:call-template name="gentext">
<xsl:with-param name="key"
select="'hyphenation-remain-character-count'"/>
</xsl:call-template>
</xsl:attribute>
<xsl:apply-templates select="." mode="running.head.mode">
<xsl:with-param name="master-reference" select="$master-reference"/>
</xsl:apply-templates>
<xsl:apply-templates select="." mode="running.foot.mode">
<xsl:with-param name="master-reference" select="$master-reference"/>
</xsl:apply-templates>
<fo:flow flow-name="xsl-region-body">
<xsl:call-template name="set.flow.properties">
<xsl:with-param name="element" select="local-name(.)"/>
<xsl:with-param name="master-reference" select="$master-reference"/>
</xsl:call-template>
<fo:block id="{$id}"
xsl:use-attribute-sets="component.titlepage.properties">
<xsl:call-template name="article.titlepage"/>
</fo:block>
<xsl:call-template name="make.component.tocs"/>
<!-- this processes the content of this first article -->
<xsl:apply-templates/>
<!-- this processes the next article in the sequence in a new mode -->
<xsl:apply-templates select="following-sibling::*[1][self::d:article]"
mode="more.articles"/>
</fo:flow>
</fo:page-sequence>
</xsl:template>
<!-- this template turns off processing of a subsequent article in
normal mode so it is not processed twice -->
<xsl:template match="d:article[preceding-sibling::*[1]/self::d:article]"/>
<!-- This template processes subsequent articles without a page-sequence -->
<xsl:template match="d:article[preceding-sibling::*[1]/self::d:article]"
mode="more.articles">
<xsl:variable name="id">
<xsl:call-template name="object.id"/>
</xsl:variable>
<fo:block id="{$id}"
xsl:use-attribute-sets="component.titlepage.properties">
<xsl:call-template name="article.titlepage"/>
</fo:block>
<xsl:call-template name="make.component.tocs"/>
<!-- process the content of the current article -->
<xsl:apply-templates/>
<!-- process the next article in sequence in new mode -->
<xsl:apply-templates select="following-sibling::*[1][self::d:article]"
mode="more.articles"/>
</xsl:template>
Let me know if any of this is unclear.
Bob Stayton
Sagehill Enterprises
bobs@sagehill.net
--------------------------------------------------
From: "Michael Broschinsky" <mikebroschinsky@mail.com>
Sent: Wednesday, March 20, 2013 4:44 PM
To: "Bob Stayton" <bobs@sagehill.net>; <[email protected]>
Subject: Re: [docbook-apps] How to remove page breaks between articles in
book
Bob,I think I will need your help on this. In spite of having used DocBook for some time now, the stock stylesheets have been most sufficient for my needs. I haven't yet really learned XSL.So, I created a customization layer, my-customizations.xsl and copied into it the template match for d:book from fo/divisions.xsl (ver. 1.78.1) beginning with <xsl:template match="d:book"> and ending with <xsl:template match="d:book/d:titleabbrev"></xsl:template>.Then I copied the d:article template from fo/component.xsl (ver. 1.78.1) beginning with <xsl:template match="d:article"> through <xsl:template match="d:article/d:titleabbrev"></xsl:template>.I then removed the lines <fo:page-sequence hyphenate="{$hyphenate}" master-reference="{$master-reference}"> through the closing </fo:page-sequence>.And then... Well, I don't know what to do then----- Original Message ----- From: Bob Stayton Sent: 03/18/13 09:18 AM To: Michael Broschinsky, docbook-apps@lists.oasis-open.orgSubject: Re: [docbook-apps] How to remove page breaks between articles in bookHi Michael,An XSL-FO output file is structured into a series of fo:page-sequences, eachwith its own designation of a page-master to declare the page specs. The default processing of article is to put each article in its own fo:page-sequence. That always forces a page break between articles. To prevent such page breaks, the XSL template matching on book in fo/division.xsl would need to be customized. When it encounters a set ofarticles, it should start a single fo:page-sequence and apply-templates toall the articles inside that sequence. But since fo:page-sequences cannot be nested, you would also need to customize the template for article in fo/component.xsl to remove its fo:page-sequence.[...snip...]
[Date Prev] | [Thread Prev] | [Thread Next] | [Date Next] -- [Date Index] | [Thread Index] | [List Home]