def sibling_id(elem, well_prefix, sink_prefix, make_id):
    """
    - Lies die ID des Quellelements <elem> aus (i.d.R. noch nicht vorhanden)
      und ergänze diese nötigenfalls, unter Verwendung des Präfixes
      <well_prefix>
    - Erzeuge eine entsprechende ID (mit möglichst derselben Nummer,
      aber einem anderen Präfix); dies ist der Rückgabewert

    >>> class E:
    ...     def __init__(self, id=None):
    ...         self.attrs = {}
    ...         if id: self.attrs['id'] = id
    >>> make_id = id_factory()
    >>> e1 = E()
    >>> sibling_id(e1, 'prim', 'sec', make_id)
    'sec-1'
    >>> e1.attrs['id']
    'prim-1'

    Wenn das Element <elem> schon eine ID hat, wird diese erhalten:
    >>> e2 = E('honk')
    >>> sibling_id(e2, 'prim', 'sec', make_id)
    'sec-2'
    >>> e2.attrs['id']
    'honk'
    """
    well_id = elem.attrs.get('id')
    if not well_id:
        well_id = make_id(well_prefix)
        elem.attrs['id'] = well_id
    sink_id = None
    try:
        liz = well_id.split('-')
        if liz[1:]:
            int(liz[-1])
            sink_id = '-'.join([sink_prefix] + liz[1:])
    except ValueError:
        pass
    return make_id(sink_prefix, sink_id)
