这是什么 elementFormDefault 这样做,以及时应该使用?

所以我发现了一些定义 elementFormDefault 值:

合格 元素和属性 在目标名称空间的 架构

不合格 -要素, 属性没有一个名字空间

因此,从这一定义,我将认为,如果一个模式是设定为合格的,那么为什么你必须前缀的类型与空间?和什么情况,你甚至会有一个设定为不合格对于这个问题?我试图搜索,但是我所得到的是一对夫妇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>
有帮助吗?

解决方案

户没有名字空间的类型架构,它是关于命名空间的元素在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·.

这意味着该目标名称空间,你已经宣布的顶级架构仅适用于元素中的模式符合XML文件如果户是"资格"或元件的声明的明确模式中为有形式="合格".

例如:如果户是不合格-

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

将把期望"名"的要素的目标名称空间和"网页"要素中的空命名空间。

保存你具有把形式="合格"上的每一个元素的宣言,指出户="合格"的装置,该目标名称空间适用于每一个元件,除非复盖通过放形式="不合格"的元素的宣言》。

其他提示

考虑一下的 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> 都被认为是本来的.

如果 elementFormDefault="qualified"

随后的实例应有的当地合格的元素

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

请参阅 链接的更多详细信息

新的、详细的回答和解释以一个古老的,经常询问的问题...

简短的回答:如果你不加入 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 元件的局部定义。
  • 元素的当地规定在文件是在没有名字空间的默认。
    • 这是因为默认值 elementFormDefaultunqualified.
    • 这可以说是设计错误的创作者的文件.
    • 标准实践是随时使用 elementFormDefault="qualified" 这样, assignment 在目标的名字空间作为一个会 期望。

似乎有效的XML

这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 及其所有后裔在默认namespace(http://www.levijackson.net/web340/ns).

令人费解的验证错误

尽管在寻找有效的,上述XML产生的下述令人困惑验证的错误:

[错误]尝试。xml:4:23:中心复杂的类型。2.4.a:无效的内容是 找到开始元'转让'.其中一个{的分配}'是 预期。

注:

  • 你不会是第一个开发商要诅咒这个诊断,似乎是说, 内容是无效的,因为它预期找到一个 assignment 元素,但它实际上发现一个 assignment 元素。 (WTF)
  • 这到底是什么意思:的 {} 周围 assignment 意味着验证的期待 assignment 在没有名字空间 在这里。不幸的是,当它表示,它发现一个 assignment 元素,它没有提到它发现它在一种默认的名字空间而不同于从没有命名空间。

解决方案

  • 绝大多数的时间: 添加 elementFormDefault="qualified" 来的 xsd:schema 元的的文件.这意味着有效的XML必须把元素的目标的名字空间,当本地宣布在文件;否则,有效的XML必须把在本地宣布元素在没有名字空间。
  • 小小的少数群体的时间: 变化的XML遵守划的 要求 assignment 在没有名字空间。这是可以实现的, 例如,通过加入 xmlns="" 来的 assignment 元素。

重要的是要注意的用户是,它适用于 在本地 定义的要素,通常叫元内的一块,对全球单元定义上的顶级架构。用户="合格"你可以解决当地的元素中的模式,从在xml文件使用模式的目标的名字空间作为该文件的默认的名称空间。

在实践中,使用户="合格",以便能够宣布元中嵌套块,否则,你将不得不宣布的所有要素上顶的水平和参考架构中的嵌套要素使用ref属性,导致在一个更紧凑的模式。

这一点在XML模式引谈判: http://www.w3.org/TR/xmlschema-0/#NS

户="合格"是用于控制使用的命名空XML实例的文件(.xml文件),而不是名字空间架构中的文件本身(.划的文件)。

通过指定户="合格"我们执行namespace宣言》中使用的文件,验证这个架构。

它是常见的做法来指定这种价值的声明,该要素应是合格的,而不是无条件的。然而,由于attributeFormDefault="不合格"是默认值,它不需要被指定的架构中的文件,如果一个人不要资格的名字空间。

我们注意到,XMLSpy(至少2011年版)需要一个目标名称空间定义,如果户="合格"的使用。否则不会验证。也不会产生xml有名字空间的前缀

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top