docs: function (namespace, schemaContent, cb) {
      var self = this;
  
      if (multivalue.hasValue(self.parsedSchemas, namespace, schemaContent)) {
        cb(null, {});
        return;
      }
  
      xml2js.parseString(schemaContent, function (err, result) {
        if (err) {
          cb(err);
          return;
        }
  
        // Only one root element expected
        if (!result || _.size(result) !== 1) {
          cb("Invalid schema for " + namespace + ": " + util.inspect(result, false, null));
          return;
        }
  
        parseNamespacePrefixes(result, function (err, defaultNamespace, namespaces, xsPrefix) {
          if (err) {
            cb(err);
            return;
          }
  
          assert(result[xsPrefix + 'schema'], result);
  
          var schema = result[xsPrefix + 'schema'];
  
          if (schema.$ && schema.$.targetNamespace && schema.$.targetNamespace !== namespace) {
            cb("Schema does not have expected target namespace " + namespace + ": " + util.inspect(result, false, null));
            return;
          }
  
          var schemaParser = new XsdSchema(self, namespace, defaultNamespace, namespaces, xsPrefix);
  
          var importsAndIncludes = schemaParser.parseImportsAndIncludes(namespace, schema);
  
          var newElements = schemaParser.parseElements(schema, null);
          // TODO: Check if we are overriding anything
          _.extend(self.elements, newElements);
  
          var newAttributes = schemaParser.parseAttributes(schema);
          // TODO: Check if we are overriding anything
          _.extend(self.attributes, newAttributes);
  
          var newTypes = schemaParser.parseTypes(schema);
          // TODO: Check if we are overriding anything
          _.extend(self.types, newTypes);
  
          // TODO: Add support for element and attribute groups
          delete schema[xsPrefix + 'group'];
          delete schema[xsPrefix + 'attributeGroup'];
  
          // Previous parsing calls are destructive and should consume schema so that it is empty now
          assert(_.isEmpty(schema), schema);
  
          multivalue.addValue(self.parsedSchemas, namespace, schemaContent);
  
          cb(null, importsAndIncludes);
        });
      });
    }