xsl:merge
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; 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
xsl:merge.
Streamed processing requires Saxon-EE, but the instruction is implemented without streaming in Saxon-PE and Saxon-HE.
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-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.
Examples
Example 1
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>Example 2
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>