xsl-list
[Top] [All Lists]

Re: Problem with xslt recursion

2004-02-10 10:27:41
Hi..
Thanks a lot David, for the quick reply and putting up
with the inconsistencies in the code that i sent..
Taking your explaination I have solved the problem by
saying..

<xsl:value-of
select="ResourceTypeSet/Type[number($Index)]"/>

instead of
<xsl:value-of select="ResourceTypeSet/Type[$Index]"/>

The purpose is solved but i want to know if it is the
right thing to do....

Also i have a very long standing problem with
specifying dynamic xpaths...

Suppose my xml is

<a>
  <b>
     <c>try</c>
  </b>
</a>

and my xsl is something like...

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:template match="/">
<xsl:variable name="path">c</xsl:variable>
<!-- Now i am trying to access the dynamic path a/b/c
-->
<xsl:value-of select="/a/b/$path"/>
<!-- The error shown is Nodetest expected..-->

<!-- Next i try concatenating the values in a variable
-->

<xsl:variable name="fullpath"
select="concat('/a/b/',$path)"/>

<!-- and then try to access the value for this path
-->

<xsl:value-of select="$fullpath"/>
<!-- Here the xpath /a/b/c is displayed. So how do i
use the variable path to actually get the value for
that path which happens to be "try" in this case-->
                
</xsl:template>
</xsl:stylesheet>


--- David Carlisle <davidc(_at_)nag(_dot_)co(_dot_)uk> wrote:

  and i have a recursive call to a template whose
  function is to concatenate all the values with the
tag

You don't need recursion to do that
<xsl:copy-of select="Type/text()"/>
is all you need.


However

<xsl:value-of select ="ResourceTypeSet/Type[$In]"/>

I assume thst isn't your actual code as $In is not
defined, assuming
that you have

<xsl:value-of select
="ResourceTypeSet/Type[$Index]"/>

then your problem is that the short hand Type[3] for
Type[position()=3]
only tales place if the thing in teh [] is a number.

$Index starts off as a number
<xsl:with-param name="Index" select="1"/>

but then you redeclare it to be a result tree
fragment
<xsl:with-param name="Index"><xsl:value-of
select="$Index+1"/></xsl:with-param>

If you use a result tree fragment as a boolean then
it is always true as
it corresponds to a non empty node set so

ResourceTypeSet/Type[$Index]

is
ResourceTypeSet/Type[true()]

which is
ResourceTypeSet/Type

ie it selects all the Tyope nodes, then 
<xsl:value-of

always returns the value of (only) the first node
selected, so you will
always get the first one back.

David


-- 
http://www.dcarlisle.demon.co.uk/matthew


________________________________________________________________________
This e-mail has been scanned for all viruses by Star
Internet. 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



=====
Luv
Roopesh
Software Engineer 
Verizon Data Services India 
[98842-40222]

__________________________________________________________________

One manages uncertainty; one does not solve it.  
Eliminating uncertainty eliminates opportunity.  
Chaos is the engine of evolution.

__________________________________
Do you Yahoo!?
Yahoo! Finance: Get your refund fast by filing online.
http://taxes.yahoo.com/filing.html

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



<Prev in Thread] Current Thread [Next in Thread>