Multiple Valued Variables in XSLT


J

John Kooistra

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
 
Ad

Advertisements

?

-

John said:
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
 
M

Martin Honnen

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

Advertisements

P

Philippe Poulard

John said:
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 |
-----------------------
 

Top