docs: def convert_fragility_model_04(node, fname, fmcounter=itertools.count(1)):
      """
      :param node:
          an :class:`openquake.commonib.node.Node` in NRML 0.4
      :param fname:
          path of the fragility file
      :returns:
          an :class:`openquake.commonib.node.Node` in NRML 0.5
      """
      convert_type = {"lognormal": "logncdf"}
      new = Node('fragilityModel',
                 dict(assetCategory='building',
                      lossCategory='structural',
                      id='fm_%d_converted_from_NRML_04' %
                      next(fmcounter)))
      with context(fname, node):
          fmt = node['format']
          descr = ~node.description
          limit_states = ~node.limitStates
      new.append(Node('description', {}, descr))
      new.append((Node('limitStates', {}, ' '.join(limit_states))))
      for ffs in node[2:]:
          IML = ffs.IML
          # NB: noDamageLimit = None is different than zero
          nodamage = ffs.attrib.get('noDamageLimit')
          ff = Node('fragilityFunction', {'format': fmt})
          ff['id'] = ~ffs.taxonomy
          ff['shape'] = convert_type[ffs.attrib.get('type', 'lognormal')]
          if fmt == 'continuous':
              with context(fname, IML):
                  attr = dict(imt=IML['IMT'],
                              minIML=IML['minIML'],
                              maxIML=IML['maxIML'])
                  if nodamage is not None:
                      attr['noDamageLimit'] = nodamage
                  ff.append(Node('imls', attr))
              for ffc in ffs[2:]:
                  with context(fname, ffc):
                      ls = ffc['ls']
                      param = ffc.params
                  with context(fname, param):
                      m, s = param['mean'], param['stddev']
                  ff.append(Node('params', dict(ls=ls, mean=m, stddev=s)))
          else:  # discrete
              with context(fname, IML):
                  imls = ' '.join(map(str, (~IML)[1]))
                  attr = dict(imt=IML['IMT'])
              if nodamage is not None:
                  attr['noDamageLimit'] = nodamage
              ff.append(Node('imls', attr, imls))
              for ffd in ffs[2:]:
                  ls = ffd['ls']
                  with context(fname, ffd):
                      poes = ' '.join(map(str, ~ffd.poEs))
                  ff.append(Node('poes', dict(ls=ls), poes))
          new.append(ff)
      return new