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.
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
Available in XSLT 3.0. From Saxon 9.8, available in all editions. Implemented in Saxon-PE and Saxon-EE since Saxon 9.4. Available for all platforms.
Notes on the Saxon implementation
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; since Saxon 9.8, the implementation conforms with 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
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-source attribute of the
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
Merges a homogenous collection of log files, each already sorted by timestamp:<xsl:merge> <xsl:merge-source for-each-item="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>
Merges two log files with different internal structure:<xsl:merge> <xsl:merge-source select="doc('log1.xml')/transactions/transaction"/> <xsl:merge-key select="xs:dateTime(@date, @time)" order="ascending"/> </xsl:merge-source> <xsl:merge-source select="doc('log2.xml')/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>