XDT 转换删除错误条目

XDT transformation removes wrong entry

在 NuGet 中使用之前,我正在使用 this 网站测试我的 XDT 转换。当我有这个配置时

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
  </httpModules>
  </system.web>
</configuration>

并使用此转换:

<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web>
    <httpModules>
      <add name="ErrorLog" xdt:Transform="Remove" />      
    </httpModules>
  </system.web>
</configuration>

结果是这样的输出:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.web>
    <httpModules>

      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
    </httpModules>
  </system.web>
</configuration>

我不明白为什么条目 ApplicationInsightsWebTracking 被删除而不是 ErrorLog。在 NuGet 包中使用此转换时(删除包时),我得到了相同的结果。如何更改工作中的转换?

您还需要明确告诉 XDT 通过 name 属性进行匹配,使用 xdt:Locator="Match()",否则只会考虑元素 location/path 进行匹配(这就是为什么第一个add 元素最初被删除):

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.web>
    <httpModules>
      <add name="ErrorLog" xdt:Locator="Match(name)" xdt:Transform="Remove" />      
    </httpModules>
  </system.web>
</configuration>