xsl-list
[Top] [All Lists]

Re: [xsl] When to use conditional constructions?

2014-04-01 04:15:03
On Mon, Mar 31, 2014 at 7:15 PM, Abel Braaksma (Exselt) 
<abel(_at_)exselt(_dot_)net> 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.

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>