diff --git a/src/xercesc/validators/schema/TraverseSchema.cpp b/src/xercesc/validators/schema/TraverseSchema.cpp index 0347fa7762ed9a6067ec182d10c2373e6655325c..d41ad9d36d211c931a8542c04eb2f77373d0315e 100644 --- a/src/xercesc/validators/schema/TraverseSchema.cpp +++ b/src/xercesc/validators/schema/TraverseSchema.cpp @@ -5035,7 +5035,10 @@ TraverseSchema::isSubstitutionGroupValid(const DOMElement* const elem, DatatypeValidator* elemDV = typeInfo->getDatatypeValidator(); DatatypeValidator* subsValidator = subsElemDecl->getDatatypeValidator(); - if (subsValidator && subsValidator->isSubstitutableBy(elemDV)) { + if (elemDV == subsValidator) { + return true; + } + else if (subsValidator && subsValidator->isSubstitutableBy(elemDV)) { if ((subsElemDecl->getFinalSet() & derivationMethod) == 0) { return true; } @@ -5047,6 +5050,10 @@ TraverseSchema::isSubstitutionGroupValid(const DOMElement* const elem, else { // complex content ComplexTypeInfo* subsTypeInfo = subsElemDecl->getComplexTypeInfo(); + + if (subsTypeInfo == typeInfo) + return true; + const ComplexTypeInfo* elemTypeInfo = typeInfo; for (; elemTypeInfo && elemTypeInfo != subsTypeInfo; @@ -5068,7 +5075,10 @@ TraverseSchema::isSubstitutionGroupValid(const DOMElement* const elem, // first, check for type relation. DatatypeValidator* subsValidator = subsElemDecl->getDatatypeValidator(); - if (subsValidator && subsValidator->isSubstitutableBy(validator) + if (subsValidator == validator) { + return true; + } + else if (subsValidator && subsValidator->isSubstitutableBy(validator) && ((subsElemDecl->getFinalSet() & SchemaSymbols::XSD_RESTRICTION) == 0)) { return true; }