xsl-list
[Top] [All Lists]

RE: Grouping issue - multiple page break locations

2003-02-03 17:49:32
Many thanks to Francis and Roger for these solutions -- and in advance to any others working on a response!





From: "Roger Glover" <glover_roger(_at_)yahoo(_dot_)com>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: <xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
Subject: RE: [xsl] Grouping issue - multiple page break locations
Date: Mon, 3 Feb 2003 17:47:49 -0600

Just saw Francis' 2(!) postings.  I offer this as a third similar
alternative.  It leans more toward simple expressions and more granular
templates, but it does not handle the "empty text" -> "no para" case that
francis does handle. Neither of us seem to handle the case of an input para
that spans 2 page breaks instead of one.

M V wrote:

> I've run into some problems with grouping that I hope someone can help me
> through.  I've read just about every article and FAQ on grouping
> that I've
> been able to locate.  I've also been through Michael Kay's and Jeni
> Tennison's books.  I haven't been able to apply any of the examples
> successfully to this particular variation.
>
> My source XML is structured like the following:
>
--- snip ---
>
> The page element in the souce can occur as a child of the root
> element or as
> a child of the para element.  When it occurs within the para
> element, I need
> to close and then open the para element.
>
> What I want to achieve is a page based hierarchy such as:
>
--- snip ---
>
> If anyone could help, it would be greatly appreciated!

Keep in mind that it is most effective to structure templates according to
the output format.  This tranform builds the book containing the pages
containing (here's the tricky part) the appropriate paragraphs.  Try
something like this:

=========================================
<xsl:transform version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
        <xsl:apply-templates select="book"/>
</xsl:template>

<xsl:template match="book">
    <xsl:copy>
        <!-- finds all pages and reinserts them at book-level -->
        <xsl:apply-templates select="page | para/page"/>
    </xsl:copy>
</xsl:template>

<!-- matches all book-level pages -->
<xsl:template match="book/page">
    <xsl:copy>
        <xsl:copy-of select="@number"/>
        <!-- if next element is a para add it to this page -->
        <xsl:apply-templates
            select="following-sibling::*[position()=1 and name()='para']"
            mode="until-next-page"
        />
    </xsl:copy>
</xsl:template>

<!-- matches all para-level pages -->
<xsl:template match="para/page">
    <xsl:copy>
        <xsl:copy-of select="@number"/>
        <!-- gathers all text nodes after page into a para -->
        <para><xsl:apply-templates
select="following-sibling::text()"/></para>
        <!-- if next element after parent para is a para add it to this
page -->
        <xsl:apply-templates
select="../following-sibling::*[position()=1 and name()='para']"
            mode="until-next-page"
        />
    </xsl:copy>
</xsl:template>

<!-- matches all paras containing a page -->
<xsl:template match="para[page]" mode="until-next-page">
    <!-- gathers all text nodes before page into a para -->
    <para><xsl:apply-templates
select="page/preceding-sibling::text()"/></para>
</xsl:template>

<!-- matches all paras not containing a page -->
<xsl:template match="para[not(page)]" mode="until-next-page">
    <!-- copy this para into enclosing result page -->
    <xsl:copy-of select="."/>
    <!-- if next element is a para add it to enclosing result page -->
    <xsl:apply-templates
        select="following-sibling::*[position()=1 and name()='para']"
        mode="until-next-page"
    />
</xsl:template>

<!-- removes "ignorable" white space -->
<xsl:template match="text()">
    <xsl:value-of select="normalize-space()"/>
</xsl:template>
=========================================

-- Roger Glover
   glover_roger(_at_)yahoo(_dot_)com



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


_________________________________________________________________
MSN 8 with e-mail virus protection service: 2 months FREE* http://join.msn.com/?page=features/virus


XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>