.net 是否从XSLT输出根中删除XML命名空间声明?
具有以下输入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 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。是的,当然,有很多,但不是现成的。这就是我的意思