Re: [xsl] Problems copying elements recursively.

Subject: Re: [xsl] Problems copying elements recursively.
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Mon, 10 Feb 2003 10:00:09 +0000
Dimitre wrote:
> "Imrran Wahid" <devguy2003@xxxxxxxxx> wrote in message
> news:20030209234334.51979.qmail@xxxxxxxxxxxxxxxxxxxxxxxxx
>> Pardon me for asking what may be a simple question,
>> but I am not very well versed in xsl. How do I
>> translate the count to number of spaces(&#160)?
> The simplest (to understand) way is to have an xsl:variable
> containing a sufficiently long string of spaces. Then take the exact
> number of spaces using the substring() function.
> Another way (when one doesn't know the maximum possible number of
> spaces that will be needed) is to use a recursive named template --
> e.g. one from exslt, or this one:
> Or use the "iter" template from the FXSL library.
> The last solution is the most generic and can be used to implement
> any iteration of the type "Do something N times".

Just to add to Dimitre's suggestion: since Imrran is counting
ancestors to work out how many non-breaking spaces to add, it would be
a good idea to use one of the above methods to create an $indent
number of spaces (e.g. in an $indent-spaces global variable), and then
use xsl:for-each to iterate over the ancestors to multiply that number
of non-breaking spaces:

  <xsl:for-each select="ancestor::*">
    <xsl:value-of select="$indent-spaces" />

Another method that I use when formatting a tree is to pass down the
previous indent as a parameter from parent to child, adding an indent
on each step. Something like:

<xsl:template match="*">
  <xsl:param name="indent" />
    <xsl:with-param name="indent"
                    select="concat($indent, $indent-spaces)" />

Again, the $indent-spaces that you add to the indent at each level may
need to be constructed dynamically from a number using one of
Dimitre's suggestions above.


Jeni Tennison

 XSL-List info and archive:

Current Thread