The purpose of the instruction is to allow merging of two or more pre-sorted input files, optionally using streamed processing of any or all of the inputs.

Category: instruction
Content: ( xsl:merge-source+ , xsl:merge-action , xsl:fallback* )
Permitted parent elements: any XSLT element whose content model is sequence-constructor; any literal result element
Element has no attributes

Notes on the Saxon implementation

The xsl:merge instruction is new in XSLT 3.0, and was first implemented in Saxon-EE 9.4. There have been a number of changes to the specification in successive working drafts; Saxon 9.8 implements the final XSLT 3.0 Recommendation..

Saxon 9.5 implemented the sort-before-merge attribute, which allows the input to be sorted before merging.

Saxon 9.6 introduced support for streamed merging. There was one departure from the specification: the nodes selected for merging using the xsl:merge-source/@select are copies of the nodes in the source document (in the sense of the copy-of() function), rather than snapshots (as defined by the snapshot() function). This means that ancestors of the selected nodes, and attributes of ancestors, are not available. For more information see Streaming with xsl:merge.

Streamed processing requires Saxon-EE, but the instruction is implemented without streaming in Saxon-PE and Saxon-HE.


Each kind of input source is described in an xsl:merge-source child element of the xsl:merge instruction; if there are multiple instances of that kind of input source, they are selected in the for-each-item or for-each-source attribute of 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 an xsl:merge-action element.


Example 1

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-merge-group()"/> </xsl:merge-action> </xsl:merge>

Example 2

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-merge-group()"/> </xsl:merge-action> </xsl:merge>

Links to W3C specifications

XSLT 3.0 Specification

See also