52

一致する要素がターゲットに存在しない場合にのみ、変換を適用したいと思います。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)"が、明らかにそうではありませんでした。

4

5 に答える 5

65

VS2012xdt:Transform="InsertIfMissing"のタスクで使用します。XmlTransformMicrosoftがこれを反映するようにドキュメントを更新したようには見えません。

于 2013-05-21T20:49:28.913 に答える
44

私の場合、xdt:Transform="InsertIfMissing"なしでは機能しませんでしたxdt:Locator="Match(name)"

于 2014-11-13T02:10:04.783 に答える
12

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ドキュメントに従って機能するはずです。

挿入-変換ファイルで兄弟として定義されている要素を、選択した1つまたは複数の要素に追加します。新しい要素は、コレクションの最後に追加されます。

したがって、ノードがすでに存在する場合は、2番目のノードを追加してから、このノードを削除します(2番目)。それ以外の場合は、新しい一意のノードを追加しますが、削除操作は失敗します。

注:NuGet *。(un)install.xdt変換では機能しないようです。InsertIfMissingも。

于 2015-02-11T21:31:52.303 に答える
5

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>

.nu​​specファイル:

<files>
    <file src="app.config.install.xdt" target="content\app.config.install.xdt" />
于 2016-06-24T01:45:54.433 に答える
4

xdt:Transform="Remove"続いてxdt:Transform="Insert"変換を使用します。他のxdt:Transform="InsertIfMissing"場所で提案されたものは私にはうまくいきませんでした、そのバージョン固有のように見えます。

于 2013-11-07T05:59:47.717 に答える