elementFormDefault在XSD中做了什么?

elementFormDefault做什么,什么时候使用?

所以我find了elementFormDefault值的一些定义:

限定 – 元素和属性位于模式的目标名称空间中

不合格 – 元素和属性没有名称空间

所以从这个定义我会认为,如果一个架构设置为合格,那么为什么你必须在名称空间的前缀types? 你甚至有什么情况下,你会有一个不合格的事情? 我尝试了Googlesearch,但是我得到的只是一些W3C页面,这些页面非常难以理解。

这是我正在使用的文件,为什么我需要将types声明为target:TypeAssignments当我将targetNamespace声明为与xmlns:target相同?

 <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:target="http://www.levijackson.net/web340/ns" targetNamespace="http://www.levijackson.net/web340/ns" elementFormDefault="qualified"> <element name="assignments"> <complexType> <sequence> <element name="assignments" type="target:TypeAssignments" minOccurs="1" maxOccurs="unbounded"/> </sequence> </complexType> </element> <complexType name="TypeAssignments"> <sequence> <element name="assignment" type="target:assignmentInfo" minOccurs="0" maxOccurs="unbounded"/> </sequence> </complexType> <complexType name="assignmentInfo"> <sequence> <element name="name" type="string"/> <element name="page" type="target:TypePage"/> <element name="file" type="target:TypeFile" minOccurs="0" maxOccurs="unbounded"/> </sequence> <attribute name="id" type="string" use="required"/> </complexType> <simpleType name="TypePage"> <restriction base="integer"> <minInclusive value="50" /> <maxInclusive value="498" /> </restriction> </simpleType> <simpleType name="TypeFile"> <restriction base="string"> <enumeration value=".xml" /> <enumeration value=".dtd" /> <enumeration value=".xsd" /> </restriction> </simpleType> </schema> 

ElementFormDefault与模式中的types的命名空间无关,而是关于符合模式的XML文档中元素的命名空间。

以下是规范的相关部分:

 Element Declaration Schema Component Property {target namespace} Representation If form is present and its ·actual value· is qualified, or if form is absent and the ·actual value· of elementFormDefault on the <schema> ancestor is qualified, then the ·actual value· of the targetNamespace [attribute] of the parent <schema> element information item, or ·absent· if there is none, otherwise ·absent·. 

这意味着您在模式顶部声明的targetNamespace仅适用于符合模式的XML文档中的元素(如果elementFormDefault为“qualified”),或者元素在模式中显式声明为form =“qualified” 。

例如:如果elementFormDefault是不合格的 –

 <element name="name" type="string" form="qualified"></element> <element name="page" type="target:TypePage"></element> 

将期望“名称”元素在目标名称空间和“页面”元素在空名称空间。

为了节省你必须在每个元素声明上放置form =“qualified”,声明elementFormDefault =“qualified”意味着targetNamespace应用于每个元素,除非在元素声明中joinform =“unqualified”。

考虑author元素使用的以下ComplexType AuthorType

 <xsd:complexType name="AuthorType"> <!-- compositor goes here --> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="phone" type="tns:Phone"/> </xsd:sequence> <xsd:attribute name="id" type="tns:AuthorId"/> </xsd:complexType> <xsd:element name="author" type="tns:AuthorType"/> 

如果elementFormDefault="unqualified"

那么下面的XML实例是有效的

 <x:author xmlns:x="http://example.org/publishing"> <name>Aaron Skonnard</name> <phone>(801)390-4552</phone> </x:author> 

作者的名字属性是允许的,没有指定名称空间(不合格)。 任何属于<xsd:complexType>一部分的元素都被认为是complexType的本地元素。

如果elementFormDefault="qualified"

那么该实例应该具有合格的本地元素

 <x:author xmlns:x="http://example.org/publishing"> <x:name>Aaron Skonnard</name> <x:phone>(801)390-4552</phone> </x:author> 

请参阅此链接了解更多详情

使用elementFormDefault需要注意的是,它适用于本地定义的元素,通常在complexType块内命名元素,而不是在架构顶层定义的全局元素。 对于elementFormDefault =“qualified”,可以使用模式的目标名称空间作为文档的默认名称空间,从xml文档中寻址模式中的本地元素。

在实践中,使用elementFormDefault =“qualified”可以声明嵌套块中的元素,否则必须声明顶层的所有元素,并使用ref属性在嵌套元素的模式中引用它们,导致更简洁的模式。

XML Schema Primer中的这一点讨论了这个问题: http : //www.w3.org/TR/xmlschema-0/#NS

elementFormDefault =“qualified”用于控制XML实例文档(.xml文件)中名称空间的使用,而不是模式文档本身(.xsd文件)中的名称空间。

通过指定elementFormDefault =“qualified”,我们强制要在用这个模式validation的文档中使用的名称空间声明。

通常的做法是指定这个值来声明元素应该是合格的而不是不合格的。 但是,由于attributeFormDefault =“unqualified”是缺省值,因此如果不想限定名称空间,则无需在模式文档中指定它。

新的,经常被问到的老问题的详细答案和解释…

简短的回答 :如果你不添加elementFormDefault="qualified"xsd:schema ,那么默认的unqualified值意味着本地声明的元素不在命名空间中

关于什么是elementFormDefault ,有很多困惑,但是这个可以用一个简短的例子很快弄清楚。

简化版本的XSD:

 <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:target="http://www.levijackson.net/web340/ns" targetNamespace="http://www.levijackson.net/web340/ns"> <element name="assignments"> <complexType> <sequence> <element name="assignment" type="target:assignmentInfo" minOccurs="1" maxOccurs="unbounded"/> </sequence> </complexType> </element> <complexType name="assignmentInfo"> <sequence> <element name="name" type="string"/> </sequence> <attribute name="id" type="string" use="required"/> </complexType> </schema> 

关键点:

  • assignment元素是本地定义的。
  • 在XSD中本地定义的元素在默认情况下不在名称空间中。
    • 这是因为elementFormDefault的默认值是unqualified
    • 这可以说是XSD的创造者的一个devise错误。
    • 标准做法是始终使用elementFormDefault="qualified"以便按照预期的方式在目标名称空间中进行assignment

看似有效的XML

根据上面的XSD,这个XML看起来应该是有效的:

 <assignments xmlns="http://www.levijackson.net/web340/ns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.levijackson.net/web340/ns try.xsd"> <assignment id="a1"> <name>John</name> </assignment> </assignments> 

注意:

  • assignments的默认名称空间将assignments及其所有后代放置在默认名称空间( http://www.levijackson.net/web340/ns )中。

复杂的validation错误

尽pipe看起来有效,上面的XML会产生以下令人困惑的validation错误:

[错误] try.xml:4:23:cvc-complex-type.2.4.a:发现无效的内容是从元素“assignment”开始的。 其中一个“{assignment}”是预期的。

笔记:

  • 您不会是第一个诅咒此诊断的开发人员,似乎认为内容无效,因为它期望findassignment元素,但实际上find了assignment元素。WTF
  • 这实际上意味着什么: {}周围的assignment意味着validation期望这里没有命名空间的 assignment 。 不幸的是,当它说它find了一个assignment元素的时候,并没有提到它在一个默认的命名空间中find了,这个命名空间和没有命名空间是不同的。

  • 绝大部分时间:elementFormDefault="qualified"添加elementFormDefault="qualified" XSD的xsd:schema元素。 这意味着当在XSD中本地声明时,有效的XML必须将元素放置在目标名称空间中; 否则,有效的XML必须将本地声明的元素放在没有名称空间中。
  • 微不足道的时间:改变XML以符合XSD的要求,即在任何命名空间中的assignment 。 这可以通过例如将xmlns=""添加到assignment元素来实现。

我注意到,如果使用elementFormDefault =“qualified”,则XMLSpy(至less2011版本)需要定义targetNameSpace。 否则不会validation。 也不会生成具有名称空间前缀的xmls