Xml xsl命名空间属性在子元素中添加空命名空间
我使用xsl元素名称空间属性在元素中添加名称空间。在结果的子元素中添加空命名空间 下面是将名称空间添加到元素“Auto”中的XSLXml xsl命名空间属性在子元素中添加空命名空间,xml,xslt,Xml,Xslt,我使用xsl元素名称空间属性在元素中添加名称空间。在结果的子元素中添加空命名空间 下面是将名称空间添加到元素“Auto”中的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
编辑-我的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>
申请人
申请人
下面是通过XSL转换的xml
<Root>
<Auto xmlns="http://www.Root.com/XMLSchema/Auto">
<Applicant xmlns="">
<ApplicantType>Applicant</ApplicantType>
</Applicant>
</Auto>
</Root>
申请人
如果您看到申请者元素,则转换添加了xmlns=”“。如何删除此空名称空间?申请人和应用程序类型元素没有名称空间,在这种情况下,空名称空间声明是正确的,或者,它们应该与自动元素位于同一名称空间中(或者,为了完整性,在另一个名称空间中)。在后一种情况下,您必须修复XSL转换。如果您显示生成
申请人
和应用程序类型
元素的XSL,我们可以更好地帮助您。另外,您在描述问题时混淆了“名称空间”和“名称空间声明”。。。将这两者分开可能有助于您掌握解决方案
您的XSL代码显然是在告诉处理器在没有名称空间的情况下输出applicator
元素。(因此,您的代码可能是错误的……您希望applicator
与其父项位于相同的Auto
命名空间中。)由于没有前缀的applicator
将从其父项继承默认命名空间声明,因此输出XML必须“取消声明”默认命名空间声明,为了按照您的要求将申请人放在无名称空间中
例如,如果XSL代码显示:
<xsl:element name="Auto" namespace="http://www.Root.com/XMLSchema/Auto">
<xsl:element name="Applicant">
或者正如@empo所说,您可以声明名称空间前缀并使用它:
<xsl:stylesheet ... xmlns:auto="http://www.Root.com/XMLSchema/Auto">
...
<auto:Auto>
<auto:Applicant>
<auto:ApplicantType>
...
...
...
或者在样式表(或模板)中使用默认命名空间声明:
...
...
不要考虑XML表面语法中的名称空间声明,将元素名称视为(uri,localname)对。如果您创建的申请者元素不在任何名称空间中,但其父元素在名称空间中,则序列化程序将添加xmlns=“”,以确保您的意愿得到尊重(即,申请者位于与其父元素不同的名称空间中)。另一方面,如果希望申请者位于命名空间中“http://www.Root.com/XMLSchema/Auto,则需要确保它是在此命名空间中创建的。您尚未显示创建它的代码,因此我们无法确切地说出您做错了什么。您的输出文档是:
<Root>
<Auto xmlns="http://www.Root.com/XMLSchema/Auto">
<Applicant xmlns="">
<ApplicantType>Applicant</ApplicantType>
</Applicant>
</Auto>
</Root>
您没有限定Root
,也没有限定applicator
和applicationtype
。由于默认情况下,非限定名称被视为属于空名称空间(xmlns=“”)的元素,因此输出文档必须至少在那些可能导致文档歧义或错误解释的节点中指定该名称
您可能遗漏的是,在XSLT中,当在转换中为特定元素指示文字名称空间URI时,您仅限定该元素(或其子元素或任何其他子元素)。因此,在XSLT中,如果您不想为声明的每个元素定义名称空间,就必须使用全局默认名称空间。这将正确地限定名称空间中的每个元素,并省略输出中的大多数名称空间声明。您可能还希望使用:
exclude-result-prefixes="#default"
删除多余的命名空间声明
然后考虑仅在您确实需要时添加带有前缀的全局名称空间(例如,您知道输出文档中会有命名冲突)
你的问题:
如何删除此空命名空间
您现在应该问问自己:在哪里限定我的元素(及其后代)(一劳永逸)?好吧!如果您不需要空的默认名称空间,我只需为所有样式表全局声明所需名称空间。applicator
和applicationType
元素来自哪里?如果它们来自输入,并且在输出中,您希望它们与Auto
元素位于同一名称空间中,那么您不能复制它们,而是需要转换它们。如果在样式表中创建这些元素,只需确保在与Auto
元素相同的名称空间中创建它们,例如执行applicator
。您需要显示生成applicator
和applicationType
元素的XSL。另外,您在描述问题时混淆了“名称空间”和“名称空间声明”。。。将这两者分开可能有助于您掌握解决方案xsl@Amzath:好的,那么我的“如果您的XSL代码说”假设是正确的。我建议您使用上面的xmlns:auto=
建议,特别是如果您的
元素不应该位于auto
命名空间中。
<Root>
<Auto xmlns="http://www.Root.com/XMLSchema/Auto">
<Applicant xmlns="">
<ApplicantType>Applicant</ApplicantType>
</Applicant>
</Auto>
</Root>
{}Root
-{http://www.Root.com/XMLSchema/Auto}Auto
-{}Applicant
-{}ApplicantType
exclude-result-prefixes="#default"