elementFormDefault在XSD中做什么?


88

该怎么elementFormDefault办,何时应使用?

因此,我发现了一些elementFormDefault值的定义:

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

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

因此,从该定义中,我会认为,如果将模式设置为合格,那么为什么必须在类型前面加上名称空间?在这种情况下,您甚至有一套不合格的方案是什么?我尝试了Googling,但我所得到的只是几个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>

Answers:


71

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

这意味着,如果elementFormDefault为“ qualified”或在架构中显式声明为具有form =“ qualified”的元素,则在架构顶部声明的targetNamespace仅适用于架构兼容的XML文档中的元素。 。

例如:如果elementFormDefault不合格-

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

将期望“名称”元素位于targetNamespace中,而“页面”元素位于null名称空间中。

为了节省您必须在每个元素声明上放置form =“ qualified”的情况,声明elementFormDefault =“ qualified”意味着targetNamespace应用于每个元素,除非通过在元素声明上放置form =“ unqualified”来覆盖它。


尽管此答案是针对规范的,但并不能正确解释它。本地定义的元素仍位于targetNamespace中,并且永远不在null命名空间中。elementFormDefault只是一个开关,它指定您是否应该在实例中对名称空间进行限定。
Ihe Onwuka

1
@Ihe,这是不正确的:至少有可能使人们感到困惑。如果本地元素声明不具有形成=元素声明模式组件的合格,则{目标命名空间}属性是“不存在”,这意味着该元件实例的命名空间URI属性还必须是“不存在。
迈克尔凯

@MichaelKay对我来说更令人困惑。问题是示例页面中是否在null命名空间中,因为如果这就是为什么规范不干脆不说set elementFormDefault = unqualified将本地定义的元素放在null命名空间中。就是说页面不应该在实例中被命名空间限定与说页面没有命名空间cos是一样的事情,如果这就是为什么规范不简单地说,为什么带有targetNamespace的模式验证不是在那个名字空间?
Ihe Onwuka

1
它不是“简单地这么说”,因为您是非常非正式地描述它:短语“在null命名空间中放入一个元素”没有使用XSD规范的术语;规范倾向于使用更加谨慎的术语,这通常使它难以阅读,但最终变得更加精确。
Michael Kay

1
就我而言,这是书面上的正确答案。
Michael Kay

60

考虑元素AuthorType使用的以下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>

允许在不指定名称空间的情况下使用作者的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>

请参阅链接以获取更多详细信息


55

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

简短的回答:如果你不添加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,使其如人们期望的那样位于目标名称空间中。
  • 它是为声明建立默认值的很少使用的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
  • 这的真正含义是:{}周围assignment表示assignment 这里没有名称空间时需要进行验证。不幸的是,当它说找到了一个assignment元素时,并没有提到它是在默认命名空间中找到的,该默认命名空间不同于没有命名空间。

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

鸣谢:感谢Michael Kay对这个答案的有用反馈。


12

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

在实践中,使用elementFormDefault =“ qualified”可以在嵌套块中声明元素,否则,您必须在顶层声明所有元素,并使用ref属性在嵌套元素中的架构中引用它们,从而导致紧凑的模式要少得多。

XML Schema Primer中的这一点对此进行了讨论:http : //www.w3.org/TR/xmlschema-0/#NS


稍微澄清最正确的答案。使用elementFormDefault = qualified必须在实例中对名称空间限定本地元素。将其设置为不合格时,您不能在名称空间中对它们进行限定。
Ihe Onwuka

6

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

通过指定elementFormDefault =“ qualified”,我们强制执行命名空间声明,以在通过该架构验证的文档中使用。

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


elementFormDefault仅适用于本地定义的元素。全局元素必须使用命名空间进行限定。
Ihe Onwuka

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.