Inline functions in xslt 2.1 look often as a some strange aberration. Sure, there are very usefull cases when they are delegates of program logic (e.g. comparators, and filters), but often (probably more often) we can see that it's use is to model data structures.
As an example, suppose you want to model a structure with three properties say a, b, and c. You implement this creating functions that wrap and unwrap the data:
function make-data($a as item(), $b as item(), $c as item()) as function() as item()+ { function() { $a, $b, $c } }
function a($data as function() as item()+) as item() { $data()[1] }
function b($data as function() as item()+) as item() { $data()[2] }
function c($data as function() as item()+) as item() { $data()[3] }
Clever?
Sure, it is! Here, we have modeled structrue with the help of sequence, which we have wrapped into a function item.
Alas, clever is not always good (often it's a sign of a bad). We just wanted to define a simple structure. What it has in common with function?
There is a distance between what we want to express, designing an algorithm, and what we see looking at the code. The greater the distance, the more efforts are required to write, and to read the code.
It would be so good to have simpler way to express such concept as a structure. Let's dream a little. Suppose you already have a structure, and just want to access its members. An idea we can think about is an xpath like access method:
$data/a, $data/b, $data/c
But wait a second, doesn't $data looks very like an xml element, and its accessors are just node tests? That's correct, so data constructor may coincide with element constructor.
$data
Then what pros and cons of using of xml elements to model structures?
Pros are: existing xml type system, and sensibly looking code (you just understand that here we're constructing a structure).
Cons are: xml trees are implemented the way that does not assume fast (from the perfromace perspective) composition, as when you construct a structure a copy of data is made.
But here we observe that "implemented" is very important word in this context. If xml tree implementation would not store reference to the parent node then subtrees could be composed very efficiently (note that tree is assumed to be immutable). Parent node could be available through a tree navigator, which would contain reference to a node itself and to a parent tree navigator (or to store child parent map somewhere near the root).
Such tree structure would probably help not only in this particular case but also with other conventional xslt code patterns.
P.S. Saxon probably could implement its NodeInfo this way.
NodeInfo
Update: see also Custom tree model.
Remember Me
a@href@title, b, blockquote@cite, em, i, strike, strong, sub, super, u