I need to merge Saxon Documentation - merge one node from the source XML file merge.xml into the file merge-test.xml, positioning the node in between two other nodes in the output file output.xml. No sorting is necessary. Each corresponding node from merge.xml needs to be inserted into each in the output file. There are the same number of nodes in each file merge.xml and merge-test.xml
So, from merge.xml, the <mergeinto><mergecontent>Lorem Ipsum Content 1</mergecontent></mergeinto> node gets merged into each <entry> node in merge-test.xml, in between <title></title> and <content type='html'></content>, in sequence, and then output in the desired structure in output.xml.
I have a very rough merge-stylesheet.xsl with as much as I can figure out :)
merge-test.xml
<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:blogger='http://schemas.google.com/blogger/2018'>
<id>tag:blogger.com,1999:blog-17477</id>
<title>Test Blog</title>
<entry>
<id>tag:blogger.com,1999:blog-17477.post-670855911</id>
<blogger:type>POST</blogger:type>
<blogger:status>LIVE</blogger:status>
<author>
<name>Author</name>
<uri>Author Link</uri>
<blogger:type>BLOGGER</blogger:type>
</author>
<title>Title Title</title>
<content type='html'>Content Content Content Content Content</content>
<blogger:metaDescription/>
<blogger:created>2011-01-05T16:33:59.731Z</blogger:created>
<published>2011-01-06T12:32:00.001Z</published>
<updated>2011-01-06T12:32:00.138Z</updated>
<blogger:location/>
<category scheme='tag:blogger.com,1999:blog-17477683' term='News'/>
<blogger:filename>/2011/01/a-post.html</blogger:filename>
<link/>
<enclosure/>
<blogger:trashed/>
</entry>
<entry>
<id>tag:blogger.com,1999:blog-17477.post-670855911</id>
<blogger:type>POST</blogger:type>
<blogger:status>LIVE</blogger:status>
<author>
<name>Author</name>
<uri></uri>
<blogger:type>BLOGGER</blogger:type>
</author>
<title>Title Title</title>
<content type='html'>Some Content Content</content>
<blogger:metaDescription/>
<blogger:created>2022-01-05T16:33:59.731Z</blogger:created>
<published>2022-01-06T12:32:00.001Z</published>
<updated>2022-01-06T12:32:00.138Z</updated>
<blogger:location/>
<category scheme='tag:blogger.com,1999:blog-17477683' term='News'/>
<blogger:filename>/2024/03/post.html</blogger:filename>
<link/>
<enclosure/>
<blogger:trashed/>
</entry>
<entry>
<id>tag:blogger.com,1999:blog-17477.post-670855911</id>
<blogger:type>POST</blogger:type>
<blogger:status>LIVE</blogger:status>
<author>
<name>Author</name>
<uri></uri>
<blogger:type>BLOGGER</blogger:type>
</author>
<title>Title Title</title>
<content type='html'>Content Content Content Content Content</content>
<blogger:metaDescription/>
<blogger:created>2011-01-05T16:33:59.731Z</blogger:created>
<published>2011-01-06T12:32:00.001Z</published>
<updated>2011-01-06T12:32:00.138Z</updated>
<blogger:location/>
<category scheme='tag:blogger.com,1999:blog-17477683' term='News'/>
<blogger:filename>/2011/01/z-post.html</blogger:filename>
<link/>
<enclosure/>
<blogger:trashed/>
</entry>
<entry>
<id>tag:blogger.com,1999:blog-17477.post-670855911</id>
<blogger:type>POST</blogger:type>
<blogger:status>LIVE</blogger:status>
<author>
<name>Author</name>
<uri></uri>
<blogger:type>BLOGGER</blogger:type>
</author>
<title>Title Title</title>
<content type='html'>Some Content Content</content>
<blogger:metaDescription/>
<blogger:created>2022-01-05T16:33:59.731Z</blogger:created>
<published>2022-01-06T12:32:00.001Z</published>
<updated>2022-01-06T12:32:00.138Z</updated>
<blogger:location/>
<category scheme='tag:blogger.com,1999:blog-17477683' term='News'/>
<blogger:filename>/2022/03/post.html</blogger:filename>
<link/>
<enclosure/>
<blogger:trashed/>
</entry>
</feed>
merge.xml
<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:blogger='http://schemas.google.com/blogger/2018'>
<mergeinto>
<mergecontent>Lorem Ipsum Content 1</mergecontent>
</mergeinto>
<mergeinto>
<mergecontent>Lorem Ipsum Content 2</mergecontent>
</mergeinto>
<mergeinto>
<mergecontent>Lorem Ipsum Content 3</mergecontent>
</mergeinto>
<mergeinto>
<mergecontent>Lorem Ipsum Content 4</mergecontent>
</mergeinto>
</feed>
merge-stylesheet.xsl
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xpath-default-namespace="http://www.w3.org/2005/Atom"
xmlns:blogger='http://schemas.google.com/blogger/2018'>
<xsl:output indent="yes"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="/feed">
<xsl:merge-source for-each-item="merge.xml" select="mergeinto/mergecontent"/>
????
</xsl:template>
</xsl:stylesheet>
desired output.xml
<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:blogger='http://schemas.google.com/blogger/2018'>
<id>tag:blogger.com,1999:blog-17477</id>
<title>Test Blog</title>
<entry>
<id>tag:blogger.com,1999:blog-17477.post-670855911</id>
<blogger:type>POST</blogger:type>
<blogger:status>LIVE</blogger:status>
<author>
<name>Author</name>
<uri>Author Link</uri>
<blogger:type>BLOGGER</blogger:type>
</author>
<title>Title Title</title>
<mergeinto>
<mergecontent>Lorem Ipsum Content 1</mergecontent>
</mergeinto>
<content type='html'>Content Content Content Content Content</content>
<blogger:metaDescription/>
<blogger:created>2011-01-05T16:33:59.731Z</blogger:created>
<published>2011-01-06T12:32:00.001Z</published>
<updated>2011-01-06T12:32:00.138Z</updated>
<blogger:location/>
<category scheme='tag:blogger.com,1999:blog-17477683' term='News'/>
<blogger:filename>/2011/01/a-post.html</blogger:filename>
<link/>
<enclosure/>
<blogger:trashed/>
</entry>
<entry>
<id>tag:blogger.com,1999:blog-17477.post-670855911</id>
<blogger:type>POST</blogger:type>
<blogger:status>LIVE</blogger:status>
<author>
<name>Author</name>
<uri></uri>
<blogger:type>BLOGGER</blogger:type>
</author>
<title>Title Title</title>
<mergeinto>
<mergecontent>Lorem Ipsum Content 2</mergecontent>
</mergeinto>
<content type='html'>Some Content Content</content>
<blogger:metaDescription/>
<blogger:created>2022-01-05T16:33:59.731Z</blogger:created>
<published>2022-01-06T12:32:00.001Z</published>
<updated>2022-01-06T12:32:00.138Z</updated>
<blogger:location/>
<category scheme='tag:blogger.com,1999:blog-17477683' term='News'/>
<blogger:filename>/2024/03/post.html</blogger:filename>
<link/>
<enclosure/>
<blogger:trashed/>
</entry>
<entry>
<id>tag:blogger.com,1999:blog-17477.post-670855911</id>
<blogger:type>POST</blogger:type>
<blogger:status>LIVE</blogger:status>
<author>
<name>Author</name>
<uri></uri>
<blogger:type>BLOGGER</blogger:type>
</author>
<title>Title Title</title>
<mergeinto>
<mergecontent>Lorem Ipsum Content 3</mergecontent>
</mergeinto>
<content type='html'>Content Content Content Content Content</content>
<blogger:metaDescription/>
<blogger:created>2011-01-05T16:33:59.731Z</blogger:created>
<published>2011-01-06T12:32:00.001Z</published>
<updated>2011-01-06T12:32:00.138Z</updated>
<blogger:location/>
<category scheme='tag:blogger.com,1999:blog-17477683' term='News'/>
<blogger:filename>/2011/01/z-post.html</blogger:filename>
<link/>
<enclosure/>
<blogger:trashed/>
</entry>
<entry>
<id>tag:blogger.com,1999:blog-17477.post-670855911</id>
<blogger:type>POST</blogger:type>
<blogger:status>LIVE</blogger:status>
<author>
<name>Author</name>
<uri></uri>
<blogger:type>BLOGGER</blogger:type>
</author>
<title>Title Title</title>
<mergeinto>
<mergecontent>Lorem Ipsum Content 4</mergecontent>
</mergeinto>
<content type='html'>Some Content Content</content>
<blogger:metaDescription/>
<blogger:created>2022-01-05T16:33:59.731Z</blogger:created>
<published>2022-01-06T12:32:00.001Z</published>
<updated>2022-01-06T12:32:00.138Z</updated>
<blogger:location/>
<category scheme='tag:blogger.com,1999:blog-17477683' term='News'/>
<blogger:filename>/2022/03/post.html</blogger:filename>
<link/>
<enclosure/>
<blogger:trashed/>
</entry>
</feed>
I am not sure xsl:merge is needed, it needs a merge key, it seems you just want to pull the n'th element from the other file for the n'th entry; one way to achieve that is e.g.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="3.0"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xpath-default-namespace="http://www.w3.org/2005/Atom"
exclude-result-prefixes="#all"
expand-text="yes">
<xsl:strip-space elements="*"/>
<xsl:output method="xml" indent="yes"/>
<xsl:mode on-no-match="shallow-copy"/>
<xsl:template match="entry">
<xsl:copy>
<xsl:apply-templates select="*">
<xsl:with-param name="pos" tunnel="yes" as="xs:integer">
<xsl:number/>
</xsl:with-param>
</xsl:apply-templates>
</xsl:copy>
</xsl:template>
<xsl:template match="title">
<xsl:param name="pos" tunnel="yes"/>
<xsl:next-match/>
<xsl:copy-of select="$merge.xml/*/*[$pos]"/>
</xsl:template>
<xsl:param name="merge.xml">
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:blogger='http://schemas.google.com/blogger/2018'>
<mergeinto>
<mergecontent>Lorem Ipsum Content 1</mergecontent>
</mergeinto>
<mergeinto>
<mergecontent>Lorem Ipsum Content 2</mergecontent>
</mergeinto>
<mergeinto>
<mergecontent>Lorem Ipsum Content 3</mergecontent>
</mergeinto>
<mergeinto>
<mergecontent>Lorem Ipsum Content 4</mergecontent>
</mergeinto>
</feed>
</xsl:param>
</xsl:stylesheet>
For completeness and self-containedness the second XML's data is inlined in the xsl:param, of course in real life you might as well use <xsl:param name="merge.xml" select="doc('merge.xml')"/>.