背景:我正在尝试编写Elmah的配置脚本,以便在生产中可以运行一个脚本,该脚本将复制二进制文件并相应地编辑web.config文件。
我决定使用XSLT对web.config文件进行更改。首先,我想像这样在sectionGroup
元素中添加configSections
。
<sectionGroup name="elmah">
<section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
....
</sectionGroup>
这是我的XSLT模板
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
xmlns:con="http://schemas.microsoft.com/.NetConfiguration/v2.0"
>
<xsl:output method="xml" indent="yes"/>
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- Add sectionGroup to configuration/configSections-->
<xsl:template match="con:configSections[not (con:sectionGroup/@name='elmah')]">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:comment>ELMAH</xsl:comment>
<sectionGroup name="elmah" >
<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
<section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah" />
<section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
<section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
</sectionGroup>
<xsl:comment>/ELMAH</xsl:comment>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
而且几乎可以满足我的要求。它生成以下sectionGroup
XML。
<!--ELMAH-->
<sectionGroup name="elmah" xmlns="" xmlns:con="http://schemas.microsoft.com/.NetConfiguration/v2.0">
<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
....
</sectionGroup>
<!--/ELMAH-->
注意xmlns
属性。此属性的存在确实使ASP.Net感到不安(即使它是完全有效的XML-尽管是多余的),并且所有请求均导致HTTP 500错误(有关错误消息,请参见下面的部分)。我可以摆脱的唯一错误消息
删除xmlns属性可解决此问题。
我可以使用xsl:element
生成新的XML,但这会导致非常冗长且难以阅读的XSL。
所以我的问题是如何告诉XSLT not
在生成的XML中添加xmls属性?提前感谢。
错误消息
有关信息,这是ASP / IIS给我们的错误消息:-
当配置文件的根元素(或与此相关的任何其他元素)具有前缀定义xmlns:con="http://schemas.microsoft.com/.NetConfiguration/v2.0"
时,我在YSOD中得到以下内容
配置错误
描述:在处理服务于此请求所需的配置文件期间发生错误。请查看下面的特定错误详细信息,并适当修改您的配置文件。
解析器错误消息:无法识别的属性'xmlns:con'。请注意,属性名称区分大小写。
当任何其他元素具有'xmlns'属性属性时,我会在YSOD中收到以下消息。
解析器错误消息:无法识别的属性'xmlns'。请注意,属性名称区分大小写。
在其他情况下(我尚未计算出何时),我没有得到YSOD,而只是从IIS获得了默认的500页。尽管启用了失败的请求跟踪,但我没有任何日志。不过,这可能是PEBKAC。
我的问题的解决方案
感谢LarsH,Vincent Biragnet和Michael Kay的回答,他们之间的回答解决了我的问题。
首先-我发布的XSLT是错误的,正如Michael和Vincent指出的那样,sectionGroup元素应该
在命名空间“ http://schemas.microsoft.com/.NetConfiguration/v2.0”中。] >为了对此进行排序,我像xmlns="http://schemas..."
这样在XSLT中定义了默认名称空间。
但是(为什么我不知道)sectionGroup元素然后输出为
<sectionGroup name="elmah" xmlns:con="http://schemas.microsoft.com/.NetConfiguration/v2.0">
(不是xmlns:con多余的?)。无论如何,在存在xmlns:con的情况下,配置解析器就会倒闭。
但是LarsH急救-他使用exclude-result-prefixes="msxsl con"
的建议摆脱了那些讨厌的东西。
所以,我的(现在正在使用的)XSLT的顶部现在看起来像这样
<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"
>
再次感谢大家的帮助
背景:我正在尝试编写脚本以编写Elmah,以便在生产中可以运行一个脚本,该脚本将复制二进制文件并相应地编辑web.config文件。我决定使用XSLT使...
[首先,如果ASP.NET仅由于存在xmlns=""
伪属性而感到不安(而不是因为内容位于错误的名称空间而感到不安),那么这就是ASP.NET中的错误,应予以修复。如果您的ELMAH内容实际上位于错误的命名空间中,那么该问题当然应该得到解决(但是AFAICT, ELMAH config content should be in no namespace,所以您可以解决)。
将排除结果前缀属性添加到<xsl:stylesheet>
开始标记中可能会有所帮助:
在与con:configSections
元素有关的模板中,添加了不合格的sectionGroup
元素,没有名称空间与其链接。
在XSLT数据模型中,名称空间声明和取消声明不是属性节点。不要考虑名称空间声明和取消声明:而应该考虑元素的名称。您需要一个元素的名称(使用符号(uri,本地))为
名称空间声明具有以下语法。 xmlns:prefix =“ URI”