xsl:merge instruction is new in XSLT 3.0, and is first implemented in Saxon-EE 9.4. The purpose
of the instruction is to allow streamed merging of two or more pre-sorted input files, but the current implementation
in Saxon is unstreamed.
The syntax of
xsl:merge has been significantly changed in the February 2013 draft of XSLT 3.0, and the
revised syntax is implemented in Saxon 9.5. The implementation is still unstreamed.
In the new syntax, each kind of input source is described in an
xsl:merge-source child element of the
instruction; if there are multiple instances of that kind of input source, they are selected in the
xsl:merge-source element, while the
select attribute selects the actual nodes forming the input sequence.
The processing to be carried out on each group of input items sharing a value
for the merge key is defined in a
The following example merges a homogenous collection of log files, each already sorted by timestamp:<xsl:merge> <xsl:merge-source for-each="collection('log-collection')" select="events/event"/> <xsl:merge-key select="@timestamp" order="ascending"/> </xsl:merge-source> <xsl:merge-action> <xsl:sequence select="current-group()"/> </xsl:merge-action> </xsl:merge>
The following example merges two log files with different internal structure:<xsl:merge> <xsl:merge-source select="doc('log1.xml')" select="transactions/transaction"/> <xsl:merge-key select="xs:dateTime(@date, @time)" order="ascending"/> </xsl:merge-source> <xsl:merge-source select="doc('log2.xml')" select="eventdata/transfer"/> <xsl:merge-key select="@timestamp" order="ascending"/> </xsl:merge-source> <xsl:merge-action> <xsl:apply-templates select="current-group()"/> </xsl:merge-action> </xsl:merge>
are not yet implemented. Instead, the
functions are used, as in earlier releases.
current-merge-inputs() is not implemented.
Saxon 9.5 implements the
sort-before-merge attribute, which allows the input to be sorted