[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: Repetitive variable definitions

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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.