Re: [xsl] Recursive substitution

Subject: Re: [xsl] Recursive substitution
From: Agnisys <agnisys@xxxxxxxxx>
Date: Thu, 3 Nov 2005 12:53:14 -0800 (PST)
Unfortunately my problem is that I did want to use a "copy-of" so that the nodes being referred to
by the <ref> tag are actually "stitched" into the tree.
I tried to use the following but it doesn't seem to do the job. Note the use of "copy-of" and
"ancestor::define".

Any pointers?
Thanks,
Anupam.

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="2.0">
  
    <xsl:key name="r" match="define" use="@name"/>
    
    <xsl:template match="x">
        <xsl:apply-templates select="block"/>
    </xsl:template>
    
    <xsl:template match="reg">
      <xsl:if test="not(ancestor::define)">
        Register: <xsl:value-of select="@name"/><br/>
      </xsl:if>
    </xsl:template>
   
    
    <xsl:template match="ref[@name]"> 
        <xsl:variable name="x">
            <xsl:copy-of select="key('r',@name)"/>
        </xsl:variable>
        <xsl:apply-templates select="$x"/>
    </xsl:template>
   
</xsl:stylesheet>


--- David Carlisle <davidc@xxxxxxxxx> wrote:

> 
> I see you're using 2.0, it's best to say explictly if you want a 2.0
> answer as the current version is still 1.0 (2.0 is still in draft)
> 
> I don't think you need to keep copying nodes and build copies of the
> tree, you want to recursively walk over the existing tree not copy
> branches of it:
> 
> <x>
> 
>     <define name="DEF1">
>         <reg name="REG1"/>
>     </define>
> 
>     <define name="DEF2">
>         <reg name="REG2"/>
>         <ref name="DEF1"/>
>     </define>
> 
>      <block name="block1">
>           <reg name="REG3"/>
>           <ref name="DEF2"/>
>      </block>
> 
> </x>
> 
> 
> 
> 
> 
> 
> <xsl:stylesheet version="2.0"
>               xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> 
> <xsl:key name="r" match="define" use="@name"/>
> 
> <xsl:template match="x">
>  <xsl:apply-templates select="block"/>
> </xsl:template>
> 
> <xsl:template match="reg">
> Register: <xsl:value-of select="@name"/>
> </xsl:template>
> 
> <xsl:template match="ref">
>  <xsl:apply-templates select="key('r',@name)"/>
> </xsl:template>
> 
> </xsl:stylesheet>
> 
> 
> 
> $ saxon8 ref.xml ref.xsl
> <?xml version="1.0" encoding="UTF-8"?>
> 
> Register: REG3
> 
> 
> Register: REG2
> 
> 
> Register: REG1
> 
> ________________________________________________________________________
> 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
> ________________________________________________________________________
> 
> 



		
__________________________________ 
Yahoo! FareChase: Search multiple travel sites in one click.
http://farechase.yahoo.com

Current Thread