recursive xsl

Discussion in 'XML' started by monmonja, Dec 20, 2006.

  1. monmonja

    monmonja Guest

    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...
    monmonja, Dec 20, 2006
    #1
    1. Advertising

  2. monmonja

    Guest

    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"
    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
    , Dec 20, 2006
    #2
    1. Advertising

  3. 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.
    =?ISO-8859-1?Q?J=FCrgen_Kahrs?=, Dec 20, 2006
    #3
  4. monmonja

    monmonja Guest

    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.
    monmonja, Dec 21, 2006
    #4
  5. monmonja

    monmonja Guest

    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.
    monmonja, Dec 21, 2006
    #5
  6. monmonja

    Guest

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

    --
    Pavel Lepin
    , Dec 21, 2006
    #6
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. GR33DY
    Replies:
    0
    Views:
    576
    GR33DY
    Jun 24, 2004
  2. Replies:
    1
    Views:
    3,585
    A. Bolmarcich
    May 27, 2005
  3. Oliver Schalch
    Replies:
    0
    Views:
    325
    Oliver Schalch
    Oct 21, 2005
  4. n00m
    Replies:
    12
    Views:
    1,100
  5. vamsi
    Replies:
    21
    Views:
    2,043
    Keith Thompson
    Mar 9, 2009
Loading...

Share This Page