在向XML文件添加元素时停止包含xmlns属性的XSLT
背景:我正在尝试编写Elmah的配置脚本,以便在生产中运行脚本,复制二进制文件并相应地编辑web.config文件 我决定使用XSLT对web.config文件进行修改。首先,我想在在向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
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给我们的错误消息:-
- 当配置文件的根元素(或任何其他元素)具有前缀定义
,我在YSOD中得到以下信息 配置错误 描述:处理服务此请求所需的配置文件时出错。请查看下面的特定错误详细信息,并适当修改配置文件 分析器错误消息:无法识别的属性“xmlns:con”。请注意,属性名称区分大小写xmlns:con=”时http://schemas.microsoft.com/.NetConfiguration/v2.0“
- 当任何其他元素具有“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>