XDT-Transformation: InsertBefore - Locator-Bedingung wird ignoriert

Ich habe eine web.config-Datei, in die ich entweder die einfügen muss<configSections /> Element oder manipulieren Kinder dieses Knotens, wenn es bereits existiert.
Wenn es bereits existiert, möchte ich es nicht erneut einfügen (offensichtlich, da es nur einmal existieren darf).

Normalerweise wäre das jedoch kein Problem:

Befindet sich dieses Element in einer Konfigurationsdatei, muss es das erste untergeordnete Element des Elements sein.

Quelle: MSDN.

Also wenn ich benutzexdt:Transform="InsertIfMissing" das<configSections /> element wird immer nach allen vorhandenen untergeordneten Elementen eingefügt (und es gibt immer einige), was gegen die obige Einschränkung verstößt, dass es das erste untergeordnete Element von sein muss<configuration />

Ich habe versucht, diese Arbeit auf folgende Weise zu machen:

 <configSections
    xdt:Transform="InsertBefore(/configuration/*[1])"
    xdt:Locator="Condition(not(.))" />

Welches funktioniert perfekt, wenn das<configSections /> Element existiert noch nicht. Die von mir angegebene Bedingung scheint jedoch ignoriert zu werden.

In der Tat habe ich ein paar Bedingungen ausprobiert wie:

Condition(not(/configuration[configSections]))
Condition(/configuration[configSections] = false())
Condition(not(/configuration/configSections))
Condition(/configuration/configSections = false())

Schließlich versuchte ich aus Verzweiflung:

Condition(true() = false()) 

Es steckte noch die<configSections /> Element.

Es ist wichtig zu beachten, dass ich versuche, dies in ein NuGet-Paket aufzunehmen, damit ich keine benutzerdefinierte Transformation verwenden kann (wie die, die AppHarbor verwendet).

Gibt es eine andere clevere Möglichkeit, mein Element nur dann an den richtigen Ort zu bringen, wenn es noch nicht existiert?

Um dies zu testen, verwenden SieAppHarbors config transform tester. Ersetzen Sie die Datei Web.config durch Folgendes:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="initialSection" />
  </configSections>
</configuration>

Und Web.Debug.config mit den folgenden:

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

  <configSections
    xdt:Transform="InsertBefore(/configuration/*[1])"
    xdt:Locator="Condition(true() = false())" />

  <configSections>
    <section name="mySection" xdt:Transform="Insert" />
  </configSections>

</configuration>

Das Ergebnis zeigt zwei<configSections /> Elemente, wobei das Element mit "mySection" das erste ist, wie in der InsertBefore-Transformation angegeben. Warum wurde die Locator-Bedingung nicht berücksichtigt?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage