xsl namespace attribue在子元素中添加空命名空间

Amz*_*ath 4 xml xslt

我使用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 ="".如何删除这个空命名空间?

Lar*_*rsH 6

如果您展示生成ApplicantApplicantType元素的XSL,我们可以更好地帮助您.此外,您在问题描述中混淆了"命名空间"和"命名空间声明"......将这两者分开可能有助于您掌握解决方案

您的XSL代码显然告诉处理器Applicant在没有命名空间的情况下输出该元素.(因此您的代码可能是错误的...您希望ApplicantAuto其父代码位于同一名称空间中.)由于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)


Mic*_*Kay 5

不要在XML的表面语法中考虑名称空间声明,将元素名称视为(uri,localname)对.如果您创建的Applicant元素不在任何命名空间中,但它的父元素位于命名空间中,则序列化程序将添加xmlns =""以确保您的愿望得到尊重(即让申请者与其父元素位于不同的命名空间中) ).另一方面,如果您希望Applicant位于名称空间"http://www.Root.com/XMLSchema/Auto"中,则需要确保在此命名空间中创建它.你没有显示创建它的代码,所以我们无法确切地说出你做错了什么.