docs: def check_recommended_global_attributes(self, dataset):
          '''
          Check the global recommended attributes for 1.1 templates. These go an extra step besides
          just checking that they exist.
  
          :param netCDF4.Dataset dataset: An open netCDF dataset
  
          Basic "does it exist" checks are done in BaseNCEICheck:check_recommended
          :title = "" ; //..................................................... RECOMMENDED - Provide a useful title for the data in the file. (ACDD)
          :summary = "" ; //................................................... RECOMMENDED - Provide a useful summary or abstract for the data in the file. (ACDD)
          :source = "" ; //.................................................... RECOMMENDED - The input data sources regardless of the method of production method used. (CF)
          :platform = "platform_variable" ; //................................. RECOMMENDED - Refers to a variable containing information about the platform. May also put this in individual variables. Use NODC or ICES platform table. (NODC)
          :instrument = "instrument_parameter_variable" ; //................... RECOMMENDED - Refers to a variable containing information about the instrument. May also put this in individual variables. Use NODC or GCMD instrument table. (NODC)
          :uuid = "" ; //...................................................... RECOMMENDED - Machine readable unique identifier for each file. A new uuid is created whenever the file is changed. (NODC)
          :sea_name = "" ; //.................................................. RECOMMENDED - The names of the sea in which the data were collected. Use NODC sea names table. (NODC)
          :id = "" ; //........................................................ RECOMMENDED - Should be a human readable unique identifier for data set. (ACDD)
          :naming_authority = "" ; //.......................................... RECOMMENDED - Backward URL of institution (for example, gov.noaa.nodc). (ACDD)
          :time_coverage_start = "" ; //....................................... RECOMMENDED - Use ISO8601 for date and time. (ACDD)
          :time_coverage_end = "" ; //......................................... RECOMMENDED - Use ISO8601 for date and time.(ACDD)
          :time_coverage_resolution = "" ; //.................................. RECOMMENDED - For example, "point" or "minute averages". (ACDD)
          :geospatial_lat_min = 0.0f ; //...................................... RECOMMENDED - Replace with correct value. (ACDD)
          :geospatial_lat_max = 0.0f ; //...................................... RECOMMENDED - Replace with correct value. (ACDD)
          :geospatial_lat_units = "degrees_north" ; //......................... RECOMMENDED - Use UDUNITS compatible units. (ACDD)
          :geospatial_lat_resolution= "" ; //.................................. RECOMMENDED - For example, "point" or "10 degree grid". (ACDD)
          :geospatial_lon_min = 0.0f ; //...................................... RECOMMENDED - Replace with correct value. (ACDD)
          :geospatial_lon_max = 0.0f ; //...................................... RECOMMENDED - Replace with correct value. (ACDD)
          :geospatial_lon_units = "degrees_east"; //........................... RECOMMENDED - Use UDUNITS compatible units. (ACDD)
          :geospatial_lon_resolution= "" ; //.................................. RECOMMENDED - For example, "point" or "10 degree grid". (ACDD)
          :geospatial_vertical_min = 0.0f ; //................................. RECOMMENDED - Replace with correct value. (ACDD)
          :geospatial_vertical_max = 0.0f ; //................................. RECOMMENDED - Replace with correct value. (ACDD)
          :geospatial_vertical_units = "" ; //................................. RECOMMENDED - Use UDUNITS compatible units. (ACDD)
          :geospatial_vertical_resolution = "" ; //............................ RECOMMENDED - For example, "point" or "1 meter binned". (ACDD)
          :geospatial_vertical_positive = "" ; //.............................. RECOMMENDED - Use "up" or "down". (ACDD)
          :institution = "" ; //............................................... RECOMMENDED - Institution of the person or group that collected the data.  An institution attribute can be used for each variable if variables come from more than one institution. (ACDD)
          :creator_name = "" ; //.............................................. RECOMMENDED - Name of the person who collected the data. (ACDD)
          :creator_url = "" ; //............................................... RECOMMENDED - URL for person who collected the data. (ACDD)
          :creator_email = "" ; //............................................. RECOMMENDED - Email address for person who collected the data. (ACDD)
          :project = "" ; //................................................... RECOMMENDED - Project the data was collected under. (ACDD)
          :processing_level = "" ; //.......................................... RECOMMENDED - Provide a description of the processing or quality control level of the data. (ACDD)
          :references = "" ; //................................................ RECOMMENDED - Published or web-based references that describe the data or methods used to produce it. (CF)
          :keywords_vocabulary = "" ; //....................................... RECOMMENDED - Identifies the controlled keyword vocabulary used to specify the values within the attribute "keywords". e.g. NASA/GCMD Earth Science Keywords (ACDD)
          :keywords = "" ; //.................................................. RECOMMENDED - A comma separated list of keywords coming from the keywords_vocabulary. (ACDD)
          :acknowledgment = "" ; //............................................ RECOMMENDED - Text to use to properly acknowledge use of the data. (ACDD)
          :comment = "" ; //................................................... RECOMMENDED - Provide useful additional information here. (ACDD and CF)
          :contributor_name = "" ; //.......................................... RECOMMENDED - A comma separated list of contributors to this data set. (ACDD)
          :contributor_role = "" ; //.......................................... RECOMMENDED - A comma separated list of their roles. (ACDD)
          :date_created = "" ; //.............................................. RECOMMENDED - Creation date of the netCDF.  Use ISO8601 for date and time. (ACDD)
          :date_modified = "" ; //............................................. RECOMMENDED - Modification date of the netCDF.  Use ISO8601 for date and time. (ACDD)
          :publisher_name = "" ; //............................................ RECOMMENDED - Publisher of the data. (ACDD)
          :publisher_email = "" ; //........................................... RECOMMENDED - Email address of the publisher of the data. (ACDD)
          :publisher_url = "" ; //............................................. RECOMMENDED - A URL for the publisher of the data. (ACDD)
          :history = "" ; //................................................... RECOMMENDED - Record changes made to the netCDF. (ACDD)
          :license = "" ; //................................................... RECOMMENDED - Describe the restrictions to data access and distribution. (ACDD)
          :metadata_link = "" ; //............................................. RECOMMENDED - This attribute provides a link to a complete metadata record for this data set or the collection that contains this data set. (ACDD)
          '''
  
          recommended_ctx = TestCtx(BaseCheck.MEDIUM, 'Recommended global attributes')
  
          # Do any of the variables define platform ?
          variable_defined_platform = any((hasattr(var, 'platform') for var in dataset.variables))
          if not variable_defined_platform:
              platform_name = getattr(dataset, 'platform', '')
              recommended_ctx.assert_true(platform_name and platform_name in dataset.variables, 'platform should exist and point to a variable.')
  
          sea_names = [sn.lower() for sn in util.get_sea_names()]
          sea_name = getattr(dataset, 'sea_name', '')
          sea_name = sea_name.replace(', ', ',')
          sea_name = sea_name.split(',') if sea_name else []
          for sea in sea_name:
              recommended_ctx.assert_true(
                  sea.lower() in sea_names,
                  'sea_name attribute should exist and should be from the NODC sea names list: {} is not a valid sea name'.format(sea)
              )
  
          # Parse dates, check for ISO 8601
          for attr in ['time_coverage_start', 'time_coverage_end', 'date_created', 'date_modified']:
              attr_value = getattr(dataset, attr, '')
              try:
                  parse_datetime(attr_value)
                  recommended_ctx.assert_true(True, '')  # Score it True!
              except ISO8601Error:
                  recommended_ctx.assert_true(False, '{} should exist and be ISO-8601 format (example: PT1M30S), currently: {}'.format(attr, attr_value))
  
          units = getattr(dataset, 'geospatial_lat_units', '').lower()
          recommended_ctx.assert_true(units == 'degrees_north', 'geospatial_lat_units attribute should be degrees_north: {}'.format(units))
  
          units = getattr(dataset, 'geospatial_lon_units', '').lower()
          recommended_ctx.assert_true(units == 'degrees_east', 'geospatial_lon_units attribute should be degrees_east: {}'.format(units))
  
          value = getattr(dataset, 'geospatial_vertical_positive', '')
          recommended_ctx.assert_true(value.lower() in ['up', 'down'], 'geospatial_vertical_positive attribute should be up or down: {}'.format(value))
  
          # I hate english.
          ack_exists = any((getattr(dataset, attr, '') != '' for attr in ['acknowledgment', 'acknowledgement']))
          recommended_ctx.assert_true(ack_exists, 'acknowledgement attribute should exist and not be empty')
  
          contributor_name = getattr(dataset, 'contributor_name', '')
          contributor_role = getattr(dataset, 'contributor_role', '')
          names = contributor_role.split(',')
          roles = contributor_role.split(',')
          recommended_ctx.assert_true(contributor_name != '', 'contributor_name should exist and not be empty.')
          recommended_ctx.assert_true(len(names) == len(roles), 'length of contributor names matches length of roles')
          recommended_ctx.assert_true(contributor_role != '', 'contributor_role should exist and not be empty.')
          recommended_ctx.assert_true(len(names) == len(roles), 'length of contributor names matches length of roles')
  
          if hasattr(dataset, 'comment'):
              recommended_ctx.assert_true(getattr(dataset, 'comment', '') != '', 'comment attribute should not be empty if specified')
  
          return recommended_ctx.to_result()