Re: [xsl] How do I build a nodeset "programmatically" for passing to another template?

Subject: Re: [xsl] How do I build a nodeset "programmatically" for passing to another template?
From: sterling <sstouden@xxxxxxxxxxxx>
Date: Sun, 8 Oct 2006 11:35:51 -0500 (CDT)
How would you cite the technique "micro-pipelining".

Piez, Wendell: Micro-pipeline (technique to create and process 
the tree created)", cited in XSL-List@xxxxxxxxxxxxxxxxxxxxxx, 
subject = programmatic nodeset builds for passing to another 
template", Oct 6, 2006.  

but when and who invented the technique "micro-pipeline"?
maybe many people did different components? 
is there an existing|applied_for patent on any of it,  
or does the technique reside in the public domain? 

sterling

On Thu, 17 Aug 2006, Wendell Piez wrote:

> Matthew,
> 
> What you're trying to do is a useful and very powerful technique, 
> only unfortunately disallowed by a restriction in classical XSLT 1.0, 
> which defines a variable bound dynamically in such a way as a result 
> tree fragment (RTF), which by definition may not be processed 
> further. (An RTF may only be copied to the result tree or converted 
> to a string, which is somewhat useful but not as much as one would like.)
> 
> Because this restriction was considered by some to be rather 
> artificial, and the technique so useful, it was removed in XSLT 2.0, 
> where what you are doing will work transparently.
> 
> In a conformant XSLT 1.0 processor, you will get an error when you 
> try this, typically along the lines of "cannot process Result Tree 
> Fragment". To get around this, many XSLT 1.0 processors provide an 
> extension function. For example, a function node-set() is available, 
> in many processors, in the EXSLT namespace (see www.exslt.org), which 
> you could use, as in node-set($speed_table_values), to get up and running.
> 
> I believe the node-set() extension function may also be available 
> natively in an XSLT 1.1 processor, but since the 1.1 specification 
> was shelved before making Recommendation status, YYMV.
> 
> FWIW, some of us are calling this technique "micropipelining", as it 
> entails creating a tree fragment and then processing it. Not only is 
> it very powerful, it's very much in the XSLT 2.0 spirit of things, 
> and at the core of any number of advanced methodologies such as 
> (pre-eminently) FXSL.
> 
> Cheers,
> Wendell
> 
> At 11:34 AM 8/17/2006, you wrote:
> >I'm using Saxon 6.5.x (and XSL 1.1).
> >
> >Searches on the web and this list's archives give me tantalizing hints
> >that what I want to do is theoretically possible.  All of the examples I
> >find seem to be "reducers" (e.g. sum a set of numbers spread throughout
> >a nodeset, or combine nodes into a single string), rather than
> >"builders".
> >
> >My stylesheets are pull style that build XSL-FO output for further
> >processing by Apache-FOP.  What I'm trying to do is build a nodeset in a
> >variable so that I can rely on some generic fo:table templates to
> >produce the output rather than custom templates for each occurrence.
> >Due to limits of what is currently in the XML input files, I'm forced to
> >do some calculation/nodeset building to supplement the structure already
> >in the XML file.
> >
> >Is it possible for a chunk of XSL like:
> ><xsl:variable name="max_ay"
> >select="/vdt:report/vdt:run_metrics/*[normalize-space(text()) = 'Avg
> >Ay']/vdt:statistics/vdt:statistic[@stat_name='Average']"/>
> ><xsl:variable name="ay_90pct" select="format-number(0.9 * $max_ay,
> >'#.##')"/>




m                                                                           
> ><xsl:variable name="speed_table_values">
> >         <xsl:call-template name="ml_generate_speed_table">
> >                 <xsl:with-param name="ay_target" select="$ay_90pct"/>
> >                 <xsl:with-param name="radii">
> >                         <radius>30</radius>
> >                         <radius>60</radius>
> >                         <radius>61</radius>
> >                         <radius>100</radius>
> >                 </xsl:with-param>
> >                 <xsl:with-param
> >name="string_format">#.#</xsl:with-param>
> >         </xsl:call-template>
> ></xsl:variable>
> >
> >
> >To result in the variable $speed_table_values looking something like ?:
> ><entry>
> >         <radius>30</radius>
> >         <speed_km_h>60.9</speed_km_h>
> >         <speed_mph>50.1</speed_mph>
> ></entry>
> ><entry>
> >         <radius>60</radius>
> >         <speed_km_h>72.9</speed_km_h>
> >         <speed_mph>60.1</speed_mph>
> ></entry>
> ><entry>
> >         <radius>61</radius>
> >         <speed_km_h>81.9</speed_km_h>
> >         <speed_mph>70.4</speed_mph>
> ></entry>
> ><entry>
> >         <radius>100</radius>
> >         <speed_km_h>99.9</speed_km_h>
> >         <speed_mph>75.1</speed_mph>
> ></entry>
> >
> >(The numbers in the table are bogus but the nodeset structure is what
> >I'm interested in.)
> >
> >I would then have a later <xsl:call-template> that contained
> ><xsl:with-param select="$speed_table_values">
> >
> >As you can see, this particular problem is mostly interating over nodes
> >provided within the XSL sheet itself rather than the sourcpae XML.  
Only
> >the first line of my example is grabbing a value/node from the source
> >tree.  I need to accomplish this in a single pass (not multiple calls to
> >an XSLT transformer).  Assuming what I want to do is possible in XSL
> >1.1, any links to similar examples would be much appreciated.

Current Thread