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}”是预期的。
笔记:
- 您不会是第一个诅咒此诊断的开发人员,似乎认为内容无效,因为它期望find
assignment
元素,但实际上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