如何在没有name属性的情况下替换XML转换中的属性

时间:2013-11-12 15:04:12

标签: asp.net log4net configuration-files slowcheetah

我在发布时使用SlowCheetah转换我的Log4Net文件。但是,它似乎无法区分不同appender部分中的属性。

我的Log4Net.config看起来基本上是这样的:

<?xml version="1.0" encoding="utf-8" ?>

<log4net>
  <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
    <to value="DevEmail" />
    <from value="DevEmail" />
    <subject value="Dev Warning" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="Time: %date%newlineHost: %property{log4net:HostName}%newlineClass: %logger%newlineUser: %property{user}%newlineMessage: %message%newline%newline%newline" />
    </layout>
    <threshold value="WARN" />
  </appender>

  <appender name="FatalSmtpAppender" type="log4net.Appender.SmtpAppender">
    <to value="DevEmail" />
    <from value="DevEmail" />
    <subject value="Dev Fatal" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="Time: %date%newlineHost: %property{log4net:HostName}%newlineClass: %logger%newlineUser: %property{user}%newlineMessage: %message%newline%newline%newline" />
    </layout>
    <threshold value="FATAL" />
  </appender>    
</log4net>

我的转换文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>

<log4net xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
    <to value="ProductionEmail" xdt:Transform="SetAttributes" />
    <from value="ProductionEmail" xdt:Transform="SetAttributes" />
    <subject value="Production Warning" xdt:Transform="SetAttributes" />
  </appender>

  <appender name="FatalSmtpAppender" type="log4net.Appender.SmtpAppender">
    <to value="ProductionEmail" xdt:Transform="SetAttributes" />
    <from value="ProductionEmail" xdt:Transform="SetAttributes" />
    <subject value="Production Fatal" xdt:Transform="SetAttributes" />
  </appender>
</log4net>

问题是转换后的配置对两个appender都有相同的subject属性值;我猜当它遇到SetAttributes时,它无法分辨出它正在寻找哪个标签,因此它会转换所有标签。告诉它只找到同一个appender中的元素的正确语法是什么?我假设我需要使用xdt:Locator属性,但我不能像我为web.config那样做Match(name),因为这些元素没有name属性。 appender元素有一个name属性,但我不知道如何根据父元素的名称告诉它匹配。

我知道我可以在appender节点上使用匹配(Name),但后来我将替换整个节点,包括一堆元素,例如我不想转换的布局(因此有多个相同代码的复制粘贴,我想避免使用)。

1 个答案:

答案 0 :(得分:2)

我在这篇MSDN文章中找到了答案:http://msdn.microsoft.com/en-us/library/dd465326.aspx

我需要在父xdt:Locator="Match(name)"节点上使用<appender>,然后在子节点上使用xdt:Transform。我之前尝试过此操作,但使用了xdt:locator="Match(name)"而不是xdt:Locator="Match(name)" ...该属性区分大小写。