【问题标题】:web.config xpath transform - find by parent elementweb.config xpath 转换 - 按父元素查找
【发布时间】:2014-03-14 23:38:27
【问题描述】:

我正在尝试在部署后更改日志文件名,因此请转换:

<log4net>
    ...
    <appender name="GeneralAppender" type="log4net.Appender.RollingFileAppender, log4net">
        <file value="c:\logs\Co.App.log" />
    ...
    </appender>
</log4net>

到这里:

<log4net>
    ...
    <appender name="GeneralAppender" type="log4net.Appender.RollingFileAppender, log4net">
        <file value="c:\logs\Co.App.localhost.log" />
    ...
    </appender>
</log4net>

实际的文件节点没有任何属性,所以我试图通过父节点来定位它

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <log4net>
        <appender >
          <file value="c:\logs\Co.App.localhost.log" xdt:Transform="Replace" xdt:Locator="XPath(../appender[@name='GeneralAppender'])" />
        </appender>
      </log4net>
    </assemblyBinding>
  </runtime>

我还尝试了绝对和相对 xpath 的所有排列,但我认为它在转换预览中没有任何影响。

我试过了:

xdt:Locator="XPath(//appender[@name='GeneralAppender']/file)"

甚至:

xdt:Transform="删除" xdt:Locator="XPath(//file)"

【问题讨论】:

    标签: asp.net-mvc visual-studio-2012 deployment visual-studio-2013


    【解决方案1】:

    找到了!

    <file value="c:\logs\Co.App.local.log" xdt:Transform="Replace" xdt:Locator="Condition(../@name='GeneralAppender')" />
    

    【讨论】:

    • 太棒了!这解决了我的转换问题,即在我打算更改的唯一行之前更改了更多行。
    【解决方案2】:

    轻微延长:

    如果父节点有两个(或更多的子节点),那么上面的解决方案是不够的。

    log4net中就是这样,当使用EventLogAppend时,有:

      <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
        ...
        <param name="LogName" value="MyLog"/>
        <param name="ApplicationName" value="MyApplication"/>
        ...
    

    然后你需要使用一个'and'+一个属性来点击正确的节点:, 像 xdt:Locator="Condition(../@name='EventLogAppender' and @name='LogName')

    EventLogAppender 的示例,其中两个参数都被替换:

    <param name="LogName" value="MyNewLog" xdt:Transform="Replace" xdt:Locator="Condition(../@name='EventLogAppender' and @name='LogName')" />
    <param name="ApplicationName" value="MyNewApplication" xdt:Transform="Replace" xdt:Locator="Condition(../@name='EventLogAppender' and @name='ApplicationName')" />
    

    【讨论】:

    • 这对我有帮助。我必须将 Octopus 令牌添加到转换后的发布 Web.config。我有 2 个端点节点。我做了以下&lt;endpoint address="#{endpoint:sitecoreaddress}" xdt:Transform="SetAttributes(address)" xdt:Locator="Condition(@bindingConfiguration='SCContentSoap')" /&gt; &lt;endpoint address="#{endpoint:auditaddress}" xdt:Transform="SetAttributes(address)" xdt:Locator="Condition(@bindingConfiguration='AuditLogBinding')" /&gt;
    【解决方案3】:

    MSDN documentation 提到,如果您使用 XPath,那么它将附加您传递到转换文件中当前上下文的表达式。因此,XPath 适用于您想要修改当前元素或其前身之一的情况。

    如果您想以相对方式遍历父项,则没有 XPath 表达式可以做到这一点。 XPath 从父对象开始,允许您遍历后代而不是祖先。这就是条件起作用的时候。

    我尝试使用 xdt:Locator="XPath(.)" 并且它完美地替换了当前元素,如果需要它是后代。但它不适用于长辈。

    【讨论】:

      猜你喜欢
      • 2018-07-09
      • 2012-03-24
      • 1970-01-01
      • 2020-04-25
      • 2018-01-25
      • 2011-07-07
      • 2019-05-08
      • 1970-01-01
      • 2011-05-26
      相关资源
      最近更新 更多