RE: [xsl] Count preceeding sibling but in different element

Subject: RE: [xsl] Count preceeding sibling but in different element
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 8 Aug 2005 00:13:58 +0100
There is no function called preceeding. If there were one, it would be spelt
"preceding". There are axes named "preceding" and "preceding-sibling", but
axes are not functions.

Michael Kay
http://www.saxonica.com/
 

> -----Original Message-----
> From: Taco Fleur (@DataBroker) [mailto:taco@xxxxxxxxxxxxx] 
> Sent: 07 August 2005 23:45
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: RE: [xsl] Count preceeding sibling but in different element
> 
> Thanks guys, 
> It appears there is a function called "preceeding" Which does 
> the trick
> nicely.
> thanks 
> 
> -----Original Message-----
> From: Mukul Gandhi [mailto:gandhi.mukul@xxxxxxxxx] 
> Sent: Friday, 5 August 2005 4:48 PM
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: Re: [xsl] Count preceeding sibling but in different element
> 
> 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="/element1">
>    <element1>
>      <xsl:for-each select="*">
>        <xsl:copy>
>          <xsl:call-template name="numberingTemplate">
>            <xsl:with-param name="node-set" select="*" />
>          </xsl:call-template>
>        </xsl:copy>
>      </xsl:for-each>
>    </element1>
> </xsl:template>
>  
> <xsl:template name="numberingTemplate">
>    <xsl:param name="node-set" />
>    
>    <xsl:for-each select="$node-set">
>      <xsl:element name="{name()}">
>        <xsl:attribute name="number"><xsl:value-of
> select="count(self::* | preceding::step)" /></xsl:attribute>
>      </xsl:element>
>    </xsl:for-each>
> </xsl:template>
>  
> </xsl:stylesheet> 
> 
> For e.g. when it is applied to XML -
> <element1>
>  <element2>
>     <step/>
>     <step/>
>  </element2>
>  <element3>
>     <step/>
>  </element3>
>  <element4>
>     <step/>
>     <step/>
>     <step/>
>  </element4>
> </element1>
> 
> The output produced is -
> <?xml version="1.0" encoding="UTF-8"?>
> <element1>
>    <element2>
>       <step number="1"/>
>       <step number="2"/>
>    </element2>
>    <element3>
>       <step number="3"/>
>    </element3>
>    <element4>
>       <step number="4"/>
>       <step number="5"/>
>       <step number="6"/>
>    </element4>
> </element1>
> 
> Regards,
> Mukul
> 
> 
> On 8/5/05, Taco Fleur <taco@xxxxxxxxxxxxx> wrote:
> > I am wanting to count all preceeding sibling (steps) but 
> they could be 
> > in different elements
> > 
> > <element1>
> >  <element2>
> >     <step/>
> >     <step/>
> >  </element2>
> >  <element3>
> >     <step/>
> >  </element3>
> >  <element4>
> >     <step/>
> >     <step/>
> >     <step/>
> >  </element4>
> > </element1>
> > 
> > The output I am after is
> > 
> > <element1>
> >  <element2>
> >     <step number="1" />
> >     <step number="2"/>
> >  </element2>
> >  <element3>
> >     <step number="3"/>
> >  </element3>
> >  <element4>
> >     <step number="4"/>
> >     <step number="5"/>
> >     <step number="6"/>
> >  </element4>
> > </element1>
> > 
> > I have have the following which works fine on every step within an 
> > element, i.e.
> > 
> >  <element3>
> >     <step/>
> >  </element3>
> >  <element4>
> >     <step/>
> >     <step/>
> >     <step/>
> >  </element4>
> > 
> > Would become
> > 
> >  <element3>
> >     <step number="1"/>
> >  </element3>
> >  <element4>
> >     <step number="1"/>
> >     <step number="2"/>
> >     <step number="3"/>
> >  </element4>
> > 
> > <xsl:template match="step">
> >  <xsl:copy>
> >  <xsl:copy-of select="@*" />
> >  <!-- Calculate the step number -->
> >  <xsl:attribute name="number">
> >   <xsl:value-of select="count( preceding-sibling::step ) + 1" />  
> > </xsl:attribute>  <xsl:apply-templates />  </xsl:copy> 
> </xsl:template>
> > 
> > Can anyone help?
> > Thanks
> > ________________________________
> > Taco Fleur - E-commerce Development Manager Shelco Searches 
> & Services 
> > An Authorised ASIC Information Broker www.shelco.com.au 
> > <blocked::http://www.shelco.com.au>
> > Ph: + 61 7 3236 2605

Current Thread