xsl:merge
The purpose of the instruction is to allow streamed merging of two or more pre-sorted input files.
         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, and differences from the current
                    specification are noted.
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 is 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.
Details
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-stream 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.
Examples
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>