Subject: RE: Count preceeding sibling but in different element
From: "Taco Fleur \(@DataBroker\)" <taco@xxxxxxxxxxxxx>
Date: Mon, 8 Aug 2005 08:44:50 +1000
|
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: 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
|