# Streaming Enhancements

Some enhancements have been made to the Saxon-SA facility for serial processing of large documents.

Union expressions are now supported, for example `doc()/(*/ABC | */XYZ)` or `doc()/*/(ABC|XYZ)`.

Simple filters are also supported. The filter may apply to the last step or to the expression as a whole, and it must only use downward selection from the context node (the self, child, attribute, descendant, descendant-or-self, or namespace axes). It must not be positional (that is, it must not reference position() or last(), and must not be numeric: in fact, it must be such that Saxon can determine at compile time that it will not be numeric). Filters cannot be applied to unions or to branches of unions. Any violation of these conditions causes the expression to be evaluated without the streaming optimization.

When the `xsl:copy-of` instruction is evaluated in "push" mode, for example when it appears in a template that is writing directly to the final result tree, the optimization is now enabled, and works without the need to create a second thread to handle the push-pull conflict. This mode of operation is useful when extracting a small subset of a large document.

Next