Re: [xsl] Concatenating the attribute values of ancestors

Subject: Re: [xsl] Concatenating the attribute values of ancestors
From: Mukul Gandhi <mukul_gandhi@xxxxxxxxx>
Date: Fri, 8 Jul 2005 00:55:55 -0700 (PDT)
Probably some sort of following logic is required..
Please be beware, this is not tested.

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";     
version="1.0">

<xsl:output method="xml" indent="yes" />
  
<xsl:template match="node() | @*" priority="5">
  <xsl:copy>
    <xsl:apply-templates select="node() | @*" />
  </xsl:copy>
</xsl:template>    
  
<xsl:template match="*" priority="6">
    <xsl:copy>
      <xsl:apply-templates select="@*" />
      <xsl:attribute name="newSeq">
        <xsl:call-template
name="concatenate-ancestor-attributes">
           <xsl:with-param name="attr_value"
select="''" />
           <xsl:with-param name="anestors"
select="ancestor::*" />
        </xsl:call-template>
      </xsl:attribute>
      <xsl:apply-templates/>
    </xsl:copy>
</xsl:template>
  
<xsl:template name="concatenate-ancestor-attributes">
    <xsl:param name="attr_value" />
    <xsl:param name="ancestors" />
    
    <xsl:choose>
      <xsl:when test="parent::*">
        <xsl:call-template
name="concatenate-ancestor-attributes">
	  <xsl:with-param name="attr_value"
select="concat($attr_value, parent::*/@seq)" />
	  <xsl:with-param name="anestors"
select="ancestor::*" />
        </xsl:call-template>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="$attr_value" />
      </xsl:otherwise>
    </xsl:choose>
</xsl:template>
  
</xsl:stylesheet>

Regards,
Mukul


--- Lakshmi narayana <lchintala@xxxxxxxxxxxx> wrote:

> 
> Hi
> I want a template which adds the attribute values of
> its ancestors and
> create an attribute to the current
> node. The value to this attribute is the result of
> conactination of all the
> node values added of its parents.
> For example,
> <A seq="1">
> 	<B seq="2" />
> 	<C seq="3">
> 		<D seq="4" />
> 	</C>
> </A>
> In the above xml, I want to concatenate all the seq
> values of all ancestors
> and its seq value also. And add new attribute
> to the current node as newSeq with the result
> concatenated value.
> Note : if seq attribute is not there concatenate
> value "0".
> Output should look like this.
> <A seq="1" newSeq="1">
> 	<B seq="2" newSeq="12"/>
> 	<C seq="3" newSeq="13">
> 		<D seq="4"  newSeq="134"/>
> 	</C>
> 	<E  newSeq="10">
> 		<F seq="5"  newSeq="105"/>
> 	</E>
> </A>
> 
> Thanks
> Laxmi Narayana
> 
> 



		
____________________________________________________
Sell on Yahoo! Auctions  no fees. Bid on great items.  
http://auctions.yahoo.com/

Current Thread