Streamed processing of input documents
There has been considerable development of the streaming capability, much of it involving removal of restrictions that were not previously documented (or known).
The xsl:stream
instruction is now implemented, making the saxon:stream
extension function obsolescent (though it is retained for the time being). Accumulators are
also implemented, in both streaming and non-streaming mode.
Streaming: Saxon is moving towards a design where it implements the "guaranteed
streamability" rules in the W3C draft precisely, unless the configuration option
ALLOW_STREAMABILITY_EXTENSIONS
is set, in which case Saxon may
implement streaming (or near-streaming) for some additional cases.
Certain constructs using positional filters can now be evaluated in streaming mode. The filter must be on a node test that uses the child axis and selects element nodes. The forms accepted are expressions that can be expressed as x[position() op N] where N is an expression that is independent of the focus and is statically known to evaluate to a number, x is a node test using the child axis, and op is one of the operators eq, le, lt, gt, or ge. Alternative forms of this construct such as x[N], remove(x, 1), head(x), tail(x), and subsequence(x, 1, N) are also accepted.
Streaming is now possible for xsl:for-each-group
using the group-adjacent
,
group-starting-with
, or group-ending-with
attributes. There are some restrictions, for example
nested xsl:for-each-group
cannot be streamed, and the body of a streamed xsl:for-each-group
instruction cannot include conditionals (xsl:choose
).