仅当 app.debug.config 中的标志为真时才转换 app.config 条目

Transform app.config entries only if a flag in app.debug.config is true

我想在 Debug 配置中执行 xdt:Transform 但前提是 app.debug.config 中的条目值是特定值,比方说 true保持简单。例如:

App.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <appSettings> 
    <add key="Value.First" value="foo" />
    <add key="Value.Second" value="foo" />
    <add key="Value.Third" value="foo" />
  </appSettings>
</configuration>

App.Debug.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <appSettings>
    <!--Convenient flag to indicate if transform should happen-->
    <add key="Perform.Transform.If.True" value="true" xdt:Transform="Insert" />

    <!--Should only happen if the above is true-->
    <add key="Value.First" value="bar" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
    <add key="Value.Second" value="bar" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
    <add key="Value.Third" value="bar" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
  </appSettings>
</configuration>

我希望仅当键 Perform.Transform.If.True 设置为 true 时才转换 app.config 中的所有 Value.* 条目。如果是 false 则什么都不会发生。原因是有时在测试期间我们想快速打开和关闭由配置文件控制的东西。

我已经看到 Locator 的选项用于 Match、Conditional、XPath 等,但是 none 似乎允许 condition 来自另一个条目。可以用 slowcheetah/xdt 转换来完成吗?

好吧,使用 XPath 找到了一个迂回的方式:

 <add
    key="Value.First" 
    value="bar" 
    xdt:Transform="Replace"
    xdt:Locator="XPath(//appSettings/add[@key='Perform.Transform.If.True' and translate(@value, 'ERTU', 'ertu')='true']/../add[@key='Value.First'])" 
/>

如果标志不是true,它将无法解析路径。 translate 使其不区分大小写。

解析失败(false)会导致编译警告,这很烦人,但由于这是一个调试工具,我们可以接受。