xsl-list
[Top] [All Lists]

Re: [xsl] Flat to Structured: Handling List Items with Subordinate Paragraphs

2009-05-26 16:32:29
On 5/26/09 3:04 PM, "G. Ken Holman" <gkholman(_at_)CraneSoftwrights(_dot_)com> 
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="{(_at_)container}">
           <!--populate the container-->
           <xsl:for-each-group select="current-group()"
                               group-starting-with="*[(_at_)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="{(_at_)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(_at_)CraneSoftwrights(_dot_)com
Male Cancer Awareness Nov'07  http://www.CraneSoftwrights.com/s/bc
Legal business disclaimers:  http://www.CraneSoftwrights.com/legal


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--


----
Eliot Kimber | Senior Solutions Architect | Really Strategies, Inc.
email:  ekimber(_at_)reallysi(_dot_)com <mailto:ekimber(_at_)reallysi(_dot_)com>
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> 


--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--