diff --git a/src/internal/XMLScanner2.cpp b/src/internal/XMLScanner2.cpp index 1e1854849b840c69d096125e5ca28618be6606bc..bd8d5bff9e3a1907e78b1ad474c65a3b8a820162 100644 --- a/src/internal/XMLScanner2.cpp +++ b/src/internal/XMLScanner2.cpp @@ -1551,42 +1551,49 @@ void XMLScanner::resolveSchemaGrammar(const XMLCh* const loc, const XMLCh* const DOM_Element root = document.getDocumentElement();// This is what we pass to TraverserSchema if (!root.isNull()) { - // - // Since we have seen a grammar, set our validation flag - // at this point if the validation scheme is auto - // - if (fValScheme == Val_Auto && !fValidate) { - fValidate = true; - fElemStack.setValidationFlag(fValidate); + const XMLCh* newUri = root.getAttribute(SchemaSymbols::fgATT_TARGETNAMESPACE).rawBuffer(); + if (XMLString::compareString(newUri, uri)) { + if (fValidate) + fValidator->emitError(XMLValid::WrongTargetNamespace, loc, uri); + grammar = fGrammarResolver->getGrammar(newUri); } - // we have seen a schema, so set up the fValidator as fSchemaValidator - if (!fValidator->handlesSchema()) - { - if (fValidatorFromUser) { - // the fValidator is from user - ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator); - } - else { - fValidator = fSchemaValidator; + if (!grammar || grammar->getGrammarType() == Grammar::DTDGrammarType) { + + // + // Since we have seen a grammar, set our validation flag + // at this point if the validation scheme is auto + // + if (fValScheme == Val_Auto && !fValidate) { + fValidate = true; + fElemStack.setValidationFlag(fValidate); } - } - if (fValidate && (!uri || !root.getAttribute(SchemaSymbols::fgATT_TARGETNAMESPACE).equals(uri))) - fValidator->emitError(XMLValid::WrongTargetNamespace, loc, uri); + // we have seen a schema, so set up the fValidator as fSchemaValidator + if (!fValidator->handlesSchema()) + { + if (fValidatorFromUser) { + // the fValidator is from user + ThrowXML(RuntimeException, XMLExcepts::Gen_NoSchemaValidator); + } + else { + fValidator = fSchemaValidator; + } + } - grammar = new SchemaGrammar(); - TraverseSchema traverseSchema(root, fURIStringPool, (SchemaGrammar*) grammar, fGrammarResolver, this, fValidator, srcToFill->getSystemId(), fEntityResolver, fErrorHandler); + grammar = new SchemaGrammar(); + TraverseSchema traverseSchema(root, fURIStringPool, (SchemaGrammar*) grammar, fGrammarResolver, this, fValidator, srcToFill->getSystemId(), fEntityResolver, fErrorHandler); - if (fGrammarType == Grammar::DTDGrammarType) { - fGrammar = grammar; - fGrammarType = Grammar::SchemaGrammarType; - fValidator->setGrammar(fGrammar); - } + if (fGrammarType == Grammar::DTDGrammarType) { + fGrammar = grammar; + fGrammarType = Grammar::SchemaGrammarType; + fValidator->setGrammar(fGrammar); + } - if (!fReuseGrammar && fValidate) { - // validate the Schema scan so far - fValidator->preContentValidation(fReuseGrammar); + if (!fReuseGrammar && fValidate) { + // validate the Schema scan so far + fValidator->preContentValidation(fReuseGrammar); + } } } }