def xml_from(record):
  #
  # Schema is at https://source.collectionspace.org/collection-space/src/services/tags/v1.9/services/collectionobject/jaxb/src/main/resources/collectionobjects_common.xsd
  #
  # updated to account for
  # http://wiki.collectionspace.org/display/collectionspace/Imports+Service+Home
  #     

  #from pprint import pprint
  #pprint(record)
  CC = ElementMaker(namespace = "http://collectionspace.org/collectionobject",
                    nsmap = {'collectionobjects_common': 
                             'http://collectionspace.org/collectionobject'})
  WAC = ElementMaker(namespace = "http://walkerart.org/collectionobject",
                     nsmap = {'collectionobjects_wac': 
                              'http://walkerart.org/collectionobject'})
  cs_schema = E.schema({'name': 'collectionobjects_common'})
  if record.has_key('acc_no'):
    cs_schema.append(CC.objectNumber(record['acc_no']))
  if record.has_key('title'):
    title_list = CC('titleGroupList')
    for title in record['title']:
      title_list.append(
        CC.titleGroup(
          CC.title(title),
          CC.titleLanguage('eng')
        )
      )
    cs_schema.append(title_list) 
  if record.has_key('date'):
    cs_schema.append(
      CC.objectProductionDateGroup(
        CC.dateDisplayDate(record['date'])
      )
    )
  if record.has_key('iaia_subject'):
    concepts = CC('contentConcepts')
    for concept in record['iaia_subject']:
      concepts.append(CC.contentConcept(concept))
    cs_schema.append(concepts)

  if record.has_key('objectWorkType'):
    work_type_list = CC('objectNameList')
    for work_type in record['objectWorkType']:
      description_list.append(
        CC.objectNameGroup(
          CC.objectName(work_type),
          CC.objectNameCurrency('current'),
          CC.objectNameType('classified'),
          CC.objectNameSystem('In-house'),
          CC.objectNameLanguage('eng')
        )
      )

  if record.has_key('description'):
    cs_schema.append(CC.physicalDescription("\n".join(record['description'])))

  if record.has_key('edition') or record.has_key('cast_no'):
    values = []
    for key in ['edition', 'cast_no']:
      if record.has_key(key):
        values += record[key]
    cs_schema.append(CC.editionNumber("\n".join(values)))

  # Actually, inscriptionContent could also include signature, workshop
  # number, signed/location, and printer's marks. Only one field to jam
  # them in.
  if record.has_key('inscription_location'):
    cs_schema.append(CC.inscriptionContent("\n".join(record['inscription_location'])))

  if record.has_key('running_time'):
    cs_schema.append(
        CC.dimensions(
          CC.dimensionList(
            CC.dimensionGroup(
              CC.value(record['running_time']),
              CC.measurementUnit('minutes'),
              CC.dimension('running-time')
              )
            )
          )
        )

  # There's probably a class of variables that we can easily handle with
  # just a fieldname mapping; let's set that up, and then let the
  # exceptions be exceptions

  #
  # WAC-specific
  #
  wac_schema = E.schema({'name': 'collectionobjects_wac'})
  if record.has_key('condition') or record.has_key('condition_date'):
    values = []
    for key in ['condition', 'condition_date']:
      if record.has_key(key):
        values += record[key]
    wac_schema.append(WAC.walkercondition("\n".join(values)))

  outer = E.imports(
    E('import',
      cs_schema,
      wac_schema,
      {'seq': '1', 'service': 'CollectionObjects', 'type': 'CollectionObject'}
    )
  )
  #print etree.tostring(outer, pretty_print=True)
  return etree.tostring(outer)