Subject: Re: 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.
|