在将元素添加到XML文件时停止XSLT,包括xmlns属性

问题描述 投票:1回答:4

背景:我正在尝试编写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使...

xslt web-config elmah
4个回答
1
投票

[首先,如果ASP.NET仅由于存在xmlns=""伪属性而感到不安(而不是因为内容位于错误的名称空间而感到不安),那么这就是ASP.NET中的错误,应予以修复。如果您的ELMAH内容实际上位于错误的命名空间中,那么该问题当然应该得到解决(但是AFAICT, ELMAH config content should be in no namespace,所以您可以解决)。

将排除结果前缀属性添加到<xsl:stylesheet>开始标记中可能会有所帮助:


1
投票

在与con:configSections元素有关的模板中,添加了不合格的sectionGroup元素,没有名称空间与其链接。


1
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.