我正在使用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>
答案 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;已在当前上下文或任何父上下文中设置(如我的示例中所示)并将所有变换应用于所有目标节点。