code: def get_reference(root):
      reference = {}
      elem = root.find('bibliographyLink')
      if elem is None:
          raise MissingElementError('bibliographyLink')
      ref_doi = elem.get('doi', None)
      ref_key = elem.get('preferredKey', None)
      if ref_doi is not None:
          try:
              ref = crossref_api.works(ids=ref_doi)['message']
          except (HTTPError, habanero.RequestError, ConnectionError):
              if ref_key is None:
                  raise KeywordError('DOI not found and preferredKey attribute not set')
              else:
                  warn('Missing doi attribute in bibliographyLink or lookup failed. '
                       'Setting "detail" key as a fallback; please update to the appropriate fields.'
                       )
                  reference['detail'] = ref_key
                  if reference['detail'][-1] != '.':
                      reference['detail'] += '.'
          else:
              if ref_key is not None:
                  warn('Using DOI to obtain reference information, rather than preferredKey.')
              reference['doi'] = elem.attrib['doi']
              reference['journal'] = ref.get('container-title')[0]
              ref_year = ref.get('published-print') or ref.get('published-online')
              reference['year'] = int(ref_year['date-parts'][0][0])
              reference['volume'] = int(ref.get('volume'))
              reference['pages'] = ref.get('page')
              reference['authors'] = []
              for author in ref['author']:
                  auth = {}
                  auth['name'] = ' '.join([author['given'], author['family']])
                  orcid = author.get('ORCID')
                  if orcid:
                      auth['ORCID'] = orcid.lstrip('http://orcid.org/')
                  reference['authors'].append(auth)
      elif ref_key is not None:
          warn('Missing doi attribute in bibliographyLink. '
               'Setting "detail" key as a fallback; please update to the appropriate fields.'
               )
          reference['detail'] = ref_key
          if reference['detail'][-1] != '.':
              reference['detail'] += '.'
      else:
          raise MissingAttributeError('preferredKey', 'bibliographyLink')
      return reference