XmlElementDescriptor (XmlTag element, XmlTag contextTag) { final XmlElement context = (XmlElement)element.getParent(); XmlElementDescriptor elementDescriptor = getElementDescriptor( element.getLocalName(), element.getNamespace(), context, element.getName() ); if(elementDescriptor == null || element.getAttributeValue("xsi:type") != null){ final XmlElementDescriptor xmlDescriptorByType = XmlUtil.findXmlDescriptorByType(element); if (xmlDescriptorByType != null) elementDescriptor = xmlDescriptorByType; else if (context instanceof XmlTag && ((XmlTag)context).getAttributeValue("xsi:type") != null && askParentDescriptorViaXsi()) { final XmlElementDescriptor parentXmlDescriptorByType = XmlUtil.findXmlDescriptorByType(((XmlTag)context)); if (parentXmlDescriptorByType != null) { elementDescriptor = parentXmlDescriptorByType.getElementDescriptor(element, contextTag); } } } return elementDescriptor; }