docs: def setAttributes(self, node):
          """Sets up attribute dictionary, checks for required attributes and 
             sets default attribute values. attr is for default attribute values 
             determined at runtime.
             
             structure of attributes dictionary
                 ['xmlns'][xmlns_key] --  xmlns namespace
                 ['xmlns'][prefix] --  declared namespace prefix 
                 [namespace][prefix] -- attributes declared in a namespace
                 [attribute] -- attributes w/o prefix, default namespaces do
                     not directly apply to attributes, ie Name can't collide 
                     with QName.
          """
          self.attributes = {XMLSchemaComponent.xmlns:{}}
          for k,v in node.getAttributeDictionary().items():
              prefix,value = SplitQName(k)
              if value == XMLSchemaComponent.xmlns:
                  self.attributes[value][prefix or XMLSchemaComponent.xmlns_key] = v
              elif prefix:
                  ns = node.getNamespace(prefix)
                  if not ns: 
                      raise SchemaError, 'no namespace for attribute prefix %s'\
                          %prefix
                  if not self.attributes.has_key(ns):
                      self.attributes[ns] = {}
                  elif self.attributes[ns].has_key(value):
                      raise SchemaError, 'attribute %s declared multiple times in %s'\
                          %(value, ns)
                  self.attributes[ns][value] = v
              elif not self.attributes.has_key(value):
                  self.attributes[value] = v
              else:
                  raise SchemaError, 'attribute %s declared multiple times' %value
  
          if not isinstance(self, WSDLToolsAdapter):
              self.__checkAttributes()
          self.__setAttributeDefaults()
  
          #set QNames
          for k in ['type', 'element', 'base', 'ref', 'substitutionGroup', 'itemType']:
              if self.attributes.has_key(k):
                  prefix, value = SplitQName(self.attributes.get(k))
                  self.attributes[k] = \
                      TypeDescriptionComponent((self.getXMLNS(prefix), value))
  
          #Union, memberTypes is a whitespace separated list of QNames 
          for k in ['memberTypes']:
              if self.attributes.has_key(k):
                  qnames = self.attributes[k]
                  self.attributes[k] = []
                  for qname in qnames.split():
                      prefix, value = SplitQName(qname)
                      self.attributes['memberTypes'].append(\
                          TypeDescriptionComponent(\
                              (self.getXMLNS(prefix), value)))