Subject: Re: [xsl] When to use conditional constructions? From: David Rudel <fwqhgads@xxxxxxxxx> Date: Tue, 1 Apr 2014 11:14:44 +0200 |
On Mon, Mar 31, 2014 at 7:15 PM, Abel Braaksma (Exselt) <abel@xxxxxxxxxx> wrote: > In 3.0 you can assign function items to variables, allowing something > like this: > > <xsl:variable name="predicates" as="function(*)*"> > <xsl:sequence select=" > function($a) { $a/local-name() = 'para' }, > function($a) { $a/text() = 'hello world'}" /> > </xsl:variable> > > <xsl:template match="*[some $f in $predicates satisfies $f(.)]"> > <xsl:text>Found it!</xsl:text> > </xsl:template> > > Whether this proves to be handy in practical scenarios, I am not sure. A similar technique has been very helpful for me in my practical, day-to-day work. I say "similar" because for me the main benefit has not been to reduce re-use of predicates but to use function-valued parameters to make my code more modular so I can put complex templates that might use one of these complex predicates into an imported stylesheet. I can then call them with a small template in my main stylesheet and pass them whatever predicate is needed for the task at hand. Here is how it works for me: I run analysis on data associated to students. A given data set may have half a million students in it, but for a given *analysis* I might only want to inspect 50,000 or 100,000 students. To avoid time lost parsing files I don't want, I use the following workflow: 1. When I get my data, I first create a text file catalog with one line per file. 2. I then run a catalog-making XSLT script that inspects each of these files and writes out some key information about the student into a catalog file. This information will later be used to determine whether that student is included or excluded from a given data analysis project. 3. At the start of most of my analyses, I call a template that includes a couple of filter parameters that take functions. For example: <xsl:template name="Batch_from_Catalog"> <xsl:param name="student.filter" select="function($x as node()) as xs:boolean{($x/@userName ne '') and not($x/@firstGradeLevelID='0') and (+$x/@firstGradeLevelID le 6)}"/> <xsl:param name="stint.filter" select="function($x){boolean(1)}" as="function(*)"/> .... These filter functions are then used to select the relevant students from the catalog: <xsl:for-each select="document(concat($path,$catalog))//student[$student.filter(.)]"> ... When calling the above template, I can enter whatever filters I want as functions for the $student.filter and $stint.filter variables. The above template (or, rather, a more complex version that both selects students for analysis and and organizing the output from each student's analysis a single data brick) is contained in an imported stylesheet. To use it I just have to put a small-footprint initial template (including the filters I want to use for that analysis) into the sheet specifying the analysis I'm doing at the moment. -David -- "A false conclusion, once arrived at and widely accepted is not dislodged easily, and the less it is understood, the more tenaciously it is held." - Cantor's Law of Preservation of Ignorance.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] xsl compact syntax using , Michael Kay | Thread | Re: [xsl] When to use conditional c, Dimitre Novatchev |
Re: [xsl] xsl compact syntax using , David Rudel | Date | [xsl] Re: Turning escaped mixed con, Martin Holmes |
Month |