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

Re: Re: Re: Assignment no, dynamic scoping si (was: Re

Subject: Re: Re: Re: Assignment no, dynamic scoping si (was: Re: RE: Wishes for XSLrevisions ...
From: terje@xxxxxxxxxxxxxxx (Terje Norderhaug)
Date: Thu, 3 Jan 2002 16:44:32 -0800 (PST)
variable paragraph xsl
At 6:49 PM 1/2/02, Dimitre Novatchev wrote:
>Gunther Schadow <gunther at aurora dot regenstrief dot org> wrote:
>> So, in a world with dynamic scoping / implicit parameters,
>> lowlyweb.org would do this:
>> <xsl:stylesheet id='urn:lowlyweb.org:onlinebook'>
>> <xsl:import href='http://bigbucksbooks.com/onlinebook.xsl'/>
>> <xsl:template match='section'>
>>    ...
>>    <xsl:apply-templates>
>>      <xsl:with-implicit-param name='source' select='@source'/>
>>    </xsl:apply-templates>
>>    ...
>> </xsl:template>
>> <xsl:template match='paragraph'>
>>    <xsl:implicit-param name='source' select='@source'/>
>>    <p class='$source'>
>>      <xsl:apply-templates/>
>>    </p>
>> </xsl:template>
>> </xsl:stylesheet>
>> This template would only touch the section and paragraph elements
>> of bigbucksbooks and would leave everything else untouched.
>> The implicit parameter source is bound to the @source value given
>> in the document for everything nested within that section. Now,
>> most of this stuff doesn't care, until we get down to the paragraph
>> element that now has this implicit parameter available no matter
>> how many things were passed through.
>> I cannot see how to do that with global variables as you suggest,
>> because that book contains many sections and needs to switch
>> between the different sources all the time per each section.
>> I can see how one can do the same thing with explicit parameters,
>> which however, requires modifying all of bigbucksbooks templates
>> for table, list (and then: frame, box, float, imagetitle,
>> rotated-text, ...).
>> So, if you could show me how this can be done without changing the
>> whole thing, I am all ears.
>Certainly. This is very simple using XSLT. You even don't have to modify the
>"section" template neither do you need a global variable. In the "paragraph"
>template declare and use the following local variable:
><xsl:variable name="source" select="ancestor::section[1]/@source"/>

1. This assumes that you know certain constraints about the document, such as that a section never contains a section. Without  this constraint, a template such as below in the imported document would make your work-around unreliable as ancestor::section[1] might give the wrong element in the paragraph template:

<xsl:template match='section//section'>

2. The work-around may fail if any xsl:apply-templates instructions in the imported stylesheet selects nodes outside the descendants of the 'section' element. If so, you have no guarantee that ancestor::section[1] will give you the section element that was the current node for a 'section' template earlier in the call chain.

3. If the 'section' template contains two xsl:apply-templates where each pass on a different value for the dynamic variable $source (or another template binds the variable) the 'paragraph' template might be instantiated with different values for $source. The same value might be impossible to calculate from the current context in the 'paragraph' template, e.g.:

<xsl:template match='section'>
      <xsl:with-implicit-param name='source' select='@source'/>
      <xsl:with-implicit-param name='source' select='"default"'/>

4. Replicating the same xpath expression in each template that want to use the $source isn't exactly good practive with respect to writing maintainable code. Nor does it facilitate efficient execution. 

In conclusion, dynamic variables provide a general solution to problems that work-arounds only can solve in special cases with great dependency on document constraints and assumptions about the imported stylesheet. 

-- Terje <terje@xxxxxxxxxxxxxxx> | Media Design in*Progress 
   Software for Mac Web Professionals at <http://www.in-progress.com>
   Take Advantage of Server Side XML and XSL with Interaction 3.6!

 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list

Current Thread


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.
First Name
Last Name
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.