I have just figured this out after all. Seems I need to get all the elements out of the SdtContent as an array and i can then insert the elements one by one and then delete the original sdtblock.
Here is my code incase it is of use to anyone else:
List sdtBlocks = doc.Document.Descendants().ToList();
Guid guidTest;
foreach (SdtBlock sdtBlock in sdtBlocks)
{
if (Guid.TryParse(sdtBlock.SdtProperties.GetFirstChild().Val.Value, out guidTest))
{
if (unityObjectData.ContainsKey(guidTest))
{
// Get parent element to do the insert on later in this code
OpenXmlElement blockParent = sdtBlock.Parent;
// Get an array of all elements inside the SdtContentBlock element of SdtBlock
OpenXmlElement[] elements = sdtBlock.GetFirstChild().ChildElements.ToArray();
// Variable to note insertion point
OpenXmlElement InsertPoint;
// Element to insert -- note we need to clone the current element or
// we get an error message that it cannot be inserted as it is part of a tree
OpenXmlElement InsertElement;
// elements are inserted in reverse order as I cant seem to work
// out how to get a reference to the new element that was entered in
// order the insert the next element after.
for (int i = elements.Count() - 1; i >= 0; i--)
{
InsertElement = elements[i].CloneNode(true);
blockParent.InsertAfter(InsertElement, sdtBlock);
}
sdtBlock.Remove();
}
}