xpath web-config web-config-transform

xpath - Transformaciones de configuración web: Insertar si no existe



web-config web-config-transform (5)

Me gustaría aplicar una transformación si y solo si un elemento coincidente no existe en el destino. Probando varias expresiones xpath usando http://webconfigtransformationtester.apphb.com/ pero sin suerte hasta el momento.

Por ejemplo, si el objetivo web.config es similar a este:

<configuration> <system.web> <compilation debug="true" /> </system.web> </configuration>

entonces la salida debería verse así:

<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>

Pero si el objetivo se ve así:

<configuration> <connectionStrings> <add name="MyCs" provider="System.Data.IChangedIt" connectionString="my connection string here" /> </connectionStrings> <system.web> <compilation debug="true" /> </system.web> </configuration>

entonces el resultado de la transformación debería verse así:

<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>

En otras palabras, solo quiero agregar la cadena de conexión con nombre a la configuración, pero que el administrador la complete con sus propios valores. Pensé que sería tan simple como xdt:Transform="Insert" xdt:Locator="XPath(count(/configuration/connectionStrings)=0)" (para agregar una sección de configuración de cs si no existía) pero aparentemente no.


En mi caso xdt:Transform="InsertIfMissing" no funcionó sin xdt:Locator="Match(name)"


Pruebe esta transformación alternativa para 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>

Debería funcionar siguiendo la documentación de MSDN :

Insertar : agrega el elemento que está definido en el archivo de transformación como un hermano al elemento o elementos seleccionados. El nuevo elemento se agrega al final de cualquier colección.

Entonces, si el nodo ya existe, agregamos el segundo y luego eliminamos este nodo (2nd). De lo contrario, agregamos el nuevo nodo único pero la operación de eliminación fallará.

Nota: Parece que no funciona con la transformación NuGet *. (Un) install.xdt . InsertIfMissing también.


Se confirmó que funcionaba en VS2015 y la versión de host de la consola de Package Manager 3.4.4.1321 (puede encontrar esto cuando abra la consola de Package Manager).

Esto se insertará si ''configuration / connectionStrings / add / @name'' no existe.

La aplicación.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>

El archivo .nuspec:

<files> <file src="app.config.install.xdt" target="content/app.config.install.xdt" />


Use xdt:Transform="InsertIfMissing" con la tarea XmlTransform en VS2012. No parece que Microsoft haya actualizado su documentación para reflejar esto todavía.


Use xdt:Transform="Remove" seguido de xdt:Transform="Insert" transformaciones. El xdt:Transform="InsertIfMissing" sugerido en otro lugar no funcionó, parece su versión específica.