Subject: Re: Flat to Structured: Handling List Items with Subordinate Paragraphs
From: Eliot Kimber <ekimber@xxxxxxxxxxxx>
Date: Tue, 26 May 2009 15:31:21 -0500
|
On 5/26/09 3:04 PM, "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx> wrote:
>> Can anyone point me in the right direction?
>
> Consider the solution below. I'm making assumptions like a container
> is defined by adjacent elements with @container, and that the
> container type is homogenous (so I only need to look at the first),
> and that list items are always of type 'li'. It gives what you are
> asking for, but you may need to modify it based on a more precise
> definition of containers.
Hmmm--took me a minute to see the boolean(@container) in this line:
<xsl:for-each-group select="*" group-adjacent="boolean(@container)">
So that has the effect of creating a group for each continguous sequence of
contained things, which is certainly a characteristic I can impose on my
data (I control both the set of named styles and how they map to the
annotations added the <p> elements in the data being processed).
Given that, I think I should be able to process the group of contained
things with recursive for-each-groups.
Thanks,
E.
> I hope this helps.
>
> . . . . . . . . . . Ken
>
> T:\ftemp>type eliot.xml
> <doc>
> <p type="para" level="1">Para 1</p>
> <p container="ol" type="li" level="1">ol item 1</p>
> <p container="li" type="para" level="2">Para w/in li</p>
> <p container="ol" type="li" level="1">ol item 2</p>
> <p container="li" type="para" level="2">Para w/in li</p>
> <p type="para" level="1">Para 2</p>
> </doc>
> T:\ftemp>xslt2 eliot.xml eliot.xsl
> <?xml version="1.0" encoding="UTF-8"?>
> <para>Para 1</para>
> <ol>
> <li>ol item 1<para>Para w/in li</para>
> </li>
> <li>ol item 2<para>Para w/in li</para>
> </li>
> </ol>
> <para>Para 2</para>
> T:\ftemp>type eliot.xsl
> <?xml version="1.0" encoding="US-ASCII"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> version="2.0">
>
> <xsl:output indent="yes"/>
>
> <xsl:template match="doc">
> <!--determine containers by the members being adjacent-->
> <xsl:for-each-group select="*" group-adjacent="boolean(@container)">
> <xsl:choose>
> <xsl:when test="@container">
> <!--at a container of a particular type-->
> <!--create the necessary kind of container-->
> <xsl:element name="{@container}">
> <!--populate the container-->
> <xsl:for-each-group select="current-group()"
> group-starting-with="*[@type='li']">
> <li>
> <xsl:apply-templates select="node()"/>
> <xsl:apply-templates select="current-group()[position()>1]"/>
> </li>
> </xsl:for-each-group>
> </xsl:element>
> </xsl:when>
> <xsl:otherwise>
> <!--not at a container; just constitute the elements-->
> <xsl:apply-templates select="current-group()"/>
> </xsl:otherwise>
> </xsl:choose>
> </xsl:for-each-group>
> </xsl:template>
>
> <xsl:template match="*">
> <xsl:element name="{@type}">
> <xsl:apply-templates/>
> </xsl:element>
> </xsl:template>
>
> </xsl:stylesheet>
>
> T:\ftemp>
>
> --
> XSLT/XSL-FO/XQuery hands-on training - Los Angeles, USA 2009-06-08
> Crane Softwrights Ltd. http://www.CraneSoftwrights.com/s/
> Training tools: Comprehensive interactive XSLT/XPath 1.0/2.0 video
> Video lesson: http://www.youtube.com/watch?v=PrNjJCh7Ppg&fmt=18
> Video overview: http://www.youtube.com/watch?v=VTiodiij6gE&fmt=18
> G. Ken Holman mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
> Male Cancer Awareness Nov'07 http://www.CraneSoftwrights.com/s/bc
> Legal business disclaimers: http://www.CraneSoftwrights.com/legal
>
----
Eliot Kimber | Senior Solutions Architect | Really Strategies, Inc.
email: ekimber@xxxxxxxxxxxx <mailto:ekimber@xxxxxxxxxxxx>
office: 610.631.6770 | cell: 512.554.9368
2570 Boulevard of the Generals | Suite 213 | Audubon, PA 19403
www.reallysi.com <http://www.reallysi.com> | http://blog.reallysi.com
<http://blog.reallysi.com> | www.rsuitecms.com <http://www.rsuitecms.com>
|