RE: [xsl] Repetitive variable definitions

Subject: RE: [xsl] Repetitive variable definitions
From: "Whitney, Dan \(CanWest Interactive\)" <DWhitney@xxxxxxxxxxx>
Date: Fri, 14 Sep 2007 13:07:03 -0500
Charles,

Thanks for the fast response, however the noofcols variable is always
empty.

Dan


________________________________

Daniel Whitney
  CanWest Interactive, a division of CanWest MediaWorks Publications
Inc.
  1450 Don Mills Rd
  Don Mills ON M3B 2X7
  Tel: (416) 442-2957
  Fax: (416) 442-2968
Email: dwhitney@xxxxxxxxxxx


-----Original Message-----
From: cknell@xxxxxxxxxx [mailto:cknell@xxxxxxxxxx]
Sent: Friday, September 14, 2007 1:36 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: RE: [xsl] Repetitive variable definitions

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">

    <xsl:variable name="noofcols"  select="/table/tr/td[last()]/@col"/>

    <xsl:variable name="bg-color">
       <xsl:choose>
          <xsl:when test="$noofcols = 1" select="'red'">
          <xsl:when test="$noofcols = 3 select="'blue'">
          <xsl:otherwise/>
       </xsl:choose>
    <xsl:variable>

    <xsl:template match="table">
        <table border="1">
            <tr>
                <td align="center" colspan="{$noofcols}">
                    <xsl:value-of select="@desc"/>
                </td>
            </tr>
            <xsl:apply-templates select="tr"/>
        </table>
     </xsl:template>


    <xsl:template match="tr">
        <tr bgcolor="{$bg-color}">
           <xsl:apply-templates select="td"/>
        </tr>
    </xsl:template>


    <xsl:template match="td">
        <td bgcolor="{$bg-color}">
        td col variable = <xsl:value-of select="$noofcols"/>
      </td>
    </xsl:template>

</xsl:stylesheet>

--
Charles Knell
cknell@xxxxxxxxxx - email



-----Original Message-----
From:     Whitney, Dan \(CanWest Interactive\) <DWhitney@xxxxxxxxxxx>
Sent:     Fri, 14 Sep 2007 12:24:24 -0500
To:       <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Subject:  [xsl] Repetitive variable definitions

I have a question of a general nature concerning variables and xsl
templates. I like to break my XSL down into templates as I find them
much easier to work with, but I find it very limiting when I have to
keep redefining the same variables over and over in different templates
with different contexts.

In my very simplistic example, I have had to define a variable
"noofcols" once in each template for a total of 3 times. I would love to
only define it once and have it "cascade" down the child templates
without making the XSL a single template. I don't think this is
possible, but you never know until you ask.

So my question is - can I define the "noofcols" only once whether
variable, parameter template or any other method, or am I stuck with
defining it as shown?

Thanks in advance,

Dan Whitney

XML:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="example.xsl"?>
<example>
    <table desc="Example: 1 col table">
        <tr>
            <td col="1">col 1</td>
        </tr>
    </table>
    <table desc="Example: 2 col table">
        <tr>
            <td col="1">col 1</td>
            <td col="2">col 2</td>
        </tr>
    </table>
    <table desc="Example: 3 col table">
        <tr>
            <td col="1">col 1</td>
            <td col="2">col 2</td>
            <td col="3">col 2</td>
        </tr>
    </table>
</example>

XSL:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="1.0">
    <xsl:template match="table">
        <xsl:variable name="noofcols"  select="tr/td[last()]/@col"/>
        <table border="1">
            <tr>
                <td align="center"  colspan="{$noofcols}">
                    <xsl:value-of select="@desc"/>
                </td>
            </tr>
            <xsl:apply-templates select="tr"/>
        </table>
     </xsl:template>


    <xsl:template match="tr">
        <xsl:variable name="noofcols"
select="self::tr[1]/td[last()]/@col"/>
        <tr>
            <xsl:choose>
                <xsl:when test="$noofcols = 1">
                    <xsl:attribute name="bgcolor">red</xsl:attribute>
                </xsl:when>
                <xsl:otherwise>
                </xsl:otherwise>
            </xsl:choose>
            <xsl:apply-templates select="td"/>
        </tr>
    </xsl:template>


    <xsl:template match="td">
        <xsl:variable name="noofcols"
select="parent::tr[1]/td[last()]/@col"/>
        <td>
        <xsl:choose>
            <xsl:when test="$noofcols = 3">
                <xsl:attribute name="bgcolor">blue</xsl:attribute>
            </xsl:when>
        </xsl:choose>
        td col variable = <xsl:value-of select="$noofcols"/>
      </td>
    </xsl:template>

</xsl:stylesheet>

Current Thread