Предпочитаю String.replace вместо String.format.
При генерации длинных строк с 300+ параметров в случае String.format запихает 300 параметров в стек * один вызов "format" метода.
String.replace поместит 2 параметра в стек * 300 вызовов.
String.format может вызвать stack overflow. Легко ошибиться и перепутать последовательность параметров и их количество это так же приведёт к ошибкам.
Написал бы так: '//div/app-tree-view/ul/li[
@class="treenode"]/div[@id = {node_id}]//following-sibling::div//i[1]'.replace('{node_id}', node_id)