recursive xsl

M

monmonja

Hi i'm new to xsl and i have been using smarty php templating but its
just so hard to read codes in smarty/php/flash than xml/xsl/flash, i
rather sacrifice speed then not being able to read code after 3 months.
So my problem goes like this.
I have an xml that like this
<avatar>
<avatarId>1</avatarId>
<avatarName>MyNewAvatar</avatarName>
<avatarFile>
<fileName>MyNewAvatar.swf</fileName>
</avatarFile>
<avatarColor>
<color>
<colorId>1</colorId>
<colorName>BLUE</colorName>
</color>
<color>
<colorId>2</colorId>
<colorName>BLACK</colorName>
</color>
<color>
<colorId>3</colorId>
<colorName>RED</colorName>
</color>
<color>
<colorId>4</colorId>
<colorName>GREEN</colorName>
</color>
</avatarColor>
</avatar>

i want something like this
<div>
<div>BLUE BLACK</div>
<div><object ...... src="MyNewAvatar.swf" ... /></div>
<div>RED GREEN</div>
</div>

Is there a way to suspend the recursive loop say after 2 or more
colors? then go back to it the N +1 place? Any help would be big so i
need to thank you in advance...
 
P

p.lepin

monmonja said:
<avatar>
<avatarId>1</avatarId>
<avatarName>MyNewAvatar</avatarName>
<avatarFile>
<fileName>MyNewAvatar.swf</fileName>
</avatarFile>
<avatarColor>
<color>
<colorId>1</colorId>
<colorName>BLUE</colorName>
</color>
<color>
<colorId>2</colorId>
<colorName>BLACK</colorName>
</color>
<color>
<colorId>3</colorId>
<colorName>RED</colorName>
</color>
<color>
<colorId>4</colorId>
<colorName>GREEN</colorName>
</color>
</avatarColor>
</avatar>

i want something like this
<div>
<div>BLUE BLACK</div>
<div><object ...... src="MyNewAvatar.swf" ... /></div>
<div>RED GREEN</div>
</div>

Is there a way to suspend the recursive loop say after 2
or more colors? then go back to it the N +1 place?

I'm not sure what you mean and why do you need a recursive
loop in the first place. Something like the following
transformation should do the trick:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="avatar">
<xsl:variable name="colors-1"
select=
"
avatarColor/color[colorId&gt;=1 and colorId&lt;=2]
"/>
<xsl:variable name="colors-2"
select=
"
avatarColor/color[colorId&gt;=3 and colorId&lt;=4]
"/>
<div>
<div>
<xsl:apply-templates
select="$colors-1" mode="color-names"/>
</div>
<div><object src="{avatarFile/fileName}"/></div>
<div>
<xsl:apply-templates
select="$colors-2" mode="color-names"/>
</div>
</div>
</xsl:template>
<xsl:template match="color" mode="color-names">
<xsl:value-of select="colorName"/>
<xsl:text> </xsl:text>
</xsl:template>
</xsl:stylesheet>

In case there's a good reason you need recursive loop, you
can always fiddle around with passing parameters on each
iteration: start-from, stop-at or somesuch.
 
?

=?ISO-8859-1?Q?J=FCrgen_Kahrs?=

monmonja said:
Hi i'm new to xsl and i have been using smarty php templating but its
just so hard to read codes in smarty/php/flash than xml/xsl/flash, i
rather sacrifice speed then not being able to read code after 3 months.

If you are willing to look at languages other
than xsl, you might appreciate this solution in
XMLgawk:

@load xml
BEGIN { print "<div>" }
XMLCHARDATA { data = $0}
XMLENDELEM == "colorName" { color[++ci] = data }
XMLENDELEM == "fileName" { fileName = data }
ci == 2 {
print "<div>" color[1], color[2] "</div>" ;
print "<div><object ...... src=\"" fileName "\" ... /></div>"
ci = 0
}
END { print "</div>" }


Readability of such scripts is in the eye of the beholder.
The output produced by this script looks like this:

<div>
<div>BLUE BLACK</div>
<div><object ...... src="MyNewAvatar.swf" ... /></div>
<div>RED GREEN</div>
<div><object ...... src="MyNewAvatar.swf" ... /></div>
</div>

I know this isnt exactly what you asked for, but it
is easy to change the script if you need different output.
 
M

monmonja

The reason i need recursive because its more complex then that. Thanks
for the reply, can you show me a simple example of the passing
parameters on each
iteration: start-from, stop-at or somesuch.

BTW, php has more than 50 template systems, i cant afford to study one
again unless its a standard which XSL is. The reason ive used Smarty is
because it was here in my work when i came here.
 
M

monmonja

Ive found the answer but i have another problem can someone explain to
this:
<xsl:template match="/">
<xsl:call-template name="tmpColors" >
<xsl:with-param name="counter" select="5" />
</xsl:call-template>
flash OBJECT
<xsl:apply-templates select="avatars/avatar/colors" />
</xsl:template>

<xsl:template match="avatars/avatar/colors" name="tmpColors">
<xsl:param name="counter" />
<xsl:value-of select="count(color)" />
<xsl:for-each select="avatars/avatar/colors/color[position()
&lt; $counter]">
Try
<xsl:value-of select="colornameame" />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>

On call-template count(color) = 0 while on apply-template count(color)
= n. but if i do XPath from the root down
count(avatars/avatar/colors/color) the opposite happens. Do
call-template use the match patterns? Any advice from the experts out
there when its more appropriate to use call-template over
apply-template. Again thanks in advance.
 
P

p.lepin

Please quote what you're replying to. (And if you start
quoting--don't top-post.) Read something about proper
etiquette when posting on the usenet.
<xsl:template match="/">
<xsl:call-template name="tmpColors" >
<xsl:with-param name="counter" select="5" />
</xsl:call-template>
flash OBJECT
<xsl:apply-templates select="avatars/avatar/colors" />
</xsl:template>

<xsl:template match="avatars/avatar/colors"
name="tmpColors">
<xsl:param name="counter" />
<xsl:value-of select="count(color)" />
<xsl:for-each
select="avatars/avatar/colors/color[position()
&lt; $counter]">
Try
<xsl:value-of select="colornameame" />
<xsl:text> </xsl:text>
</xsl:for-each>
</xsl:template>

On call-template count(color) = 0 while on apply-template
count(color) = n. but if i do XPath from the root down
count(avatars/avatar/colors/color) the opposite happens.
Do call-template use the match patterns?

No, they don't. (I remember vividly putting my foot in my
mouth regarding this a few months ago--and Joe Kesselman
gently biting my head off shortly thereafter. Ah, sweet
memories.) call-template simply invokes another template,
without changing the context node.
Any advice from the experts out there when its more
appropriate to use call-template over apply-template.
Again thanks in advance.

First of all, I'd say using the same template as both
matchable and callable is a bad idea. Naturally, there
might be certain situations where this would be
appropriate, but unless you have a very good reason to do
something like that--don't.

In terms of imperative programming it might help thinking
about named templates as something like functions, and
about templates invoked using apply-templates as
polymorphic methods. A named template doesn't really care
about the context it's invoked from: it just does some
largerly context-independent stuff and that's all. Applying
templates to a nodeset is similar to doing something with a
collection of objects that you know implement a certain
interface without really caring about implementations. You
just say: 'do-something with all these nodes', and the
templates matching the nodes in question will determine
precisely how it will be done.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,228
Members
46,818
Latest member
SapanaCarpetStudio

Latest Threads

Top