elementFormDefault
做什么,何时使用?
所以我找到了elementFormDefault
值的一些定义:
合格 - 元素和属性 在。的targetNamespace中 架构
不合格 - 元素和 属性没有命名空间
因此,根据该定义,我认为如果将模式设置为限定,那么为什么必须在类型前加上命名空间?那些你甚至有一套不合格的场景是什么?我尝试使用谷歌搜索,但我得到的只是一些非常难以理解的W3C页面。
这是我正在使用的文件,当我将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>
答案 0 :(得分:66)
ElementFormDefault与模式中类型的名称空间无关,它与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 = “合格”。
例如:如果elementFormDefault不合格 -
<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>
将期望“name”元素放在targetNamespace和“page”元素中,使其位于null命名空间中。
为了节省你必须在每个元素声明上放置form =“qualified”,说明elementFormDefault =“qualified”意味着targetNamespace适用于每个元素,除非通过在元素声明上放置form =“unqualified”来覆盖。
答案 1 :(得分:53)
考虑AuthorType
元素
author
<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>
允许作者的name属性而不指定命名空间(不合格)。属于<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>
请参阅this链接了解详情
答案 2 :(得分:34)
对旧的常见问题的详细解答和解释......
简短回答:如果您未将elementFormDefault="qualified"
添加到xsd:schema
,则默认unqualified
值表示本地声明的元素位于没有命名空间。
关于elementFormDefault
的作用存在很多混淆,但这可以用一个简短的例子快速澄清......
<?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
元素是本地定义的。elementFormDefault
的默认值为unqualified
。elementFormDefault="qualified"
这样assignment
就像目标名称空间一样
期望的。根据上面的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
)。尽管看起来有效,但上述XML会产生以下令人困惑的验证错误:
[错误] try.xml:4:23:cvc-complex-type.2.4.a:内容无效 从元素'赋值'开始找到。其中一个'{assignment}'是 预期
备注:强>
assignment
元素但实际上找到了assignment
元素。 ( WTF ){
和}
左右assignment
表示验证期待assignment
无名称空间 < / strong>这里。不幸的是,当它发现它找到一个assignment
元素时,它没有提到它在默认命名空间中找到它,它与没有命名空间不同。elementFormDefault="qualified"
添加到XSD的xsd:schema
元素。这意味着有效的XML必须在XSD中本地声明时将元素放在目标命名空间中;否则,有效的XML必须将本地声明的元素放在无名称空间中。assignment
不在命名空间中。这可以实现,
例如,将xmlns=""
添加到assignment
元素。答案 3 :(得分:12)
要点elementFormDefault,重要的是它适用于本地定义的元素,通常是complexType块中的命名元素,而不是在架构的顶层定义的全局元素。使用elementFormDefault =“qualified”,您可以使用模式的目标名称空间作为文档的默认名称空间,在xml文档中处理模式中的本地元素。
实际上,使用elementFormDefault =“qualified”能够在嵌套块中声明元素,否则你必须在顶层声明所有元素并使用ref属性在嵌套元素中的模式中引用它们,导致模式不那么紧凑。
XML Schema Primer中的这一位讨论了它:http://www.w3.org/TR/xmlschema-0/#NS
答案 4 :(得分:5)
elementFormDefault =“qualified”用于控制XML实例文档(.xml文件)中名称空间的使用,而不是模式文档本身(.xsd文件)中的名称空间。
通过指定elementFormDefault =“qualified”,我们强制执行名称空间声明,以便在使用此模式验证的文档中使用。
通常的做法是指定此值以声明元素应该是限定的而不是非限定的。但是,由于attributeFormDefault =“unqualified”是默认值,因此如果不希望限定命名空间,则不需要在架构文档中指定它。
答案 5 :(得分:0)
我注意到如果使用elementFormDefault =“qualified”,XMLSpy(至少2011版本)需要定义targetNameSpace。否则将无法验证。并且也不会生成带有名称空间前缀的xmls