xsl-list
[Top] [All Lists]

Re: Problems copying elements recursively.

2003-02-10 09:09:15
Thanks to Jeni Tennison, Michael Kay, Dimitre
Novatchev and all others who helped me understand XSL
better wrt to a solution to this problem. I have
ordered Michael Kay's and Jeni Tennison's book to get
me up to speed with XSLT.

Imrran
 
--- Jeni Tennison <jeni(_at_)jenitennison(_dot_)com> wrote:
Dimitre wrote:
"Imrran Wahid" <devguy2003(_at_)yahoo(_dot_)com> wrote in
message


news:20030209234334(_dot_)51979(_dot_)qmail(_at_)web9206(_dot_)mail(_dot_)yahoo(_dot_)com(_dot_)(_dot_)(_dot_)
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( )?

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:



http://sources.redhat.com/ml/xsl-list/2001-07/msg01040.html

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" />
  </xsl:for-each>

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:apply-templates>
    <xsl:with-param name="indent"
                    select="concat($indent,
$indent-spaces)" />
  </xsl:apply-templates>
  ...
</xsl:template>

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.
  
Cheers,

Jeni

---
Jeni Tennison
http://www.jenitennison.com/


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



__________________________________________________
Do you Yahoo!?
Yahoo! Mail Plus - Powerful. Affordable. Sign up now.
http://mailplus.yahoo.com

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



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