Что делает elementFormDefault в XSD?

что значит elementFormDefault do, и когда он должен использоваться?

поэтому я нашел некоторые определения для elementFormDefault значения:

квалификации - элементы и атрибуты находятся в targetNamespace схема

неквалифицированные - элементы и атрибуты не имеют пространства имен

поэтому из этого определения я бы подумал, что если схема установлена в qualified, то почему вы должны префикс типа с пространством имен? И каковы сценарии, которые вы даже установили бы для неквалифицированного, если на то пошло? Я попробовал погуглить, но все, что я получил, это пару страниц 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>

6 ответов


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 "квалифицирован" или элемент объявлено явно в схеме как имеющее 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" в объявлении элемента.


рассмотрим следующий 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>

см. этой ссылка для более подробной информации


новый, подробный ответ и объяснение на старый, часто задаваемый вопрос...

короткий ответ:: если вы не добавите elementFormDefault="qualified" to 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 элемент определяется локально.
  • элементы, локально определенные в XSD, по умолчанию не находятся в пространстве имен.
    • это потому, что значение по умолчанию для elementFormDefault is unqualified.
    • это, возможно, ошибка дизайна создателями 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 дает следующую ошибку запутанной проверки:

[ошибка] попробовать.XML-кода:4:23: вах-сложного-типа.2.4.a: недопустимое содержимое начиная с назначения элемента''. Один из " {назначение}" ожидаемый.

Примечания:

  • вы не будете первым разработчиком, чтобы проклясть эту диагностику, которая, кажется, говорит, что содержимое недопустимо, потому что оно ожидало найти assignment элемент, но это на самом деле нашел assignment элемент. (WTF)
  • что это на самом деле означает:{ и } вокруг assignment означает, что проверка ожидал assignment в пространстве имен здесь. К сожалению, когда он говорит, что он нашел assignment элемент, он не упоминает, что он нашел его в пространстве имен по умолчанию, которое отличается от пространства имен.

решение

  • подавляющее в большинстве случаев: добавить elementFormDefault="qualified" до xsd:schema элемент XSD. Это означает, что допустимый XML должен размещать элементы в целевом пространстве имен при локальном объявлении в XSD; в противном случае допустимый XML должен размещать локально объявленные элементы в пространстве имен.
  • крошечное меньшинство времени: измените XML в соответствии с XSD требование assignment в пространстве имен. Это может быть достигнуто, например, добавив xmlns="" до assignment элемент.

важно отметить, что elementFormDefault относится к локально определенные элементы, обычно именованные элементы внутри блока complexType, в отличие от глобальных элементов, определенных на верхнем уровне схемы. С помощью elementFormDefault= "qualified" вы можете обращаться к локальным элементам схемы из xml-документа, используя целевое пространство имен схемы в качестве пространства имен по умолчанию документа.

на практике используйте elementFormDefault= "квалифицированный", чтобы иметь возможность чтобы объявить элементы во вложенных блоках, в противном случае вам придется объявить все элементы на верхнем уровне и ссылаться на них в схеме во вложенных элементах с помощью атрибута ref, что приведет к гораздо менее компактной схеме.

этот бит в XML-схеме Primer говорит об этом:http://www.w3.org/TR/xmlschema-0/#NS


elementFormDefault= "qualified" используется для управления использованием пространств имен в документах экземпляра XML (.xml-файл), а не пространства имен в самом документе схемы (.XSD-файл.)

указав elementFormDefault= "qualified", мы применяем объявление пространства имен для использования в документах, проверенных с помощью этой схемы.

обычно указывается это значение, чтобы объявить, что элементы должны быть квалифицированы, а не неквалифицированы. Однако, поскольку attributeFormDefault= "unqualified" - это значение по умолчанию, его не нужно указывать в документе схемы, если не требуется квалифицировать пространства имен.


Я заметил, что XMLSpy (по крайней мере, версия 2011)нуждается в targetNameSpace, определенном, если используется elementFormDefault="qualified". В противном случае не будет проверять. А также не будет генерировать xmls с префиксами пространства имен