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

Subject: Re: [xsl] Count preceeding sibling but in different element
From: Mukul Gandhi <gandhi.mukul@xxxxxxxxx>
Date: Fri, 5 Aug 2005 12:17:36 +0530
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