XSD targetNamespace 不覆盖元素命名空间?
XSD targetNamespace does not override element namespace?
我有一个 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>
当xs:schema/elementFormDefault="qualified"
(如你的情况,也是elementFormDefault
推荐和最常用的设置。)
在 XSD 中声明的 元素 必须在 XSD 给出的命名空间中targetNamespace
.
因此,对于您的 XSD,TestElement
必须在 http://somefancy.namespace
中,XML 文档才有效。如果您希望它位于 http://anotherfancy.namespace
中,请在导入的 XSD 中声明 元素 ;将其 type 存储在那里不会将元素本身放置在其他名称空间中。一旦在导入的命名空间中声明了 TestElement
,就可以通过 xs:element/@ref
.
在原始命名空间中使用它
另见
对于很少需要且通常不推荐的其他变体
见 and my longer answer to this question: What does elementFormDefault do in XSD?
在局部元素声明中声明的元素的命名空间在以下规则中给出(XSD 1.1 part 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·.
xs:element
的 targetNamespace
属性是 1.1 中新增的,因此对于 1.0,您可以忽略规则 1。
xs:element
的 form
属性很少使用,但如果值为 qualified
则元素进入在包含 xs:schema
上声明的 targetNamespace,而如果它是 unqualified
那么它就没有命名空间。如果未指定 form
(几乎总是如此),则它默认为 xs:schema
元素上的 elementFormDefault
的值。这通常设置为 qualified
,因此元素进入模式的目标命名空间;但默认(不幸的是)是 unqualified
这意味着它没有命名空间。
我有一个 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>
当xs:schema/elementFormDefault="qualified"
(如你的情况,也是elementFormDefault
推荐和最常用的设置。)
在 XSD 中声明的 元素 必须在 XSD 给出的命名空间中targetNamespace
.
因此,对于您的 XSD,TestElement
必须在 http://somefancy.namespace
中,XML 文档才有效。如果您希望它位于 http://anotherfancy.namespace
中,请在导入的 XSD 中声明 元素 ;将其 type 存储在那里不会将元素本身放置在其他名称空间中。一旦在导入的命名空间中声明了 TestElement
,就可以通过 xs:element/@ref
.
另见
对于很少需要且通常不推荐的其他变体
见
在局部元素声明中声明的元素的命名空间在以下规则中给出(XSD 1.1 part 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·.
xs:element
的 targetNamespace
属性是 1.1 中新增的,因此对于 1.0,您可以忽略规则 1。
xs:element
的 form
属性很少使用,但如果值为 qualified
则元素进入在包含 xs:schema
上声明的 targetNamespace,而如果它是 unqualified
那么它就没有命名空间。如果未指定 form
(几乎总是如此),则它默认为 xs:schema
元素上的 elementFormDefault
的值。这通常设置为 qualified
,因此元素进入模式的目标命名空间;但默认(不幸的是)是 unqualified
这意味着它没有命名空间。