Xml elementFormDefault在XSD中做什么?

Xml elementFormDefault在XSD中做什么?,xml,xsd,xml-namespaces,xsd-validation,xml-validation,Xml,Xsd,Xml Namespaces,Xsd Validation,Xml Validation,elementFormDefault做什么,什么时候应该使用 因此我找到了elementFormDefault值的一些定义: 合格的-元素和属性 位于的targetNamespace中 模式 不合格-要素和 属性没有名称空间 因此,根据该定义,我认为如果模式设置为限定,那么为什么必须在类型前面加上名称空间?对于这个问题,你甚至会将一个设置为不合格的场景是什么?我试着用谷歌搜索,但我得到的只是一些非常难以理解的W3C页面 这就是我现在正在处理的文件,当我将targetNamespace声明为与xm

elementFormDefault
做什么,什么时候应该使用

因此我找到了
elementFormDefault
值的一些定义:

合格的-元素和属性 位于的targetNamespace中 模式

不合格-要素和 属性没有名称空间

因此,根据该定义,我认为如果模式设置为限定,那么为什么必须在类型前面加上名称空间?对于这个问题,你甚至会将一个设置为不合格的场景是什么?我试着用谷歌搜索,但我得到的只是一些非常难以理解的W3C页面

这就是我现在正在处理的文件,当我将
targetNamespace
声明为与
xmlns:target
相同的类型时,为什么我需要将类型声明为
target:TypeAssignments

<?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与模式中类型的名称空间无关,它与符合模式的XML文档中元素的名称空间有关

以下是规范的相关部分:

元素声明模式
组件属性{目标命名空间}
如果形式存在且其实际值合格,则表示,
或者,如果缺少形式和
祖先上的elementFormDefault是限定的,
然后是targetNamespace[属性]的实际值
父元素信息项的,或
·缺席·如果没有,否则·缺席·。
这意味着,如果elementFormDefault是“限定的”,或者元素在模式中显式声明为having form=“qualified”,则您在模式顶部声明的targetNamespace仅适用于符合模式的XML文档中的元素

例如:如果elementFormDefault不合格-

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

将期望“name”元素位于targetNamespace中,“page”元素位于null命名空间中


为了避免您必须在每个元素声明上放置form=“qualified”,stating elementFormDefault=“qualified”意味着targetNamespace应用于每个元素,除非在元素声明上放置form=“unqualified”来覆盖它。

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

实际上,使用elementFormDefault=“qualified”可以在嵌套块中声明元素,否则必须在顶层声明所有元素,并使用ref属性在嵌套元素的模式中引用它们,从而导致模式不那么紧凑


XML模式入门中的这一部分谈到了它:

我注意到,如果使用elementFormDefault=“qualified”,XMLSpy(至少2011版本)需要定义一个targetNameSpace。否则将无法验证。而且也不会生成带有名称空间前缀的XML,请考虑
AuthorType
元素使用的以下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"/>
在不指定名称空间的情况下,允许使用authors的name属性(未限定)。属于
的任何元素都被视为complexType的本地元素

如果
elementFormDefault=“qualified”

然后,实例应该对本地元素进行限定

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

亚伦·斯孔纳德
(801)390-4552
有关更多详细信息,请参阅链接elementFormDefault=“qualified”用于控制XML实例文档(.XML文件)中名称空间的使用,而不是架构文档本身(.xsd文件)中的名称空间

通过指定elementFormDefault=“qualified”,我们强制在使用此模式验证的文档中使用名称空间声明

通常的做法是指定此值以声明元素应该是合格的而不是不合格的。但是,由于attributeFormDefault=“unqualified”是默认值,如果不想限定名称空间,则不需要在架构文档中指定它。

对一个旧的常见问题的新的详细回答和解释

简短回答:如果不将
elementFormDefault=“qualified”
添加到
xsd:schema
,则默认的
unqualified
值表示本地声明的元素不在命名空间中

关于
elementFormDefault
的功能有很多混淆,但可以通过一个简短的示例快速说明这一点

精简版XSD: 注意:

  • assignments
    上的默认命名空间将
    assignments
    及其所有子代放置在默认命名空间中(
    http://www.levijackson.net/web340/ns
令人困惑的验证错误 尽管看起来有效,但上面的XML会产生以下令人困惑的验证错误:

[错误]try.xml:4:23:cvc复杂类型。2.4.a:生成的内容无效 找到以元素“assignment”开头的。“{assignment}”中的一个是 预料之中

注意事项:

  • 您不会是第一个诅咒此诊断的开发人员,该诊断似乎说内容无效,因为它期望找到
    赋值
    元素,但实际上找到了
    赋值
    元素。(WTF
  • 这到底是什么
    <x:author xmlns:x="http://example.org/publishing">
       <name>Aaron Skonnard</name>
       <phone>(801)390-4552</phone>
    </x:author>
    
    <x:author xmlns:x="http://example.org/publishing">
       <x:name>Aaron Skonnard</name>
       <x:phone>(801)390-4552</phone>
    </x:author>
    
    <?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>
    
    <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>