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.

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