Help | Site Map
Connecting Tech Pros Worldwide
 
 
LinkBack Thread Tools
  #1  
Old December 20th, 2006, 11:35 AM
monmonja
Guest
 
Posts: n/a
Default recursive xsl

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

  #2  
Old December 20th, 2006, 12:25 PM
p.lepin@ctncorp.com
Guest
 
Posts: n/a
Default Re: recursive xsl


monmonja wrote:
Quote:
<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.

--
Pavel Lepin

  #3  
Old December 20th, 2006, 12:35 PM
=?ISO-8859-1?Q?J=FCrgen_Kahrs?=
Guest
 
Posts: n/a
Default Re: recursive xsl

monmonja wrote:
Quote:
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.
  #4  
Old December 21st, 2006, 03:05 AM
monmonja
Guest
 
Posts: n/a
Default Re: recursive xsl

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.

  #5  
Old December 21st, 2006, 05:35 AM
monmonja
Guest
 
Posts: n/a
Default Re: recursive xsl

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.

  #6  
Old December 21st, 2006, 08:35 AM
p.lepin@ctncorp.com
Guest
 
Posts: n/a
Default Re: recursive xsl


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.

monmonja wrote:
Quote:
<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.
Quote:
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.

--
Pavel Lepin

 

Bookmarks

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are Off
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On

What is Bytes?

We are a network of experts and professionals in IT and software development that help one another with answers to tough questions and share insights. Get the best answers to your questions from over network members.
Post your question now . . .
It's fast and it's free

Popular Articles