我有一个 web.config 文件,如果它已经存在,我需要在其中插入<configSections />
元素或操作该节点的子节点。
如果它已经存在,我不想再次插入它(显然,因为它只允许存在一次)。
通常,这不会是一个问题,但是:
如果此元素在配置文件中,则它必须是该元素的第一个子元素。
因此,如果我使用xdt:Transform="InsertIfMissing"
该<configSections />
元素将始终插入在任何现有子元素之后(并且总是有一些),违反了它必须是的第一个子元素的上述限制<configuration />
我试图通过以下方式完成这项工作:
<configSections
xdt:Transform="InsertBefore(/configuration/*[1])"
xdt:Locator="Condition(not(.))" />
如果该<configSections />
元素尚不存在,则效果很好。但是,我指定的条件似乎被忽略了。
事实上,我已经尝试了一些条件,例如:
Condition(not(/configuration[configSections]))
Condition(/configuration[configSections] = false())
Condition(not(/configuration/configSections))
Condition(/configuration/configSections = false())
最后,出于绝望,我尝试了:
Condition(true() = false())
它仍然插入了<configSections />
元素。
需要注意的是,我正在尝试将其包含在 NuGet 包中,因此我将无法使用自定义转换(如 AppHarbor 使用的转换)。
只有当它还不存在时,是否有任何其他聪明的方法可以将我的元素放在正确的位置?
要对此进行测试,请使用AppHarbors config transform tester。将 Web.config 替换为以下内容:
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="initialSection" />
</configSections>
</configuration>
和 Web.Debug.config 具有以下内容:
<?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>
结果将显示两个<configSections />
元素,一个包含“mySection”的元素是第一个元素,如 InsertBefore 变换中指定的那样。为什么没有考虑定位条件?