WebDeploy, parameters.xml transforms and nLog settings

I have been trying to parameterise the SQL DB connection string used by nLog when it is defined in a web.config file of a web site being deployed via Release Management and  WebDeploy i.e. I wanted to select and edit the bit highlighted of my web.config file

<configuration>
    <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <targets async="true">
      <target xsi:type="Database" name="SQL" dbProvider="System.Data.SqlClient" connectionString="Data Source=myserver;Database=mydb;Persist Security Info=True;Pooling=False" keepConnection="true" commandText="INSERT INTO [Logs](ID, TimeStamp, Message, Level, Logger, Details, Application, MachineName, Username) VALUES(newid(), getdate(), @message, @level, @logger, @exception, @application, @machineName, @username)">

        <parameter layout="${message}" name="@message"></parameter>
        …….
 

The problem I had was that the xpath query I was using was not returning the nLog node because the nLog node has a namespace defined. This means we can’t just use a query in the form

<parameter name="NLogConnectionString" description="Description for NLogConnectionString" defaultvalue="__NLogConnectionString__" tags="">
  <parameterentry kind="XmlFile" scope="\\web.config$" match="/configuration/nlog/targets/target[@name='SQL']/@connectionString" />
</parameter>

I needed to use

<parameter name="NLogConnectionString" description="Description for NLogConnectionString" defaultvalue="__NLogConnectionString__" tags="">
  <parameterentry kind="XmlFile" scope="\\web.config$" match="/configuration/*[local-name() = 'nlog']/*[local-name() = 'targets']/*[local-name() = 'target' and @name='SQL']/@connectionString" />
</parameter>

So more complex, but it does work. Hopefully this will save others the time I wasted working it out today