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

时间:2019-03-28 10:25:47

标签: xml xsd xsd-validation xml-validation

我有一个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>

2 个答案:

答案 0 :(得分:1)

xs:schema/elementFormDefault="qualified"

(根据您的情况,也是elementFormDefault的推荐且最常用的设置。)

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

因此,对于XSD,必须保证TestElementhttp://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 :(得分: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·.

targetNamespace的{​​{1}}属性是1.1中的新增功能,因此对于1.0,您可以忽略规则1。

很少使用xs:element的{​​{1}}属性,但是如果值为form,则该元素进入包含xs:element上声明的targetNamespace中,而如果它是qualified,那么它就没有命名空间。如果未指定xs:schema(几乎总是这样),则它默认为unqualified元素上的form的值。通常将其设置为elementFormDefault,因此元素位于模式的目标名称空间中;但是默认(不幸的是)是xs:schema,这意味着它没有命名空间。