XSD targetNamespace不会覆盖元素名称空间?

问题描述 投票:1回答:2

我有一个定义复杂类型的XSD,并设置了targetNamespace属性。 TestElement不会获得targetNamespace设置的命名空间是否正确?它应该从复杂类型afn:ElementType获得命名空间,因此http://anotherfancy.namespace,对吧?

   <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:sfn="http://somefancy.namespace"
            xmlns:afn="http://anotherfancy.namespace"
            attributeFormDefault="unqualified"
            elementFormDefault="qualified"
            targetNamespace="http://somefancy.namespace"
            version="1.0">
      <xs:import namespace="http://anotherfancy.namespace" schemaLocation="..."/>
      <xs:element name="MyComplexType">
         <xs:complexType>
            <xs:sequence>
               <xs:element minOccurs="0" name="TestElement" type="afn:ElementType">
               </xs:element>
            </xs:sequence>
         </xs:complexType>
      </xs:element>
   </xs:schema>
xml xsd xsd-validation xml-validation
2个回答
1
投票

xs:schema/elementFormDefault="qualified"

(在你的情况下,这也是elementFormDefault推荐和最常用的设置。)

在XSD中声明的元素必须位于XSD的targetNamespace给出的命名空间中。

因此,对于您的XSD,TestElement必须位于http://somefancy.namespace中才能使XML文档有效。如果您希望它在http://anotherfancy.namespace中,请在导入的XSD中声明该元素;存储其类型不会将元素本身放在该其他命名空间中。一旦在导入的命名空间中声明了TestElement,它就可以通过xs:element/@ref在原始命名空间中使用。

另见How to reference element in other XSD's namespace?

对于很少需要,通常不推荐,其他变化

请参阅Michael Kay's answer heremy longer answer这个问题:What does elementFormDefault do in XSD?


1
投票

在本地元素声明中声明的元素的名称空间在以下规则中给出(XSD 1.1第1部分§3.3.2.3)

{target namespace}

The appropriate case among the following:
1 If targetNamespace is present [as an attribute of the xs:element element], then its ·actual value·.
2 If targetNamespace is not present and one of the following is true
2.1 form = qualified
2.2 form is absent and the <schema> ancestor has elementFormDefault = qualified
then the ·actual value· of the targetNamespace [attribute] of the ancestor <schema> element information item, or ·absent· if there is none.
3 otherwise ·absent·.

targetNamespacexs:element属性在1.1中是新的,因此对于1.0,您可以忽略规则1。

formxs:element属性很少使用,但如果值为qualified,则元素进入在包含xs:schema上声明的targetNamespace,而如果它是unqualified,则它不进入任何名称空间。如果未指定form(几乎总是如此),则默认为elementFormDefault元素上的xs:schema值。这通常设置为qualified,因此元素进入模式的目标名称空间;但是默认(不幸的是)是unqualified,这意味着它没有名称空间。

© www.soinside.com 2019 - 2024. All rights reserved.