xsl-list
[Top] [All Lists]

Re: Recursive substitution

2005-11-03 13:53:14
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[(_at_)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(_at_)nag(_dot_)co(_dot_)uk> 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
________________________________________________________________________

--~------------------------------------------------------------------
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>
--~--





                
__________________________________ 
Yahoo! FareChase: Search multiple travel sites in one click.
http://farechase.yahoo.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>
--~--