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>

换句话说,我只是想将命名的连接字符串添加到配置中,但让管理员用他自己的值填充它。我认为这很简单xdt:Transform="Insert" xdt:Locator="XPath(count(/configuration/connectionStrings)=0)"(如果不存在,则添加一个 cs 配置部分)但显然不是。

4

5 回答 5

65

与VS2012 中xdt:Transform="InsertIfMissing"的任务一起使用。XmlTransform微软似乎还没有更新他们的文档来反映这一点。

于 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 文档

插入- 将转换文件中定义的元素添加为选定元素的同级元素。新元素将添加到任何集合的末尾

所以,如果节点已经存在,我们添加第二个,然后删除这个节点(第二个)。否则,我们添加新的唯一节点,但删除操作将失败。

注意:它似乎不适用于 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 回答