XDT Transform: InsertBefore - condição do localizador é ignorada

Eu tenho um arquivo web.config em que eu preciso inserir o<configSections /> elemento ou manipular filhos desse nó, se já existir.
Se já existir, não quero inseri-lo novamente (obviamente, como só é permitido existir uma vez).

Normalmente, isso não seria um problema, no entanto:

Se este elemento estiver em um arquivo de configuração, ele deverá ser o primeiro elemento filho do elemento.

Fonte: MSDN.

Então, se eu usarxdt:Transform="InsertIfMissing" a<configSections /> elemento sempre será inserido após quaisquer elementos filhos existentes (e sempre há alguns), violando a restrição acima de ter que ser o primeiro elemento filho de<configuration />

Eu tentei fazer isso funcionar da seguinte maneira:

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

Qual funciona perfeito, se o<configSections /> elemento não existe. No entanto, a condição que especifiquei parece ser ignorada.

Na verdade, eu tentei algumas condições como:

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

Finalmente, por desespero, tentei:

Condition(true() = false()) 

Ainda inseriu o<configSections /> elemento.

É importante observar que estou tentando incluir isso em um pacote NuGet, por isso não poderei usar uma transformação personalizada (como o que o AppHarbor usa).

Existe alguma outra maneira inteligente de colocar meu elemento no lugar certo apenas se ele ainda não existe?

Para testar isso, useTestador de transformação de configuração AppHarbors. Substitua o Web.config pelo seguinte:

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

E Web.Debug.config com o seguinte:

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

O resultado mostrará dois<configSections /> elementos, o que contém "mySection" é o primeiro, conforme especificado no InsertBefore Transform. Por que a Condição do Localizador não foi levada em consideração?

questionAnswers(1)

yourAnswerToTheQuestion