我使用xsl element namespace属性在元素中添加了一个名称空间.这会在结果中的子元素中添加空命名空间.
这是将命名空间添加到元素"Auto"
EDIT中的XSL
- 我的xsl的简短版本
<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">
<xsl:output method="xml" indent="no"/>
<xsl:template match="/">
<xsl:element name="Root">
<xsl:element name="Auto" namespace="http://www.Root.com/XMLSchema/Auto">
<xsl:element name="Applicant">
<xsl:element name="ApplicantType">
<xsl:text>Applicant</xsl:text>
</xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="Life" namespace="http://www.Root.com/XMLSchema/Auto">
<xsl:element name="Applicant">
<xsl:element name="ApplicantType">
<xsl:text>Applicant</xsl:text>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
这是由XSL转换的xml
<Root>
<Auto xmlns="http://www.Root.com/XMLSchema/Auto">
<Applicant xmlns="">
<ApplicantType>Applicant</ApplicantType>
</Applicant>
</Auto>
</Root>
Run Code Online (Sandbox Code Playgroud)
如果看到Applicant元素,则转换添加了xmlns ="".如何删除这个空命名空间?
如果您展示生成Applicant
和ApplicantType
元素的XSL,我们可以更好地帮助您.此外,您在问题描述中混淆了"命名空间"和"命名空间声明"......将这两者分开可能有助于您掌握解决方案
您的XSL代码显然告诉处理器Applicant
在没有命名空间的情况下输出该元素.(因此您的代码可能是错误的...您希望Applicant
与Auto
其父代码位于同一名称空间中.)由于Applicant
没有前缀将从其父级继承默认名称空间声明,因此输出XML必须"取消声明"默认名称空间声明,为了Applicant
不按你的要求放入命名空间.
例如,如果您的XSL代码说:
<xsl:element name="Auto" namespace="http://www.Root.com/XMLSchema/Auto">
<xsl:element name="Applicant">
Run Code Online (Sandbox Code Playgroud)
然后你告诉XSL输出Applicant
没有名称空间的元素,如上所述.要解决此问题,您可以重复命名空间:
<xsl:element name="Auto" namespace="http://www.Root.com/XMLSchema/Auto">
<xsl:element name="Applicant" namespace="http://www.Root.com/XMLSchema/Auto">
Run Code Online (Sandbox Code Playgroud)
或者如@empo所说,你可以声明一个命名空间前缀并使用它:
<xsl:stylesheet ... xmlns:auto="http://www.Root.com/XMLSchema/Auto">
...
<auto:Auto>
<auto:Applicant>
<auto:ApplicantType>
...
Run Code Online (Sandbox Code Playgroud)
或在样式表(或模板)中使用默认名称空间声明:
<xsl:stylesheet ... xmlns="http://www.Root.com/XMLSchema/Auto">
...
<xsl:element name="Auto">
<xsl:element name="Applicant">
...
Run Code Online (Sandbox Code Playgroud)
不要在XML的表面语法中考虑名称空间声明,将元素名称视为(uri,localname)对.如果您创建的Applicant元素不在任何命名空间中,但它的父元素位于命名空间中,则序列化程序将添加xmlns =""以确保您的愿望得到尊重(即让申请者与其父元素位于不同的命名空间中) ).另一方面,如果您希望Applicant位于名称空间"http://www.Root.com/XMLSchema/Auto"中,则需要确保在此命名空间中创建它.你没有显示创建它的代码,所以我们无法确切地说出你做错了什么.