Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > XML > recursive xsl

Reply
Thread Tools

recursive xsl

 
 
monmonja
Guest
Posts: n/a
 
      12-20-2006
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...

 
Reply With Quote
 
 
 
 
p.lepin@ctncorp.com
Guest
Posts: n/a
 
      12-20-2006

monmonja wrote:
> <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"
xmlnssl="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

 
Reply With Quote
 
 
 
 
=?ISO-8859-1?Q?J=FCrgen_Kahrs?=
Guest
Posts: n/a
 
      12-20-2006
monmonja wrote:

> 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.
 
Reply With Quote
 
monmonja
Guest
Posts: n/a
 
      12-21-2006
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.

 
Reply With Quote
 
monmonja
Guest
Posts: n/a
 
      12-21-2006
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">
<xslaram 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.

 
Reply With Quote
 
p.lepin@ctncorp.com
Guest
Posts: n/a
 
      12-21-2006

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:
> <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">
> <xslaram 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.

--
Pavel Lepin

 
Reply With Quote
 
 
 
Reply

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 On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Recursive functions Vs Non-recursive functions - performance aspect vamsi C Programming 21 03-09-2009 10:53 PM
Two recursive calls inside of a recursive function n00m C++ 12 03-13-2008 03:18 PM
better way maybe with recursive use of XSL Oliver Schalch XML 0 10-21-2005 11:22 AM
XSL Question tp xsl:for-each and xsl:variable schaf@2wire.ch XML 1 05-27-2005 09:25 PM
XSL Recursive nested elements woe GR33DY XML 0 06-24-2004 09:34 AM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57