RE: [xsl] Printing ancestor elements of all element nodes

Subject: RE: [xsl] Printing ancestor elements of all element nodes
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Wed, 3 Aug 2005 12:35:05 +0100
<xsl:template match="*" mode="print-ancestors">
  <xsl:value-of select="concat(name(), ',')"/>
  <xsl:apply-templates select=".." mode="print-ancestors"/>
</xsl:template>

<xsl:template match="/" mode="print-ancestors">root</xsl:template>

<xsl:template match="/">
  <xsl:for-each select="//*">
    <xsl:value-of select="name()"/>
    <xsl:text> - </xsl:text>
    <xsl:apply-templates select=".." mode="print-ancestors"/>
    <xsl:text>&#xa;</xsl:text>
  </xsl:for-each>
</xsl:template>

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

> -----Original Message-----
> From: Mukul Gandhi [mailto:gandhi.mukul@xxxxxxxxx] 
> Sent: 03 August 2005 12:04
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Printing ancestor elements of all element nodes
> 
> I have this XML document -
> 
> <root>
>   <a>
>     <b>
>        <c/>
>        <d/>
>        <e>
>           <f>
>             <g/>                      
>             <h/>        
>           </f>       
>        </e>    
>     </b>  
>   </a>
> </root>
> 
> The following output is desired -
> root -
> a - root
> b - a,root
> c - b,a,root
> d - b,a,root
> e - b,a,root
> f - e,b,a,root
> g - f,e,b,a,root
> h - f,e,b,a,root
> 
> How to do this with XSLT?
> 
> I'll be testing this with both Xalan-J 2.6.0 and Saxon 8.4. I need a
> XSLT 1.0 solution.
> 
> Regards,
> Mukul

Current Thread