src/main/java/org/xmlet/xsdparser/core/XsdParserCore.java
void resolveRefs() {
        Map<String, List<NamedConcreteElement>> concreteElementsMap =
                parseElements.stream()
                        .filter(concreteElement -> concreteElement instanceof NamedConcreteElement)
                        .map(concreteElement -> (NamedConcreteElement) concreteElement)
                        .collect(groupingBy(NamedConcreteElement::getName));

        unsolvedElements.forEach(unsolvedElement -> replaceUnsolvedReference(concreteElementsMap, unsolvedElement));
    }
void resolveRefs() {
        Map<String, List<NamedConcreteElement>> concreteElementsMap =
                parseElements.stream()
                        .filter(concreteElement -> concreteElement instanceof NamedConcreteElement)
                        .map(concreteElement -> (NamedConcreteElement) concreteElement)
                        .collect(groupingBy(NamedConcreteElement::getName));

        unsolvedElements.forEach(unsolvedElement -> replaceUnsolvedReference(concreteElementsMap, unsolvedElement));
    }
This method resolves all the remaining {@link UnsolvedReference} objects present after all the elements are parsed.
It starts by iterating all {@link XsdParser#parseElements} and inserting all the parsed elements with a name
attribute in the concreteElementsMap variable. After that it iterates on the {@link XsdParser#unsolvedElements}
list in order to find if any of the unsolvedReferences can be solved by replacing the unsolvedElement by its
matching {@link NamedConcreteElement} object, present in the concreteElementsMap. The {@link UnsolvedReference}
objects matches a {@link NamedConcreteElement} object by having its ref attribute with the same value as the
name attribute of the {@link NamedConcreteElement}.