14
votes

I have web.config transforms for several environments. In the config file I have an applicationSettings section with several setting and value pairs.

I have tried based on the syntax I use to match name and change the connection strings to also match settings and change the value but the transforms are failing. Is this at all possible?

So my web.config has:

<applicationSettings>
    <AppName.My.MySettings>
        <setting name="setting1" serializeAs="String">
            <value>Initial Value</value>
        </setting>
    </AppName.My.MySettings>
</applicationSettings>

My transform file has

<applicationSettings>
    <add name="setting1" value="Changed Value" xdt:Transform="SetAttributes" xdt:Location="Match(name)"/>
</applicationSettings>

I get no errors when I preview the transform but whereas the connection string setting are transformed the value for setting1 is not. Any help appreciated.

UPDATE

<applicationSettings>
    <add name="setting1" value="Changed Value" xdt:Transform="Replace" xdt:Location="Match(name)"/>
</applicationSettings>

Unfortunately same problem... No errors and no transform.

SOLUTION I did forget to mention I have more than one setting so marked answer is partial solution... This is how I did it... Web.Config...

<applicationSettings>
    <AppName.My.MySettings>
        <setting name="setting1" serializeAs="String">
            <value>Initial Value 1</value>
        </setting>
        <setting name="setting2" serializeAs="String">
            <value>Initial Value 2</value>
        </setting>
        <setting name="setting3" serializeAs="String">
            <value>Initial Value 3</value>
        </setting>
    </AppName.My.MySettings>
</applicationSettings>

Transform File

<applicationSettings xdt:Transform="Replace">
    <AppName.My.MySettings>
        <setting name="setting1" serializeAs="String">
            <value>CHANGED VALUE 1</value>
        </setting>
        <setting name="setting2" serializeAs="String">
            <value>Initial value 2</value>
        </setting>
        <setting name="setting3" serializeAs="String">
            <value>CHANGED VALUE 3</value>
        </setting>
    </AppName.My.MySettings>
</applicationSettings>

Note I had to include all my nested settings and values even if some of them didn't change as in the case of setting 2 in my example.

5
value is a node not an attribute, and you have to use Transform="Replace" - Thorarins
@Andreas ... please see my update.. still no joy. - Mych

5 Answers

29
votes

I know this is a little late, but the following transform file will allow you transform just one setting when you have multiple.

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <applicationSettings>
    <YourProject.Settings>
      <setting name="Log4NetPath" serializeAs="String" xdt:Transform="Replace" xdt:Locator="Match(name)">
        <value xdt:Transform="Replace">NewPath</value>
      </setting>
    </YourProject.Settings>
  </applicationSettings>
</configuration>
10
votes

Transform file:

<applicationSettings>
   <AppName.My.MySettings>
      <setting xdt:Transform="Replace" xdt:Locator="Match(name)" name="setting1" serializeAs="String">
           <value>New Value</value>
       </setting>
    </AppName.My.MySettings>
  </applicationSettings>

0
votes

https://hk.saowen.com/a/7857cf5ec8f14af8504e7b9bb029e4cb0047336394e464a9b3807a9e1e587b93

Using Transform and Locator Attributes on Separate Elements

A Transform attribute does not have to be set in the same element as a Locator element. You can specify a Locator element on a parent element in order to select elements whose child elements you want to work with. You can then specify a Transform attribute in a child element in order to apply a change to the children.

The following example shows how to use the Locator attribute to select location elements for the specified path. However, only elements that are children of the selected location elements are transformed.

<configuration xmlns:xdt="...">
  <location path="C:\MySite\Admin" xdt:Locator="Match(path)"> 
    <system.web>
      <pages viewStateEncryptionMode="Always"
        xdt:Transform="SetAttributes(viewStateEncryptionMode)" />
    </system.web> 
  </location> 
</configuration>

If you specify a Locator attribute but you do not specify a Transform attribute in the same element or in a child element, no changes are made.

0
votes

Agree with above answers. You need to determine if you replacing(transforming) a node or an attribute.

A node is value here: <value>Datasource=connection info</value>

An attribute is name here: <value name="connection info"/>

To replace a node, you use:

<value xdt:Transform="Replace">
Datasource="connection info";
</value>    

To replace an attribute:

<value name="other connection info"
   xdt:Transform="SetAttributes"
   xdt:Locator="Match(name)"/>

More detailed reference for replacing attributes: https://docs.microsoft.com/en-us/previous-versions/dd465326(v=vs.100)?redirectedfrom=MSDN

-4
votes

original file:

<applicationSettings>
    <AppName.My.MySettings>
        <setting name="setting1" serializeAs="String">
            <value>Initial Value</value>
        </setting>
    </AppName.My.MySettings>
</applicationSettings>

Transform file:

 <applicationSettings>
   <AppName.My.MySettings>
      <setting name="setting1" serializeAs="String">
           <value xdt:Transform="Replace">Changed Value</value>
       </setting>
    </AppName.My.MySettings>
  </applicationSettings>