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

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

Итак, я нашел некоторые определения для значений elementFormDefault:

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

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

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

Ответ 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>

будет помещать элементы "name" в объекты targetNamespace и "page", чтобы они находились в нулевом пространстве имен.

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

Ответ 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>

обратитесь к этой для получения более подробной информации

Ответ 3

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

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

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

Ответ 4

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

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

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

Ответ 5

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

Короткий ответ. Если вы не добавляете 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 находится в целевом пространстве имен, как и ожидать.

Похоже, Valid 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-complex-type.2.4.a: Недопустимый контент был найденный начиная с элемента "присвоение". Одним из "{присвоений" является ожидается.

Примечания:

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

Решение

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

Ответ 6

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