Fwd: Re: limitations of preceding-sibling and following-sibling

Subject: Fwd: Re: limitations of preceding-sibling and following-sibling
From: Earl Bingham <earl@xxxxxxxxxxxxxx>
Date: Sat, 23 Oct 1999 13:32:31 -0700 (PDT)
Now I have an even more complicated problem that I really
need to resolve. I need to break up the text and bullets into
sections. Here is my example file:

<?xml version="1.0"?>
<textItems>
   <title>Here is my first title!</title>
   <bullet>first group first bullet</bullet>
   <bullet>first group second bullet</bullet>
   <normal>first group first normal</normal>
   <bullet>first group third bullet</bullet>
   <title>Here is my second title!</title>
   <bullet>second group first bullet</bullet>
   <normal>second group first normal</normal>
   <bullet>second group second bullet</bullet>
   <bullet>second group third bullet</bullet>
</textItems>

Then the output would need to be:

<output>
  <section>
    <sectionTitle>here is my first title</sectionTitle>
    <ul>
      <li>first group first bullet</li>
      <li>first group second bullet</li>
    </ul>
    <text>first group first normal</text>
  </section>
  <section>
    <sectionTitle>Here is my second title</sectionTitle>
    <ul>
       <li>second group first bullet</li>
    </ul>
    <text>second group first normal</text>
  </section>
</output>


***********************BEGIN FORWARD MESSAGE********************
At 99/10/21 20:14 -0700, Earl Bingham wrote:
>I'm hitting a limitation of xPath with
>preceding-sibling and following-sibling.

Actually, what you are missing is appropriate use of the powerful construct 
.... it is so flexible to provide so many options that it isn't as limited 
as you claim.

>  In
>which I'm having trouble creating the following:
>
><ul>
>  <li>first list element</li>
>  <li>second list element</li>
><ul>
><text>some text</text>
><ul>
>  <li>another list</li>
>  <li>second anon list</li>
></ul>
>
>
>from the following:
>
><textItems>
>   <bullet>first list element</bullet>
>   <bullet>second list element</bullet>
>   <normal>some text</normal>
>   <bullet>another list</bullet>
>   <bullet>second anon list</bullet>
></textItems>
>
>I have the following stylesheet that will grab
>the first group of bullets, but it will grab
>all the bullets and not seperate the other
>group of bullets.

That is because you asked for all.

>These appears to be a limitation
>of axis groupings.

Not at all.  Again, the axis groups are very flexible, you just have to ask 
for what you want.

><xsl:for-each select="//normal|//bullet">
><xsl:choose>
>   <xsl:when select="self::normal">
>   </xsl:when>
>   <xsl:when select="self::bullet">
>     <xsl:if test="not(preceding-sibling::bullet)">
>       <ul>
>       <xsl:for-each select="self::bullet|following::bullet">
>         <li><xsl:value-of select="."/></li>
>       </xsl:for-each>
>       </ul>
>     </xsl:if>
>   </xsl:when>
></xsl:choose>
></xsl:for-each>

It may help to view the axis illustration graphic on slide 39 of the free 
download preview available on our web site.

When you say in your stylesheet "following::bullet" you are asking for 
*all* elements that follow that are named "bullet".  From your description 
of what you want, you selection is related to the following siblings.

Consider the differences:

    following-sibling::bullet - all following siblings named "bullet"
    following-sibling::*[self::bullet] - all following siblings named "bullet"
    following-sibling::bullet[1] - the first following sibling named "bullet"
    following-sibling::*[1] - the immediately following sibling regardless
                              of that sibling's name
    following-sibling::*[1][self::bullet] - the immediate following sibling
                                            only if it is named "bullet"

It is the last one that you need for what you want.

So you see there aren't "limitations" to these axes ... they were designed 
to be *very* flexible and we have a lot of power to ask for whatever it is 
we need.

A working example is below.

I hope this helps.

........... Ken


T:\earl>type earl.xml
<?xml version="1.0"?>
<textItems>
   <bullet>first list element</bullet>
   <bullet>second list element</bullet>
   <normal>some text</normal>
   <bullet>another list</bullet>
   <bullet>second anon list</bullet>
</textItems>

T:\earl>type earl.xsl
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                 version="1.0">

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

<xsl:template match="textItems">
   <result>
     <xsl:apply-templates/>
   </result>
</xsl:template>

<xsl:template match="bullet">
   <xsl:choose>
         <!--when there is an immediate sibling of the same name,
             then assume this node has already been addressed by
             the first of the contiguous siblings-->
     <xsl:when test="preceding-sibling::*[1][self::bullet]"/>
     <xsl:otherwise><!--at the first of a group of siblings-->
       <ul><!--"walk" along all sibling bullets for list items-->
         <xsl:apply-templates select="." mode="sibling-bullets"/>
       </ul>
     </xsl:otherwise>
   </xsl:choose>
</xsl:template>

         <!--place each of a group of adjacent siblings-->
<xsl:template match="bullet" mode="sibling-bullets">
   <li><xsl:apply-templates/></li> <!--put out this one-->
                                   <!--go to next one-->
   <xsl:apply-templates
             select="following-sibling::*[1][self::bullet]"
             mode="sibling-bullets"/>
</xsl:template>

<xsl:template match="normal">   <!--other stuff-->
   <text><xsl:apply-templates/></text>
</xsl:template>

</xsl:stylesheet>

T:\earl>call xsl earl.xml earl.xsl earl.out
T:\earl>type earl.out
<result>
   <ul>
<li>first list element</li>
<li>second list element</li>
</ul>

   <text>some text</text>
   <ul>
<li>another list</li>
<li>second anon list</li>
</ul>

</result>

T:\earl>

--
G. Ken Holman                    mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
Crane Softwrights Ltd.             http://www.CraneSoftwrights.com/s/
Box 266, Kars, Ontario CANADA K0A-2E0   +1(613)489-0999   (Fax:-0995)
Web site: XSL/XML/DSSSL/SGML services, training, libraries, products.
Practical Transformation Using XSLT and XPath      ISBN 1-894049-02-0
Next instructor-led training:  1999-11-08, 1999-11-09, 1999-12-05/06,
-                1999-12-07, 2000-02-27/28, 2000-05-11/12, 2000-05-15


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

***********************END FORWARD MESSAGE***********************	

Earl Bingham
1568 Plateau Avenue
Los Altos Hills, CA 94024
H: (650) 559-1738
C: (408) 806-6642

____________________________________________________
get your permanent, free email at http://www.flashemail.com


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


Current Thread