Re: [xsl] Finding sequences of same element

Subject: Re: [xsl] Finding sequences of same element
From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx>
Date: Wed, 9 Feb 2005 00:38:06 -0800 (PST)
Hi Simon,
  Please try this 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="/A">  
  <A>
   <xsl:for-each select="*">
     <xsl:choose>
       <xsl:when test="not(self::B)">
         <xsl:copy-of select="." />
       </xsl:when>
       <xsl:when test="name(preceding-sibling::*[1])
!= 'B'">
         <D>
           <xsl:copy-of select="." />
           <xsl:call-template name="create-group">
             <xsl:with-param name="list"
select="following-sibling::*" />
           </xsl:call-template>
         </D>
       </xsl:when>
     </xsl:choose>
   </xsl:for-each>
  </A> 
 </xsl:template>
 
 <xsl:template name="create-group">
   <xsl:param name="list" />
      
   <xsl:if test="name($list[1]) = 'B'">
     <xsl:copy-of select="$list[1]" />
     <xsl:call-template name="create-group">
       <xsl:with-param name="list"
select="$list[position() > 1]" />
     </xsl:call-template>
   </xsl:if>   
 </xsl:template>
 
</xsl:stylesheet>

Regards,
Mukul

--- Simon Kissane <skissane@xxxxxxxxx> wrote:

> Hi
> 
> Suppose I have an input document:
> <A><B X="1"/><B X="2"/><B X="3"/><C X="4"/><B
> X="5"/><B X="6"/><B X="7"/></A>
> 
> Now, suppose I wish to group together consecutive B
> elements, giving a
> result document like this:
> <A><D><B X="1"/><B X="2"/><B X="3"/></D><C
> X="4"/><D><B X="5"/><B
> X="6"/><B X="7"/></D></A>
> 
> How can I do this? (I would prefer not to use
> recursive templates, but
> rather for-each, if that is at all possible...)
> 
> I think I can find the initial element of these
> sequences, like so:
>   B[not(preceding-sibling::*) or
> preceding-sibling::*[0][not(self::B)]]
> This, I think, should select all B for which there
> are either no
> preceeding sibling elements, or for which the
> immediately preceeding
> sibling element is not a B element. Thus, in the
> above example, it
> would pick B[@X=1] and B[@X=5].
> 
> But, given each initial sequence element, how can I
> find the remaining
> nodes in the sequence?  With the initial sequence
> element as the
> context node, I could do:
>     .|following-sibling::B
> But that will also pick up B[@X=5] and B[@X=6] when
> the context node is B[@X=1].
> 
> Is there a predicate test I could use on
> following-sibling::B to
> restrict it only to the current sequence of B
> elements?
> 
> Thanks
> 
> Simon Kissane



		
__________________________________ 
Do you Yahoo!? 
The all-new My Yahoo! - What will yours do?
http://my.yahoo.com 

Current Thread