Кажется я придумал решение. Тестировал на списках с разной иерархией и вкладывал списки в разные блоки на разную глубину в DOM. Проблем замечено не было. Вот код CSS:
ol{
list-style: none;
counter-reset: num;
}
ol li:before{
content: counter(num) ' ';
counter-increment: num;
}
ol ol{
counter-reset: num2;
}
ol ol li:before{
content: counter(num) '.' counters(num2,'.') ' ';
counter-increment: num2;
}
Я завёл два разных счётчика. Один - для корневых списков, а второй - для вложенных подсписков. В принципе по коду должно быть понятно.