Я хотел бы применить преобразование тогда и только тогда, когда совпадающий элемент не существует в целевом объекте. Попробуйте различные выражения xpath с помощью http://webconfigtransformationtester.apphb.com/, но пока не повезло.
например. если целевой web.config выглядит следующим образом:
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
</configuration>
тогда вывод должен выглядеть следующим образом:
<configuration>
<connectionStrings>
<add name="MyCs" provider="System.Data.SqlClient" connectionString="" />
<add name="SomeOtherCs" provider="System.Data.SqlClient" connectionString="" />
</connectionStrings>
<system.web>
<compilation debug="true" />
</system.web>
</configuration>
Но если цель выглядит так:
<configuration>
<connectionStrings>
<add name="MyCs" provider="System.Data.IChangedIt" connectionString="my connection string here" />
</connectionStrings>
<system.web>
<compilation debug="true" />
</system.web>
</configuration>
то результат преобразования должен выглядеть следующим образом:
<configuration>
<connectionStrings>
<add name="MyCs" provider="System.Data.IChangedIt" connectionString="my connection string here" />
<add name="SomeOtherCs" provider="System.Data.SqlClient" connectionString="" />
</connectionStrings>
<system.web>
<compilation debug="true" />
</system.web>
</configuration>
Другими словами, я просто хочу добавить иную строку соединения в конфигурацию, но пусть администратор заполнит ее своими собственными значениями. Я думал, что это будет так же просто, как xdt:Transform="Insert" xdt:Locator="XPath(count(/configuration/connectionStrings)=0)"
(добавить раздел конфигурации cs, если он не существует), но, по-видимому, нет.