Insert

The xpath data model 3.1 says (https://www.w3.org/TR/xpath-datamodel-31/#Node)

"There are seven kinds of Nodes in the data model: document, element, attribute, text, namespace, processing instruction, and comment."

The possible sub-branches of each of these are:

Document:

Children: Element, Processing Instruction, Comment, Text.

Element:

Children: Element, Processing Instruction, Comment, Text

Attributes

Namespaces

Attribute: -

Text: -

Processing instruction: -

Comment: -

Namespace: -

The text for <insert/> says

"If [...] there is a node type conflict between the copied node and the target location (for example, an attribute cannot be inserted as a sibling of an element), the insertion for that copied node is ignored."

So I tried to draw up a table of what happens with each type of node being inserted to a location of each type of node. There is an 8th type of node: The root element is special because it cannot have sibling elements.

Rows: destination node, Columns: Source node.

X: Not allowed

?: Needs discussion

Sibling: The node is inserted as a sibling

Insert/replace: Either insert the node, or replace the node of the same name

Concat: adjacent text nodes must be concatenated

I think it would be good to discuss every entry in this table to make sure we agree that that is what happens.

Document Element Attribute Text NS PI Comment
Document X Replaces root element X X? X Insert? Insert?
Root element X Replaces root element Insert/replace attribute Sibling? Insert/replace Insert Insert
Element X Sibling unless parent is doc Insert/replace attribute Sibling Insert/replace Insert Insert
Attribute X X Insert/replace attribute X? X X X
Text X Sibling unless parent is doc X Concat X Sibling Sibling
NS X X X X Insert/replace X X
PI X Sibling unless parent is doc X Sibling X Sibling Sibling
Comment X Sibling unless parent is doc X Sibling X Sibling Sibling