diff --git a/src/xercesc/validators/schema/SchemaValidator.cpp b/src/xercesc/validators/schema/SchemaValidator.cpp index c06000dd45b0002a627abeba84aec48d9b634810..20f40316342da302202b63e5302d386043171c0e 100644 --- a/src/xercesc/validators/schema/SchemaValidator.cpp +++ b/src/xercesc/validators/schema/SchemaValidator.cpp @@ -630,14 +630,21 @@ void SchemaValidator::validateElement(const XMLElementDecl* elemDef) fErrorOccurred = true; } else if(elemTypeInfo != typeInfo) { - int derivationMethod = typeInfo->getDerivedBy(); - if ((((SchemaElementDecl*)elemDef)->getBlockSet() & derivationMethod) != 0) { - emitError(XMLValid::ElemNoSubforBlock, elemDef->getFullName()); - fErrorOccurred = true; - } - if ((tempType->getBlockSet() & derivationMethod) != 0) { - emitError(XMLValid::TypeNoSubforBlock, tempType->getTypeName()); - fErrorOccurred = true; + // perform the check on the entire inheritance chain + ComplexTypeInfo* tempType = typeInfo; + while (tempType) { + if (tempType == elemTypeInfo) + break; + int derivationMethod = tempType->getDerivedBy(); + if ((((SchemaElementDecl*)elemDef)->getBlockSet() & derivationMethod) != 0) { + emitError(XMLValid::ElemNoSubforBlock, elemDef->getFullName()); + fErrorOccurred = true; + } + if ((elemTypeInfo->getBlockSet() & derivationMethod) != 0) { + emitError(XMLValid::TypeNoSubforBlock, elemTypeInfo->getTypeName()); + fErrorOccurred = true; + } + tempType = tempType->getBaseComplexTypeInfo(); } } }