You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用XSLT向XML的<targets>列表添加子元素失败求助

解决XSLT无法向NLog XML的<targets>节点追加元素的问题

看起来你遇到的问题是XSLT模板没有正确命中目标节点,导致只有恒等变换生效,新的<target>元素没被添加。让我帮你分析下问题并给出修正方案:

问题根源

你的XSLT存在两个关键问题:

  • 命名空间匹配错误:源XML中所有节点(包括<targets>)都属于http://www.nlog-project.org/schemas/NLog.xsd命名空间,但你的模板匹配路径/t:nlog/targets没有给<targets>加上命名空间前缀t:,导致模板根本没命中目标节点,最终只有默认的恒等模板在执行。
  • 原有节点丢失风险:即使匹配成功,你的模板只复制了<targets>的属性,直接添加新节点,会丢掉原来的<target xsi:type="Null" name="blackhole" />节点。

修正后的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:t="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <!-- 恒等模板:复制所有未被自定义模板匹配的节点和属性 -->
  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <!-- 正确匹配命名空间下的<targets>节点 -->
  <xsl:template match="/t:nlog/t:targets">
    <xsl:copy>
      <!-- 复制<targets>的所有属性 -->
      <xsl:copy-of select="@*" />
      <!-- 保留原有的<target>子节点 -->
      <xsl:apply-templates select="node()" />
      <!-- 添加新的<target>元素,确保使用正确的命名空间 -->
      <t:target xsi:type="File" name="general"/>
    </xsl:copy>
  </xsl:template>
</xsl:stylesheet>

关键修正说明

  • 修正匹配路径:将/t:nlog/targets改为/t:nlog/t:targets,确保命中属于t命名空间的<targets>节点。
  • 保留原有节点:通过<xsl:apply-templates select="node()" />让恒等模板处理原有的<target>子节点,避免丢失。
  • 命名空间一致性:新添加的<target>使用t:前缀,保证它和原XML节点属于同一个命名空间,避免出现无命名空间的节点。

转换后结果

执行修正后的XSLT后,你会得到包含新<target>的XML:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" autoReload="true" internalLogLevel="Error" internalLogFile="internal-nlog.txt">
  <targets async="true">
    <target xsi:type="Null" name="blackhole" />
    <target xsi:type="File" name="general"/>
  </targets>
  <rules>
    <logger name="*" minlevel="Error" writeTo="exceptions"/>
    <logger name="Microsoft.AspNetCore.*" minlevel="Trace" writeTo="blackhole" final="true"/>
  </rules>
</nlog>

内容的提问来源于stack exchange,提问作者kovac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:27:56