docs: def attr_ignore_predicate(self, fact_dict):
          """
          The attr_ignore predicate is called for each fact that would be generated
          for an XML attribute. It takes a fact dictionary of the following form
          as input::
                 { 'node_id': 'N001:L000:N000:A000',
                   'term': 'Hashes/Hash/Simple_Hash_Value',
                   'attribute': 'condition',
                   'value': u'Equals'
                 }
  
          If the predicate returns 'False, the fact is *not* created. Note that, nevertheless,
          during import, the information about this attribute is available to
          the attributed fact as part of the 'attr_dict' that is generated for the creation
          of each fact and passed to the handler functions called for the fact.
  
          """
          if not fact_dict['attribute']:
              return False
  
          if '@' in fact_dict['attribute']: # and not fact_dict['attribute'] == '@ns':
              # We remove all attributes added by Dingo during import
  
              #if (fact_dict['attribute']=='@ns'
              #    and
              #        (('extension' in fact_dict['value']
              #         or
              #         ((not 'stix' in fact_dict['value'])
              #         and
              #         (not 'cybox' in fact_dict['value'])
              #         )
              #         )
              #        )
              #):
              #    return False
              #else:
              #    return True
  
              return True
  
          attr_key = fact_dict['attribute']
  
          cybox_attr_ignore_list = [# we drop id-attributes:
                                    # everything that has an identifier gives rise to a new object and
                                    # the identifier is used then and there,
                                    'id' ,
                                    'object_reference',
                                    'idref',
                                    # Type information we have already read and treated,
                                    # so no need to keep it around
  
                                    'datatype',
                                    'type',
                                    # value_set attributes are treated by a special handler
                                    'value_set',
                                    # no need to retain the schemaLocation info on top-level.
                                    'xsi:schemaLocation'
          ]
  
          if attr_key in cybox_attr_ignore_list:
              return True
  
          if attr_key == 'xsi:type':
  
              if fact_dict['term']== 'Properties':
                  # We only keep xsi:type information that is not on top-level of an object
                  # (if it was on top-level, we have integrated the information into
                  # the namespace of the InfoObject anyhow).
                  return True
              if fact_dict.get('number_of_attributed_elements',0) == 0 and not 'Marking_Structure' in fact_dict['term']:
                  # We only keep xsi_type info in a node that has children: otherwise, the xsi:type
                  # refers to the type of the value in the element, and that we are already treating
                  # in the datatype_extractor. Exception: the Marking_Structures defined by MITRE
                  # do not contain subelements, but we want to keep the xsi:type information around.
  
                  return True
  
          if 'Kill_Chain_Phases' in fact_dict['term'] and not fact_dict['attribute'] in ['phase_id','kill_chain_id']:
              return True
  
  
          return False