Przekształcenie XDT: InsertBefore - warunek lokalizatora jest ignorowany

Mam plik web.config, w którym muszę wstawić<configSections /> element lub manipuluj dziećmi tego węzła, jeśli już istnieje.
Jeśli już istnieje, nie chcę go wstawiać ponownie (oczywiście, ponieważ może istnieć tylko raz).

Zwykle nie byłoby to problemem:

Jeśli ten element znajduje się w pliku konfiguracyjnym, musi być pierwszym elementem podrzędnym elementu.

Źródło: MSDN.

Więc jeśli użyjęxdt:Transform="InsertIfMissing" <configSections /> element zawsze będzie wstawiany po istniejących elementach potomnych (i zawsze są jakieś), naruszając powyższe ograniczenie, które musi być pierwszym elementem podrzędnym<configuration />

Próbowałem to zrobić w następujący sposób:

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

Co działa doskonale, jeśli<configSections /> element już nie istnieje. Jednak warunek, który określiłem, wydaje się być ignorowany.

W rzeczywistości wypróbowałem kilka warunków, takich jak:

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

W końcu z desperacji próbowałem:

Condition(true() = false()) 

Nadal wstawił<configSections /> element.

Ważne jest, aby pamiętać, że próbuję dołączyć to do pakietu NuGet, więc nie będę mógł użyć niestandardowej transformacji (jak ten, którego używa AppHarbor).

Czy jest jakiś inny sprytny sposób, aby mój element znalazł się we właściwym miejscu, tylko jeśli jeszcze nie istnieje?

Aby to sprawdzić, użyjTester konfiguracji AppHarbors. Zastąp Web.config następującymi elementami:

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

I Web.Debug.config z następującymi elementami:

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

Wynik pokaże dwa<configSections /> elementy, z których pierwszy zawiera „mySection”, jak określono w transformacji InsertBefore. Dlaczego warunek lokalizatora nie był brany pod uwagę?

questionAnswers(1)

yourAnswerToTheQuestion