.net 是否从XSLT输出根中删除XML命名空间声明?

.net 是否从XSLT输出根中删除XML命名空间声明?,.net,xml,xslt,xml-namespaces,.net,Xml,Xslt,Xml Namespaces,具有以下输入XML: <?xml version="1.0" encoding="utf-8" ?> <customSettings xmlns:env="urn:schemas-test-env"> <connectionStrings> <add name="Name" connectionString="None" providerName="" /> <add name="Name" conne

具有以下输入XML:

<?xml version="1.0" encoding="utf-8" ?>
<customSettings xmlns:env="urn:schemas-test-env">
    <connectionStrings>
        <add name="Name" connectionString="None" providerName="" />
        <add name="Name" connectionString="Local"  providerName="" env:name="Local" />
        <add name="Name" connectionString="Dev"  providerName="" env:name="Dev"  />
    </connectionStrings>
    <appSettings>
        <add key="Name" value="Value" />
        <add key="Name" value="Local" env:name="Local" />
        <add key="Name" value="Dev" env:name="Dev" />
    </appSettings>
</customSettings>

和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"

                xmlns:code="urn:schemas-test-code"
                xmlns:env="urn:schemas-test-env"
>
    <xsl:output version="1.0" encoding="utf-8" omit-xml-declaration="yes" indent="yes" />
    <xsl:strip-space elements="*" />

    <!-- Populate param value -->
    <xsl:param name="env" select="code:GetEnvironment()" />

    <!-- Copy content as is -->
    <xsl:template match="node()|@*" name="identity">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

    <!-- Remove all add nodes with env:name not matching param -->
    <xsl:template match="add">
        <xsl:if test="not(@env:name != $env)">
            <xsl:call-template name="identity" />
        </xsl:if>
    </xsl:template>

    <!-- Remove all env:name attributes -->
    <xsl:template match="@env:name" />
</xsl:stylesheet>

我将获得以下输出XML:

<customSettings xmlns:env="urn:schemas-test-env">
  <connectionStrings>
    <add name="Name" connectionString="None" providerName="" />
    <add name="Name" connectionString="Local" providerName="" />
  </connectionStrings>
  <appSettings>
    <add key="Name" value="Value" />
    <add key="Name" value="Local" />
  </appSettings>
</customSettings>


如何从根元素中删除命名空间声明?

如果替换此模板:

<!-- Copy content as is -->
<xsl:template match="node()|@*" name="identity">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
</xsl:template>

使用以下两个模板:

<!-- Copy elements without copying their namespace declarations -->
<xsl:template match="*" name="identity">
  <xsl:element name="{name()}">
    <xsl:apply-templates select="node()|@*" />
  </xsl:element>
</xsl:template>

<!-- Copy content as is -->
<xsl:template match="node()|@*" priority="-2">
  <xsl:copy>
    <xsl:apply-templates select="node()|@*" />
  </xsl:copy>
</xsl:template>


这样就可以了。

在XSLT2.0中,您可以使用

<xsl:copy copy-namespaces="no">

您是否尝试将exclude result prefixes=“env”添加到样式表声明中?应该是这样的:

<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"

                xmlns:code="urn:schemas-test-code"
                xmlns:env="urn:schemas-test-env"
                exclude-result-prefixes="env"
>


是否可以不使用
优先级
?@abatischev否,因为
match=“*”
match=“node()”
在默认情况下是相同的优先级。@abatishchev我认为如果您只使用
而不是第二个模板,您不需要priority属性。@nwellnhof它必须是
match=“text()| comment()|processing-instruction()|@*“
@abatishchev是否有避免使用
优先级的原因?标识模板的优先级通常比XSLT中的任何其他模板都要低,因此将其优先级设置为极低可能不会引起任何问题。我使用的.NET非常不幸地受到1.0的限制。但事实并非如此,.NET与XSLT 2.0处理器配合得很好-有两个很好的处理器,Saxon和XmlPrime。是的,当然,有很多,但不是现成的。这就是我的意思