102

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

所以我找到了一些elementFormDefault值的定义:

限定- 元素和属性位于架构的目标命名空间中

unqualified - 元素和属性没有命名空间

因此,根据该定义,我认为如果将模式设置为合格,那么为什么必须在类型前面加上命名空间?在哪些情况下,您甚至会为此设置一组不合格的?我尝试了谷歌搜索,但我得到的只是几个非常难以理解的 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>
4

6 回答 6

78

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="qualified" .

例如:如果 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" 来覆盖。

于 2009-09-23T00:25:31.683 回答
66

考虑elementAuthorType使用的以下 ComplexTypeauthor

<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>

请参阅链接了解更多详情

于 2014-05-04T05:54:53.820 回答
64

对旧的常见问题的新的、详细的答案和解释......

简短的回答:如果你不添加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 的创建者的设计错误。
    • 标准做法是始终使用elementFormDefault="qualified" ,以便assignment在目标名称空间中,正如人们所期望的那样。
  • 它是声明中很少使用的form属性,为其建立默认值。xs:elementelementFormDefault

看似有效的 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

令人费解的验证错误

尽管看起来有效,但上面的 XML 会产生以下令人困惑的验证错误:

[错误] try.xml:4:23: cvc-complex-type.2.4.a: 发现以元素“assignment”开头的无效内容。需要“{assignment}”之一。

笔记:

  • 您不会是第一个诅咒此诊断的开发人员,该诊断似乎说内容无效,因为它希望找到一个assignment元素,但它实际上找到了一个assignment元素。WTF
  • 这真正意味着什么:{and }aroundassignment意味着验证assignment 在这里没有命名空间。不幸的是,当它说它找到了一个assignment元素时,它并没有提到它在一个不同于没有命名空间的默认命名空间中找到它。

解决方案

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

致谢:感谢Michael Kay对此答案的有用反馈。

于 2017-10-15T18:02:30.180 回答
15

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

在实践中,使用 elementFormDefault="qualified" 能够在嵌套块中声明元素,否则您必须在顶层声明所有元素并使用 ref 属性在嵌套元素的架构中引用它们,从而导致更不紧凑的架构。

XML Schema Primer 中的这一点谈到了它:http ://www.w3.org/TR/xmlschema-0/#NS

于 2011-06-17T15:05:28.927 回答
6

elementFormDefault="qualified" 用于控制 XML 实例文档(.xml 文件)中名称空间的使用,而不是模式文档本身(.xsd 文件)中的名称空间。

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

通常的做法是指定这个值来声明元素应该是合格的而不是不合格的。但是,由于 attributeFormDefault="unqualified" 是默认值,因此如果不想限定名称空间,则不需要在模式文档中指定它。

于 2014-05-04T20:34:37.207 回答
0

我注意到如果使用 elementFormDefault="qualified",XMLSpy(至少 2011 版)需要定义一个 targetNameSpace。否则无法验证。也不会生成带有命名空间前缀的 xml

于 2011-07-22T09:52:52.337 回答