【问题标题】:How to replace attributes in XML transforms without the name attribute如何在没有名称属性的情况下替换 XML 转换中的属性
【发布时间】:2013-11-24 19:20:00
【问题描述】:

我在发布时使用 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>

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

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

【问题讨论】:

    标签: asp.net log4net configuration-files slowcheetah


    【解决方案1】:

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

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

    【讨论】:

    • 我想重申 The attribute is case sensitive. 的评论虽然 MSDN 链接中没有任何具体内容,但如果键/属性名称和值之间的大小写不同,Match() 将无法正常工作.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    相关资源
    最近更新 更多