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