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.