Как читать путь#

X4 использует ограниченный язык селекторов, а не весь XPath. Сверяйтесь с libraries/diff.xsd своей игры. Работа в XPath-редакторе сама по себе не доказывает допустимость селектора в X4.

Запись Значение
/items/item Дочерние item корневого items
[@id='a'] Отбор по атрибуту
/@enabled Сам атрибут
//item[@id='a'] Поиск на любой глубине; проверьте уникальность

Исходный учебный документ#

Это вымышленные данные, не файл X4:

XML
<items>
  <item id="a" enabled="false" />
  <item id="b" />
</items>

Самостоятельный патч:

XML
<diff>
  <replace sel="/items/item[@id='a']/@enabled">true</replace>
  <add sel="/items/item[@id='a']" type="@label">demo</add>
  <remove sel="/items/item[@id='b']" />
  <add sel="/items">
    <item id="c" />
  </add>
</diff>

Ожидаемый результат#

XML
<items>
  <item id="a" enabled="true" label="demo" />
  <item id="c" />
</items>

replace меняет существующий атрибут; add type="@label" добавляет новый; remove удаляет b. Последний add вставляет c внутрь items. Это ожидаемое преобразование, не вывод журнала и не выполненный игровой тест.

Частые ошибки#

Проверяйте одно совпадение для каждой операции. replace всего элемента удалит прежние дочерние узлы вместе с ним. Для новой пары атрибут/значение у add выбирайте элемент через sel, а имя атрибута через type.

Не рассчитывайте на contains(), объединение | или произвольные выражения из полного XPath. Отсутствие совпадения сначала исследуйте; silent подавляет сообщение, но не исправляет путь. Дальше: реальный патч корабля, совместимость.