xsl-list
[Top] [All Lists]

Re: Printing ancestor elements of all element nodes

2005-08-04 00:41:53
This is also working (I corrected my original approach). I am happy
with the responses so far..

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
        
<xsl:output method="html" indent="yes"/>
        
  <xsl:template match="/">
    <xsl:for-each select="//*">
       Element <xsl:value-of select="name()" /><xsl:text> -
&#xa;&#xa;</xsl:text>
       Ancestors of the element are <xsl:text>&#xa;</xsl:text>
       <xsl:call-template name="printAncestors">
          <xsl:with-param name="node" select="." />
       </xsl:call-template>
    </xsl:for-each>     
  </xsl:template>

  <xsl:template name="printAncestors">
    <xsl:param name="node" />
    
    <xsl:choose>
      <xsl:when test="($node/parent::*[1] or $node/parent::*[1]/parent::*[1])">
        <xsl:value-of select="name($node/parent::*[1])" /><xsl:text>,</xsl:text>
        <xsl:call-template name="printAncestors">
          <xsl:with-param name="node" select="$node/parent::*[1]" />
        </xsl:call-template>
      </xsl:when>
    </xsl:choose>
  </xsl:template>
  
</xsl:stylesheet>

Regards,
Mukul

On 8/3/05, Mukul Gandhi <gandhi(_dot_)mukul(_at_)gmail(_dot_)com> wrote:
Thank you David! This is marvellous..  My attempt was -

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

   <xsl:output method="text" />

   <xsl:template match="/">
      <xsl:for-each select="//*">
         Element name <xsl:value-of select="name()"
/><xsl:text>&#xa;</xsl:text>
         Ancestor elements of this element
         <xsl:text>&#xa;</xsl:text>
         <xsl:text>&#xa;</xsl:text>
         <xsl:call-template name="printAncestors">
             <xsl:with-param name="node" select="." />
         </xsl:call-template>
      </xsl:for-each>
   </xsl:template>

   <xsl:template name="printAncestors">
      <xsl:param name="node" />

      <xsl:choose>
                       <xsl:when test="$node/parent::*">
               <xsl:value-of select="name($node)" />,
               <xsl:call-template name="printAncestors">
                  <xsl:with-param name="node"
select="$node/ancestor::*"/>
               </xsl:call-template>
                       </xsl:when>
                       <xsl:otherwise>
              <xsl:value-of select="name($node)" />,
                       </xsl:otherwise>
          </xsl:choose>
   </xsl:template>

</xsl:stylesheet>

But this did'nt work.. ;)

THANK YOU.

Regards,
Mukul

On 8/3/05, David Carlisle <davidc(_at_)nag(_dot_)co(_dot_)uk> wrote:

<xsl:for-each select="//*">
 <xsl:text>&#10;</xsl:text>
 <xsl:value-of select="name()"/>
 <xsl:text> - </xsl:text>
 <xsl:for-each select="ancestor::*">
 <xsl:sort select="-count(ancestor::*)"/>
 <xsl:value-of select="name()"/>
 <xsl:if tets="position()!=last()">,</xsl:if>
 </xsl:for-each>
 </xsl:for-each>

________________________________________________________________________
This e-mail has been scanned for all viruses by Star. The
service is powered by MessageLabs. For more information on a proactive
anti-virus service working around the clock, around the globe, visit:
http://www.star.net.uk
________________________________________________________________________

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--