xsl-list
[Top] [All Lists]

Re: Using a parameter in a select within a recursive template

2004-09-21 14:37:23
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(_dot_)david(_at_)mdptws(_dot_)com> 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.


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