在向XML文件添加元素时停止包含xmlns属性的XSLT

在向XML文件添加元素时停止包含xmlns属性的XSLT,xslt,web-config,elmah,Xslt,Web Config,Elmah,背景:我正在尝试编写Elmah的配置脚本,以便在生产中运行脚本,复制二进制文件并相应地编辑web.config文件 我决定使用XSLT对web.config文件进行修改。首先,我想在configSections元素中添加一个sectionGroup,如下所示 <sectionGroup name="elmah"> <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilter

背景:我正在尝试编写Elmah的配置脚本,以便在生产中运行脚本,复制二进制文件并相应地编辑web.config文件

我决定使用XSLT对web.config文件进行修改。首先,我想在
configSections
元素中添加一个
sectionGroup
,如下所示

  <sectionGroup name="elmah">
    <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
    ....
  </sectionGroup>
请注意
xmlns
属性。此属性的存在确实会扰乱ASP.Net(即使它是完全有效的XML—尽管是多余的),所有请求都会导致HTTP 500错误(错误消息请参见下面的部分)。我能从中得到的唯一错误消息

删除xmlns属性可以修复此问题

我可以使用
xsl:element
生成新的XML,但这会导致xsl非常冗长且难以阅读

因此,我的问题是如何告诉XSLT而不是在生成的XML中添加xmls属性

提前谢谢


错误消息

以下是ASP/IIS给我们的错误消息:-

  • 当配置文件的根元素(或任何其他元素)具有前缀定义
    xmlns:con=”时http://schemas.microsoft.com/.NetConfiguration/v2.0“
    ,我在YSOD中得到以下信息

    配置错误

    描述:处理服务此请求所需的配置文件时出错。请查看下面的特定错误详细信息,并适当修改配置文件

    分析器错误消息:无法识别的属性“xmlns:con”。请注意,属性名称区分大小写

  • 当任何其他元素具有“xmlns”属性时,我在YSOD中得到以下消息

    分析器错误消息:无法识别的属性“xmlns”。请注意,属性名称区分大小写

  • 在其他情况下(我还没有计算出什么时候),我没有得到一个YSOD,但从IIS得到的只是一个默认的500页。尽管启用了失败的请求跟踪,但我没有得到任何日志。不过,这可能是PEBKAC


我问题的解决方案

多亏拉尔斯、文森特·比拉涅特和迈克尔·凯的回答,他们解决了我的问题

首先-正如Michael和Vincent指出的,我发布的XSLT是错误的,sectionGroup元素应该在名称空间中”http://schemas.microsoft.com/.NetConfiguration/v2.0“

为了对此进行排序,我在XSLT中定义了默认名称空间,如so
xmlns=”http://schemas...“

但是(为什么我不知道)sectionGroup元素然后作为

<sectionGroup name="elmah" xmlns:con="http://schemas.microsoft.com/.NetConfiguration/v2.0">

再次感谢大家在模板中对
con:configSections
元素的帮助,您添加了一个不合格的
sectionGroup
元素,没有名称空间与之链接

尝试将sectionGroup零件替换为:

  <con:sectionGroup name="elmah" >
    <con:section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
    <con:section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
    <con:section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
    <con:section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
  </con:sectionGroup>

假设
sectionGroup
必须与
configSection
位于同一命名空间中


另一种选择是不带前缀地保留代码,并在
sectionGroup
标记中添加以下名称空间声明:
xmlns=”http://schemas.microsoft.com/.NetConfiguration/v2.0“

在XSLT数据模型中,命名空间声明和取消声明不是属性节点。不要考虑名称空间声明和取消声明:而是考虑元素的名称。您需要一个名称(使用符号(uri,local))为

(”http://schemas.microsoft.com/.NetConfiguration/v2.0“,“部门组”)

但是您请求了一个名为的元素

(“节组”)

这就是处理器为您创建的。序列化后,将输出名称空间取消声明xmlns=“”,以确保元素不在名称空间中


修复方法是在正确的名称空间中创建元素,例如,可以通过在文本结果元素上放置名称空间声明来实现

首先,如果ASP.NET仅仅因为出现了
xmlns=”“
伪属性而被打乱(而不是因为内容位于错误的名称空间而被打乱),那么这是ASP.NET中的一个错误,应该予以修复。如果您的ELMAH内容实际上位于错误的名称空间中,那么这个问题当然应该得到解决(但是,您的名称空间没有问题)

将“排除结果前缀”属性添加到
开始标记可能会有所帮助:

exclude-result-prefixes="con"
这至少应该从输出中删除
xmlns:con=“…”
声明。有关更多信息,请参阅

但是,由于您将ELMAH XML(不在名称空间中)嵌入到某个.NetConfiguration XML下,该XML位于名称空间中;如果XSLT决定为后者使用默认名称空间,那么它别无选择,只能在
元素上使用某种名称空间声明。。。否则,
元素将位于.NetConfiguration命名空间中

您尚未向我们显示输出XML的
部分。。。这将有助于诊断原因并找到解决方案。特别是,您的输出XML是否具有
(即使用
con
前缀)或
(使用默认名称空间)

名称空间声明具有以下语法xmlns:prefix=“URI”


苹果
香蕉
非洲咖啡桌
80
120

来源:

您是否尝试过在xsl:stylesheet中添加默认的xmlns?尝试添加
xmlns=”http://schemas.microsoft.com/.NetConfiguration/v2.0“
+1,以便更好地解释解决方案。奇怪的是,
应该位于.NetConfiguration命名空间中;这意味着此处显示的配置XML无效:是-似乎
<xsl:stylesheet version="1.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
    xmlns:con="http://schemas.microsoft.com/.NetConfiguration/v2.0"
    xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"
    exclude-result-prefixes="msxsl con"
>
  <con:sectionGroup name="elmah" >
    <con:section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
    <con:section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
    <con:section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
    <con:section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
  </con:sectionGroup>
exclude-result-prefixes="con"
<root>

<h:table xmlns:h="http://www.w3.org/TR/html4/">
  <h:tr>
    <h:td>Apples</h:td>
    <h:td>Bananas</h:td>
  </h:tr>
</h:table>

<f:table xmlns:f="https://www.w3schools.com/furniture">
  <f:name>African Coffee Table</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>

</root>