private XmlElementDescriptor[] getElementsDescriptorsImpl(XmlElement context) {
    TypeDescriptor type = getType(context);

    if (type instanceof ComplexTypeDescriptor typeDescriptor) {

      XmlElementDescriptor[] elements = typeDescriptor.getElements(context);
      if (context instanceof XmlTag && elements.length > 0) {
        String[] namespaces = ((XmlTag)context).knownNamespaces();
        if (namespaces.length > 1) {
          List<XmlElementDescriptor> result = new ArrayList<>(Arrays.asList(elements));
          for (String namespace : namespaces) {
            if (namespace.equals(typeDescriptor.getNsDescriptor().getDefaultNamespace())) {
              continue;
            }
            XmlNSDescriptor descriptor = ((XmlTag)context).getNSDescriptor(namespace, false);
            if (descriptor instanceof XmlNSDescriptorImpl && ((XmlNSDescriptorImpl)descriptor).hasSubstitutions()) {
              for (XmlElementDescriptor element : elements) {
                String name = XmlUtil.getLocalName(element.getName(context)).toString();
                String s = ((XmlNSDescriptorImpl)element.getNSDescriptor()).getDefaultNamespace();
                XmlElementDescriptor[] substitutes = ((XmlNSDescriptorImpl)descriptor).getSubstitutes(name, s);
                result.addAll(Arrays.asList(substitutes));
              }
            }
          }
          return result.toArray(XmlElementDescriptor.EMPTY_ARRAY);
        }
      }
      return elements;
    }

    return EMPTY_ARRAY;
  }
private XmlElementDescriptor[] getElementsDescriptorsImpl(XmlElement context)