ターゲットに一致する要素が存在しない場合にのみ、変換を適用したいと思います。 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>
_
言い換えれば、名前付き接続文字列を構成に追加するだけで、管理者が自分の値を入力できるようにします。 xdt:Transform="Insert" xdt:Locator="XPath(count(/configuration/connectionStrings)=0)"
(存在しない場合にcs configセクションを追加する)と同じくらい簡単だと思いましたが、明らかにそうではありません。
使用する xdt:Transform="InsertIfMissing"
VS2012のXmlTransform
タスク。これを反映するためにMicrosoftがドキュメントを更新したようには見えません。
私の場合、xdt:Locator="Match(name)"
なしでは_xdt:Transform="InsertIfMissing"
_は機能しませんでした
xdt:Transform = "InsertIfMissing"のこの代替変換を試してください。
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
<nodeToInsertIfMissing xdt:Transform="Insert" />
<nodeToInsertIfMissing xdt:Transform="Remove" xdt:Locator="XPath(/configuration/nodeToInsertIfMissing[2])" />
</configuration>
MSDNドキュメント に従って動作するはずです。
Insert-変換ファイルで定義されている要素を選択された要素の兄弟。新しい要素は、コレクションの最後に追加されます。
そのため、ノードが既に存在する場合、2番目のノードを追加してから、このノードを削除します(2番目)。そうでない場合、新しい一意のノードを追加しますが、削除操作は失敗します。
注:NuGet*。(un)install.xdt変換では機能していないようです。 InsertIfMissingも。
VS2015およびパッケージマネージャーコンソールホストバージョン3.4.4.1321での動作を確認しました(パッケージマネージャーコンソールを開くと、これを見つけることができます)。
「configuration\connectionStrings\add\@name」が存在しない場合に挿入されます。
App.config.install.xdt:
<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:xdt="http://schemas.Microsoft.com/XML-Document-Transform">
<connectionStrings xdt:Transform="InsertIfMissing">
<add name="MyCs" provider="System.Data.SqlClient" connectionString="" xdt:Transform="InsertIfMissing" xdt:Locator="Match(name)"/>
</connectionStrings>
</configuration>
.nuspecファイル:
<files>
<file src="app.config.install.xdt" target="content\app.config.install.xdt" />
使用する xdt:Transform="Remove"
に続く xdt:Transform="Insert"
変換します。 xdt:Transform="InsertIfMissing"
他の場所では機能しないと示唆されたが、バージョン固有のようだ。