При использовании слияния конфигурации лучше всего обрабатывать каждый уровень блока отдельно.
Прежде всего, ваш пример только пытается избежать столкновения с элементом / configuration, который есть в каждом файле web.config..
Далее вам нужно выделить каждую часть - это важно и для удаления.
В вашем примере у вас есть несколько уровней - <system.servicemodel> , <bindings>, <basicHttpBinding>
и т. Д.
То, что вам нужно сделать, это разделить их независимо друг от друга, чтобы их можно было идентифицировать по «ключу» каждого элемента (то есть имени, адреса - что бы это ни было).Это позволяет механизму слияния идентифицировать столкновение и выполнить обновление.
Следующее является лишь предположением, но должно быть полезным отправным пунктом.Это не легко понять, и документация в этой области немного скудна.Я закончил тем, что углубился в исходный код, чтобы сам разобраться в этом.
<component type="Config">
<config>
<configFile>web.config</configFile>
<install>
<configuration>
<nodes>
<node path="/configuration" targetpath="/configuration/system.serviceModel" action="update" collision="ignore">
<system.serviceModel>
<bindings>
<basicHttpBinding>
</basicHttpBinding>
</bindings>
<client>
</client>
</system.serviceModel>
</node>
<node path="/configuration/system.serviceModel/bindings/basicHttpBinding" action="update" key="name" collision="overwrite">
<binding name="xxx">
</binding>
</node>
<node path="/configuration/system.serviceModel/client" action="update" key="address" collision="overwrite">
<endpoint address="http://xxx" binding="basicHttpBinding" bindingConfiguration="xxx" contract="xxx" name="xxx" />
</node>
</nodes>
</configuration>
</install>
</config>
</component>
Edit: Атрибут targetpath должен быть написан в нижнем регистре, иначе установщик будетсоздавать дубликаты элементов.(Оригинальный ответ: targetPath)