Web.config转换定位器条件或xpath不使用多个属性

时间:2015-10-25 20:03:55

标签: asp.net xpath transform xdt-transform xdt

我正在使用Microsoft的XDT库来转换我的web.config文件,并发现Locator没有按预期工作。使用下面的示例,我希望设置两个属性并将转换器节点插入所有三个appender中,但只有属性才会更新。转换器节点仅插入第一个appender。如何将其插入所有三个log4net appender节点?

我尝试过切换到XPath,但它只会抛出错误。一个工作的例子会很好,因为我到目前为止所遵循的每个例子似乎都失败了。

测试网站:https://webconfigtransformationtester.apphb.com/

例如:

的Web.config

<?xml version="1.0"?>
<configuration>
  <log4net>
    <appender name="App1">
      <layout>
        <conversionPattern value="foo"/>
      </layout>
    </appender>
    <appender name="App2">
      <layout>
        <conversionPattern value="foo"/>
      </layout>
    </appender>
    <appender name="App3">
      <layout>
        <conversionPattern value="foo"/>
      </layout>
    </appender>
  </log4net>
</configuration>

Web.Debug.config

<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <log4net>
    <appender xdt:Locator="Condition(@name='App1' or @name='App2' or @name='App3')">
      <layout>
        <conversionPattern value="bar" xdt:Transform="SetAttributes" />
        <converter xdt:Transform="Insert">
          <name value="Default" />
          <type value="Common.DefaultConverter, Common" />
        </converter>
      </layout>
    </appender>
  </log4net>
</configuration>

结果:

<?xml version="1.0"?>
<configuration>
  <log4net>
    <appender name="App1">
      <layout>
        <conversionPattern value="bar" />
      <converter><name value="Default" /><type value="Common.DefaultConverter, Common" /></converter></layout>
    </appender>
    <appender name="App2">
      <layout>
        <conversionPattern value="bar" />
      </layout>
    </appender>
    <appender name="App3">
      <layout>
        <conversionPattern value="bar" />
      </layout>
    </appender>
  </log4net>
</configuration>

1 个答案:

答案 0 :(得分:0)

事实证明它是以这种方式设计的。仅将属性应用于所有目标节点。要解决此问题,请从here下载代码并添加以下行:

在XmlElementContext中,添加属性:

   internal bool HasLocator
    {
        get
        {
            return this.LocatorAttribute != null || (this.parentContext != null && this.parentContext.HasLocator);
        }
    }

在XmlTransform中修改此行,添加对HasLocator的调用:

if (ApplyTransformToAllTargetNodes || context.HasLocator) {

此代码将确定&#34;定位器&#34;已在当前上下文或任何父上下文中设置(如我的示例中所示)并将所有变换应用于所有目标节点。