code: def write_iso19115_metadata(layer_uri, keywords, version_35=False):
      
      active_metadata_classes = METADATA_CLASSES
      if version_35:
          active_metadata_classes = METADATA_CLASSES35
  
      if 'layer_purpose' in keywords:
          if keywords['layer_purpose'] in active_metadata_classes:
              metadata = active_metadata_classes[
                  keywords['layer_purpose']](layer_uri)
          else:
              LOGGER.info(
                  'The layer purpose is not supported explicitly. It will use '
                  'generic metadata. The layer purpose is %s' %
                  keywords['layer_purpose'])
              if version_35:
                  metadata = GenericLayerMetadata35(layer_uri)
              else:
                  metadata = GenericLayerMetadata(layer_uri)
      else:
          if version_35:
              metadata = GenericLayerMetadata35(layer_uri)
          else:
              metadata = GenericLayerMetadata(layer_uri)
  
      metadata.update_from_dict(keywords)
      # Always set keyword_version to the latest one.
      if not version_35:
          metadata.update_from_dict({'keyword_version': inasafe_keyword_version})
  
      if metadata.layer_is_file_based:
          xml_file_path = os.path.splitext(layer_uri)[0] + '.xml'
          metadata.write_to_file(xml_file_path)
      else:
          metadata.write_to_db()
  
      return metadata
docs: Create metadata  object from a layer path and keywords dictionary.
  
      This function will save these keywords to the file system or the database.
  
      :param version_35: If we write keywords version 3.5. Default to False.
      :type version_35: bool
  
      :param layer_uri: Uri to layer.
      :type layer_uri: basestring
  
      :param keywords: Dictionary of keywords.
      :type keywords: dict