>Сначала собрать хэш, потом разобрать хэш в xml, как тут в один проход?
Да нет, просто использовать по ходу дела текущее наполнение хеша. На момент обработки ряда про него все известно (из информации ряда и заполненных ранее rowspan предыдущих рядов).