Je voudrais appliquer une transformation si et seulement si un élément correspondant n'existe pas dans la cible. Essayer différentes expressions xpath en utilisant http://webconfigtransformationtester.apphb.com/ mais pas de chance jusqu'à présent.
Par exemple. si le fichier web.config cible ressemble à ceci:
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
</configuration>
alors la sortie devrait ressembler à ceci:
<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>
Mais si la cible ressemble à ceci:
<configuration>
<connectionStrings>
<add name="MyCs" provider="System.Data.IChangedIt" connectionString="my connection string here" />
</connectionStrings>
<system.web>
<compilation debug="true" />
</system.web>
</configuration>
alors le résultat de la transformation devrait ressembler à ceci:
<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 d'autres termes, je veux simplement ajouter la chaîne de connexion nommée à la configuration mais laisser l'administrateur la remplir avec ses propres valeurs. Je pensais que ce serait aussi simple que xdt:Transform="Insert" xdt:Locator="XPath(count(/configuration/connectionStrings)=0)"
(pour ajouter une section de configuration cs s'il n'en existait pas) mais apparemment pas.
Utilisation xdt:Transform="InsertIfMissing"
avec la tâche XmlTransform
dans VS2012. Il ne semble pas que Microsoft ait mis à jour sa documentation pour refléter cela.
Dans mon cas, xdt:Transform="InsertIfMissing"
Ne fonctionnait pas sans xdt:Locator="Match(name)"
Essayez cette transformation alternative pour 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>
Cela devrait fonctionner après documentation MSDN :
Insérer ajoute l'élément défini dans le fichier de transformation en tant que frère à l'élément sélectionné ou des éléments. Le nouvel élément est ajouté à la fin de toute collection.
Donc, si le nœud existe déjà, nous ajoutons le deuxième puis supprimons ce nœud (2e). Sinon, nous ajoutons le nouveau nœud unique mais l'opération de suppression échouera.
Remarque: Il semble ne pas fonctionner avec la transformation NuGet *. (Un) install.xdt. InsertIfMissing aussi.
Fonctionnement confirmé dans VS2015 et la version 3.4.4.1321 de l'hôte de la console du gestionnaire de packages (vous pouvez le trouver lorsque vous ouvrez la console du gestionnaire de packages).
Ceci sera inséré si 'configuration\connectionStrings\add\@name' n'existe pas.
Le fichier 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>
Le fichier .nuspec:
<files>
<file src="app.config.install.xdt" target="content\app.config.install.xdt" />
Utilisation xdt:Transform="Remove"
suivi par xdt:Transform="Insert"
se transforme. Le xdt:Transform="InsertIfMissing"
suggéré ailleurs ne fonctionnait pas pour moi, ressemble à sa version spécifique.