Вы же не планировали запихнуть всё это в код? Где-то же надо хранить эти значения. Или в шаблоне, или в какой-то базе.Это я к пример у написал соответствие двух строк. В действительности может быть отношение один ко многим. Блоков может быть 50-60 тысяч.
Если XSLT не устраивает, то я думаю, надо иметь таблицу-справочник в РСУБД с соответствием значений r1/r3. Загружать в какую-то временную (in memory?) таблицу исходный XML файл, попутно дополняя недостающие поля значениями из справочника. Потом выгружаем всё это в новый XML файл. Вот как-то так...