Multiple Valued Variables in XSLT

Discussion in 'XML' started by John Kooistra, Jul 2, 2004.

  1. Hi,

    I'm trying to set the font colour and background colour in HTML based
    on an XSL condition a la:

    <xsl:variable name="font">
    <xsl:choose>
    <xsl:when test="SOME TEST">
    <fontcolour>Red</fontcolour>
    <bgcolour>Blue</bgcolour>
    </xsl:when>
    <xsl:eek:therwise>
    <fontcolour>Black</fontcolour>
    <bgcolour>White</bgcolour>
    </xsl:eek:therwise>
    </xsl:choose>
    </xsl:variable>
    <td bgcolor="{$font/bgcolour}">
    <font color="{$font/fontcolour}">
    TEXT
    </font>
    </td>

    However, I get the error: "Reference to variable or parameter 'font'
    must evaluate to a node list."

    I get it because $font is a Result Tree Fragment.

    Is there a way to get the functionality I want without using a
    processor dependent function like msxsl:node-set(rtf)?

    As a work-around, I'm currently using two separate variables for
    fontcolour and bgcolour complete with their own condition statements.
    Obviously, it is very ugly and I would really appreciate any
    suggestions you have.

    Thanks a million,
    John
    John Kooistra, Jul 2, 2004
    #1
    1. Advertising

  2. John Kooistra

    - Guest

    John Kooistra wrote:
    > Hi,
    >
    > I'm trying to set the font colour and background colour in HTML based
    > on an XSL condition a la:
    >
    > <xsl:variable name="font">
    > <xsl:choose>
    > <xsl:when test="SOME TEST">
    > <fontcolour>Red</fontcolour>
    > <bgcolour>Blue</bgcolour>
    > </xsl:when>
    > <xsl:eek:therwise>
    > <fontcolour>Black</fontcolour>
    > <bgcolour>White</bgcolour>
    > </xsl:eek:therwise>
    > </xsl:choose>
    > </xsl:variable>
    > <td bgcolor="{$font/bgcolour}">
    > <font color="{$font/fontcolour}">
    > TEXT
    > </font>
    > </td>
    >
    > However, I get the error: "Reference to variable or parameter 'font'
    > must evaluate to a node list."
    >
    > I get it because $font is a Result Tree Fragment.
    >
    > Is there a way to get the functionality I want without using a
    > processor dependent function like msxsl:node-set(rtf)?


    I'm pretty sure there isn't, as that behaviour is designed into the XSLT
    spec. Annoying in many respects, don't know if there are plans to change
    the behaviour in XSLT 2.0?

    Regards

    Will
    -, Jul 2, 2004
    #2
    1. Advertising

  3. John Kooistra wrote:


    > I'm trying to set the font colour and background colour in HTML based
    > on an XSL condition a la:
    >
    > <xsl:variable name="font">
    > <xsl:choose>
    > <xsl:when test="SOME TEST">
    > <fontcolour>Red</fontcolour>
    > <bgcolour>Blue</bgcolour>
    > </xsl:when>
    > <xsl:eek:therwise>
    > <fontcolour>Black</fontcolour>
    > <bgcolour>White</bgcolour>
    > </xsl:eek:therwise>
    > </xsl:choose>
    > </xsl:variable>
    > <td bgcolor="{$font/bgcolour}">
    > <font color="{$font/fontcolour}">
    > TEXT
    > </font>
    > </td>
    >
    > However, I get the error: "Reference to variable or parameter 'font'
    > must evaluate to a node list."
    >
    > I get it because $font is a Result Tree Fragment.
    >
    > Is there a way to get the functionality I want without using a
    > processor dependent function like msxsl:node-set(rtf)?
    >
    > As a work-around, I'm currently using two separate variables for
    > fontcolour and bgcolour complete with their own condition statements.
    > Obviously, it is very ugly and I would really appreciate any
    > suggestions you have.


    I don't know to what kind of user agents you want to send your HTML but
    if you target current desktop browsers like IE5+, Netscape 6/7, Opera
    6/7 then I wouldn't bother with bgcolor or that <font> element but
    simply use CSS to define the presentation of the page. You could simply
    generate a <style type="text/css"> element in the <head> of your HTML
    and depending on the conditions put the right CSS rules there so that
    the elements are colored as you want it.

    --

    Martin Honnen
    http://JavaScript.FAQTs.com/
    Martin Honnen, Jul 2, 2004
    #3
  4. John Kooistra wrote:
    > Hi,
    >
    > I'm trying to set the font colour and background colour in HTML based
    > on an XSL condition a la:
    >
    > <xsl:variable name="font">
    > <xsl:choose>
    > <xsl:when test="SOME TEST">
    > <fontcolour>Red</fontcolour>
    > <bgcolour>Blue</bgcolour>
    > </xsl:when>
    > <xsl:eek:therwise>
    > <fontcolour>Black</fontcolour>
    > <bgcolour>White</bgcolour>
    > </xsl:eek:therwise>
    > </xsl:choose>
    > </xsl:variable>
    > <td bgcolor="{$font/bgcolour}">
    > <font color="{$font/fontcolour}">
    > TEXT
    > </font>
    > </td>
    >
    > However, I get the error: "Reference to variable or parameter 'font'
    > must evaluate to a node list."
    >
    > I get it because $font is a Result Tree Fragment.
    >
    > Is there a way to get the functionality I want without using a
    > processor dependent function like msxsl:node-set(rtf)?
    >
    > As a work-around, I'm currently using two separate variables for
    > fontcolour and bgcolour complete with their own condition statements.
    > Obviously, it is very ugly and I would really appreciate any
    > suggestions you have.
    >
    > Thanks a million,
    > John


    hi,

    you don't need any extension, just use the right way :
    when one need an xml-structured variable, just put it as a child of the
    root element of your stylesheet, and refers to it by using document('')
    the sole constraint is to define a namespace for all your structured
    constants :

    <xsl:stylesheet xmlns:const="*** My datas ***"
    xmlns:xsl="...as usual">

    <const:fonts>
    <font>
    <fontcolour>Red</fontcolour>
    <bgcolour>Blue</bgcolour>
    </font>
    <font>
    <fontcolour>Black</fontcolour>
    <bgcolour>White</bgcolour>
    </font>
    </const:fonts>

    <xsl:template ...>
    <xsl:variable name="fontNumber">
    <xsl:choose>
    <xsl:when test="SOME TEST">1</xsl:when>
    <xsl:eek:therwise>2</xsl:eek:therwise>
    </xsl:choose>
    </xsl:variable>
    <xsl:variable name="font"
    select="document('')/*/const:fonts/font[number($fontNumber)]">
    <td bgcolor="{$font/bgcolour}">
    <font color="{$font/fontcolour}">
    TEXT
    </font>
    </td>
    </xsl:template>

    </xsl:stylesheet>
    --
    Cordialement,

    ///
    (. .)
    -----ooO--(_)--Ooo-----
    | Philippe Poulard |
    -----------------------
    Philippe Poulard, Jul 2, 2004
    #4
    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. Guest
    Replies:
    1
    Views:
    660
    Sajan
    Feb 4, 2004
  2. Guru Prasad
    Replies:
    2
    Views:
    999
    Lokesh Kanna
    Jan 30, 2014
  3. Nick Forest

    lists with zero-valued elements

    Nick Forest, Dec 27, 2003, in forum: Python
    Replies:
    3
    Views:
    323
    Alex Martelli
    Dec 27, 2003
  4. Holger
    Replies:
    2
    Views:
    491
    Holger
    Jan 22, 2007
  5. Emacs Row
    Replies:
    2
    Views:
    343
    Emacs Row
    Apr 17, 2006
Loading...

Share This Page