Re: [xsl] When to use conditional constructions?

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

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
3. At the start of most of my analyses, I call a template that
includes a couple of filter parameters that take functions. For
    <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

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.



"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