private static OpenXmlElement GetChildMc(this OpenXmlElement parent, OpenXmlElement child, MCContext mcContext, FileFormatVersions format) { // Use stack to cache the next siblings in different levels. Stack <OpenXmlElement> nextSiblings = new Stack <OpenXmlElement>(); while (child != null) { var acb = child as AlternateContent; if (acb == null && child.IsInVersion(format)) { return(child); } else { mcContext.PushMCAttributes2(child.MCAttributes, child.LookupNamespace); if (acb != null) { nextSiblings.Push(child.GetNextNonMiscElementSibling()); var select = mcContext.GetContentFromACBlock(acb, format); if (select != null) { child = select.GetFirstNonMiscElementChild(); } else { // The ACB has no children elements. // case like: <acb/> <acb><choice/><fallback/></acb> child = null; } } else { // Ignorable element, skip it if (mcContext.IsIgnorableNs(child.NamespaceUri)) { // Any element marked with ProcessContent should be an Ignorable Element if (mcContext.IsProcessContent(child)) { nextSiblings.Push(child.GetNextNonMiscElementSibling()); // child = child.GetFirstNonMiscElementChild(); } else { child = child.GetNextNonMiscElementSibling(); } } else { mcContext.PopMCAttributes2(); return(child); } } mcContext.PopMCAttributes2(); } while (child == null && nextSiblings.Count > 0) { child = nextSiblings.Pop(); } } // child is null. return(child); }