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