RE: [xsl] Repetitive variable definitions

Subject: RE: [xsl] Repetitive variable definitions
From: cknell@xxxxxxxxxx
Date: Fri, 14 Sep 2007 13:35:58 -0400
<?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