-->

是什么将elementFormDefault在XSD吗?(What does elementForm

2019-07-19 01:46发布

是什么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>

Answer 1:

将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是“合格”或元素显式声明的模式具有形式=“合格” 。

例如:如果将elementFormDefault不合格 -

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

会把期望“名”的元素是在目标名称和“页”的元素是在空命名空间。

为了节省您不必把形式=“合格”的每一个元素声明,声明将elementFormDefault =“合格”指的targetNamespace适用于每个元素,除非把形式=“不合格”的元素声明覆盖。



Answer 2:

请考虑以下的ComplexType 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>

作者的名称属性允许在没有指定命名空间(不合格)。 这是的一部分的任何元素<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>

请参阅此链接查看更多细节



Answer 3:

新的,详细的解答和解释的时候,经常问的问题...

简短的回答 :如果你不添加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本地定义的元素没有命名空间的默认。
    • 这是因为默认值elementFormDefaultunqualified
    • 这可以说是XSD的创作者的设计错误。
    • 标准的做法是始终使用elementFormDefault="qualified" ,这样assignment是在目标命名空间为人们所期望的。

看似有效的XML

该XML看起来应该根据上述XSD是有效的:

<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-复type.2.4.a:无效内容被发现与起始元件 '分配'。 其中一个“{}分配”的预期。

笔记:

  • 你不会是骂这个诊断,这似乎说的内容是无效的,因为它希望找到的第一显像assignment元素,但它实际上找到了一个assignment元素。 (WTF)
  • 这是什么真正含义是:在{}各地assignment意味着验证期待assignment 没有命名空间在这里。 不幸的是,当它说,它发现了一个assignment元素,它并没有提到它发现它在从没有命名空间不同的默认命名空间。

  • 绝大多数时间:添加elementFormDefault="qualified"xsd:schema的XSD元素。 这意味着有效的XML必须放在当XSD局部声明的目标命名空间的元素; 否则,有效的XML必须在本地放置声明中没有命名空间的元素。
  • 的时间极少数:更改XML符合XSD的要求,即assignment在没有命名空间。 这可以实现,例如,通过添加xmlns=""assignment元件。


Answer 4:

重要注意事项,将elementFormDefault需要注意的是,它适用于本地定义的元素,通常命名为一个复杂类型块中的元素,而不是在架构的顶级定义的全局元素。 随着将elementFormDefault =“合格”就可以解决因使用该架构的目标命名空间为文档的默认命名空间中的XML文档中架构中的本地元素。

在实践中,使用将elementFormDefault =“合格”,以便能够在声明嵌套块元素,否则你就必须申报在顶层的所有元素,并使用ref属性是指他们在嵌套元素的模式,造成了更紧凑的架构。

对此,该位在XML模式入门谈到: http://www.w3.org/TR/xmlschema-0/#NS



Answer 5:

将elementFormDefault =“合格”用于控制的命名空间的XML实例文档(.xml文件),而不是命名空间的架构文档本身(.xsd文件)中的使用。

通过指定将elementFormDefault =“合格”我们执行空间声明与此架构验证的文档使用。

通常的做法是可以指定这个值来声明的元素应该是合格,而非不合格。 然而,由于attributeFormDefault =“不合格”是默认值,它不需要架构文档中指定,如果不想要出线的命名空间。



Answer 6:

我已经注意到,XMLSpy的(至少23年版)的需要,如果将elementFormDefault =“合格”是用来定义一个的targetNamespace。 否则将无法验证。 而且也不会产生命名空间前缀个XML



文章来源: What does elementFormDefault do in XSD?