Re: [xsl] Using a parameter in a select within a recursive template

Subject: Re: [xsl] Using a parameter in a select within a recursive template
From: Josh Canfield <joshcanfield@xxxxxxxxx>
Date: Tue, 21 Sep 2004 14:37:23 -0700
Just a minor point: 

<xsl:param name="number" select="141"/> is correctly treated as a
number because the first character of an element name must be a letter
or underscore (_)

Josh

On Sun, 19 Sep 2004 00:31:07 -0700, M. David Peterson
<m.david@xxxxxxxxxx> wrote:
> Hello again Helen :)
> 
> Yeah, this stylesheet has several things keeping it from working.  First, your
> xsl:param elements need to either not use the select attribute and just set the
> value within the opening and closing tags or use single quotes inside the select
> attribute to tell the processor to use the contents as an absolute value.  The
> way its setup right now you are telling the processor to set there value to the
> value of the elements named 141 and 19.
> 
> The second problem is that you are telling the processor to output the literal
> string value of the concatenation of the string "FIELD_" and the value of
> $number.  The way around this is to instead do a test using the local-name()
> function to compare to your concated string value and output the value of the
> element that matches...
> 
> I would try something like the following.  Note: I excluded the fo elements to
> simplify -- just add it back as needed.  I also lowered the number values of the
> number and cols params to simplify the input and output for testing.
> 
> <?xml version="1.0"?>
> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0">
> 
>   <xsl:template match="/">
>     <xsl:call-template name="adddata">
>       <xsl:with-param name="number" select="'5'"/>
>       <xsl:with-param name="cols" select="'0'"/>
>     </xsl:call-template>
>   </xsl:template>
> 
>   <xsl:template name="adddata">
>     <xsl:param name="number"/>
>     <xsl:param name="cols"/>
> 
>     <xsl:choose>
>       <xsl:when test="$number >= $cols">
>             <xsl:value-of select="//*[local-name() = concat('FIELD_',$number)]"/>
>         <xsl:call-template name="adddata">
>           <xsl:with-param name="number" select="$number - 1"/>
>           <xsl:with-param name="cols" select="$cols" />
>         </xsl:call-template>
>       </xsl:when>
>       <xsl:otherwise>
>         <xsl:value-of select="$cols"/>
>       </xsl:otherwise>
>     </xsl:choose>
> 
>   </xsl:template>
> </xsl:stylesheet>
> 
> Which when you process this XML:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <fields>
>   <FIELD_1>test of field 1</FIELD_1>
>   <FIELD_2>test of field 2</FIELD_2>
>   <FIELD_3>test of field 3</FIELD_3>
>   <FIELD_4>test of field 4</FIELD_4>
>   <FIELD_5>test of field 5</FIELD_5>
> </fields>
> 
> Looks like this:
> 
> test of field 5test of field 4test of field 3test of field 2test of field 10
> 
> Hope this helps!
> 
> Best regards,
> 
> <M:D/>
> 
> 
> 
> Sean & Helen wrote:
> > Hi everyone,
> > I am attempting to use a parameter within a recursive template to select a
> > different node whenever the template loops.
> >
> > My datafile looks something like this:
> >
> > <FIELD_1>
> > <FIELD_2>
> > <FIELD_3>
> > <FIELD_4>
> > <FIELD_5>
> > ...
> > <FIELD_142>
> >
> > I would like to loop through and use the incremented parameter to select the
> > contents of the node. So far I have been trying to use this template:
> >
> > <xsl:template name="adddata">
> >      <xsl:param name="number" select="141" />
> >      <xsl:param name="cols" select="19" />
> >
> >      <xsl:choose>
> >      <xsl:when test="$number &lt;= $cols">
> >         <xsl:value-of select="cols"/>
> >      </xsl:when>
> >      <xsl:otherwise>
> >         <xsl:call-template name="adddata">
> >          <xsl:with-param name="number" select="$number - 1"/>
> >          <xsl:with-param name="cols" select="$cols" />
> >         </xsl:call-template>
> >            <fo:table-cell >
> >                <fo:block><xsl:value-of select="concat('FIELD_',$number)"
> > /></fo:block>
> >           </fo:table-cell>
> >     </xsl:otherwise>
> >   </xsl:choose>
> > </xsl:template>
> >
> > However, the output gives me:
> > FIELD_1 FIELD_2 FIELD_3 etc....
> > rather than the data contained within these nodes. Can someone shed some
> > light for me?
> >
> > TIA,
> > Helen.

Current Thread