Patch #1420
closedAdd saxon:closure extension function
0%
Description
SourceForge user: gschadow
Hi Michael, it worked! I could indeed add a saxon:closure
() extension function that will force it's argument
Expression to be lazily evaluated. It simply creates a
Closure from the first argument in the current
XPathContext.
In order to make it happen I had to make numerous little
additions, most of them to get the name saxon:closure
known. I used the saxon:expression extension function
as an example and did everything the way you did it for
saxon:expression.
The only real change that you may want to review is
that I made SequenceValue implement Item (simply by
adding one trivial little missing function implementation.
Also required was a little change in Value.asValue().
Attached is a ZIP file that contains the complete diff
that should take care of every change needed. It's
against 7.6 though but the diff has not much context so
I don't think much would be rejected.
Also in the ZIP file is a little test case (to invoke as a
transform over any XML input). The test-case requires a
Java extension thingie with a little side-effect, because
that's my whole point.
The point that the test illustrates is how side-effects
can be carried out with lazy evaluation ONLY if the value
is actually referenced. The real example is a database
insert that should only be done for parent-records that
have dependent children. If you run the example without
the closure() function it's output is:
next 1 for insert a
next 2 for insert b parent 1
next 3 for insert c parent 1
next 4 for insert d
next 5 for insert e
next 6 for insert f parent 5
<child id="2" parentId="1" name="b"/>
<child id="3" parentId="1" name="c"/>
<child id="6" parentId="5" name="f"/>
which is bad because it inserted "next 4 for indsert d" for
the parent named "d" that had no children. Once you
apply the patch and use the closure() function the
output is correctly:
next 1 for insert a
next 2 for insert b parent 1
next 3 for insert c parent 1
next 4 for insert e
next 5 for insert f parent 4
<child id="2" parentId="1" name="b"/>
<child id="3" parentId="1" name="c"/>
<child id="5" parentId="4" name="f"/>
Files
Please register to edit this issue