private OpenXmlElement CreateChildElement() { Debug.Assert(_elementStack.Count > 0); Debug.Assert(_xmlReader != null); OpenXmlElement element = _elementStack.Peek(); // AlternateContent / Choice / Fallback needs special treatment // The ElementFactory( ) of the Choice / Fallback depends on the parent of AlternateContentChoice // TODO: find a better solution if (element is AlternateContentChoice || element is AlternateContentFallback) { if (_elementStack.Count > 2) { OpenXmlElement topElement = _elementStack.Pop(); OpenXmlElement acElement = _elementStack.Pop(); OpenXmlElement parentsParent = _elementStack.Peek().CloneNode(false); _elementStack.Push(acElement); _elementStack.Push(topElement); element = topElement.CloneNode(false); acElement = new AlternateContent(); acElement.AppendChild(element); parentsParent.AppendChild(acElement); } } return(element.ElementFactory(_xmlReader)); }