Multiple Valued Variables in XSLT

John Kooistra

Usenet Archive
Joined
Jun 30, 2004
Messages
3
Reaction score
0
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 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
 

Martin Honnen

Usenet Archive
Joined
Apr 8, 2000
Messages
6,174
Reaction score
0
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.
 

Philippe Poulard

Usenet Archive
Joined
Dec 20, 2001
Messages
412
Reaction score
0
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>
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
548,042
Messages
3,104,223
Members
248,131
Latest member
Tonypshaw1

Latest Threads

Top