一致する要素がターゲットに存在しない場合にのみ、変換を適用したいと思います。http://webconfigtransformationtester.apphb.com/を使用してさまざまなxpath式を試していますが、これまでのところうまくいきません。
たとえば、ターゲットの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>
つまり、名前付きの接続文字列を構成に追加したいのですが、管理者が自分の値を入力できるようにします。(存在しない場合はcs configセクションを追加する)のと同じくらい簡単だと思いましたxdt:Transform="Insert" xdt:Locator="XPath(count(/configuration/connectionStrings)=0)"
が、明らかにそうではありませんでした。