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

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

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

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

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

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

person Levi    schedule 22.09.2009    source источник


Ответы (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 = «квалифицированный». .

Например: Если elementFormDefault неквалифицирован -

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

будет ожидать, что элементы «name» будут в targetNamespace, а элементы «page» будут в пустом пространстве имен.

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

person Alohci    schedule 23.09.2009
comment
Хотя этот ответ относится к спецификации, он не интерпретирует его правильно. Локально определенные элементы все еще находятся в targetNamespace и никогда не находятся в пустом пространстве имен. elementFormDefault - это просто переключатель, который указывает, должно ли пространство имен квалифицировать их в экземпляре. - person Ihe Onwuka; 14.09.2020
comment
@Ihe, это неправильно: во всяком случае, это может сбивать людей с толку. Если объявление локального элемента не имеет form = квалифицированный, тогда свойство {target namespace} компонента схемы объявления элемента отсутствует, и это означает, что свойство URI пространства имен экземпляра элемента также должно отсутствовать. - person Michael Kay; 14.09.2020
comment
@MichaelKay Меня это еще больше сбивает с толку. Вопрос в том, находится ли страница в примере в пустом пространстве имен, потому что если это именно то, почему в спецификации просто не сказано, что установка elementFormDefault = unqualified помещает локально определенные элементы в пустое пространство имен. Говорит, что страница не должна быть квалифицирована в пространстве имен в экземпляре, то же самое, что сказать, что страница не находится в пространстве имен, потому что, если это то, почему в спецификации просто не говорится об этом, и почему схема с targetNamespace проверяет то, что не в этом пространстве имен? - person Ihe Onwuka; 15.09.2020
comment
Также @MichaelKay, как отличить неквалифицированный элемент страницы от другого словаря XML, появляющегося в том же документе, если они оба находятся в пустом пространстве имен или без него. - person Ihe Onwuka; 15.09.2020
comment
Он не просто говорит об этом, потому что вы описываете это очень неформально: фраза, помещающая элемент в пустое пространство имен, не использует терминологию спецификации XSD; спецификация предпочитает использовать более осторожную терминологию, которая часто затрудняет чтение, но в итоге оказывается намного более точной. - person Michael Kay; 15.09.2020
comment
@MichaelKay В ответе, который мы комментируем, говорится, что элементы имени будут находиться в targetNamespace, а элементы страницы - в пустом пространстве имен. Таким образом, неофициальное описание, о котором вы говорите, происходит из ответа, а не из моего комментария, и это то, с чем у моего комментария есть проблемы. - person Ihe Onwuka; 15.09.2020
comment
Насколько я понимаю, это правильный ответ, как написано. - person Michael Kay; 15.09.2020
comment
Я не понимаю, что вы объяснили. Но это нормально. - person Ihe Onwuka; 15.09.2020

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

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

if elementFormDefault="qualified"

тогда экземпляр должен иметь квалифицированные локальные элементы

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

см. эту ссылку для получения дополнительных сведений.

person Girish    schedule 04.05.2014
comment
Ммм ..._ 1_ - это элемент, а не атрибут. - person Suncat2000; 04.02.2021

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

Краткий ответ: если вы не добавляете 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 определяется локально.
  • Elements locally defined in XSD are in no namespace by default.
    • This is because the default value for elementFormDefault is unqualified.
    • Возможно, это ошибка в дизайне создателей XSD.
    • Стандартная практика - всегда использовать elementFormDefault="qualified", чтобы assignment находился в целевом пространстве имен, как и следовало ожидать.
  • Это редко используемый атрибут form в xs:element объявлениях, для которых elementFormDefault устанавливает значения по умолчанию.

На первый взгляд действительный 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. (WTF )
  • Что это на самом деле означает: { и } вокруг assignment означают, что здесь ожидалась проверка assignment без пространства имен. К сожалению, когда он говорит, что нашел элемент assignment, он не упоминает, что он нашел его в пространстве имен по умолчанию, которое отличается от отсутствия пространства имен.

Решение

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

Благодарности: Спасибо Майклу Кею за полезный отзыв об этом ответе. < / sub>

person kjhughes    schedule 15.10.2017

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

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

Об этом говорится в этом разделе XML Schema Primer: http://www.w3.org/TR/xmlschema-0/#NS

person stephan f    schedule 17.06.2011
comment
Небольшое уточнение наиболее точного ответа. С elementFormDefault = квалифицированным вы должны указать пространство имен локальных элементов в intance. Если для него установлено значение unqualified, вы не должны квалифицировать их в пространстве имен. - person Ihe Onwuka; 14.09.2020

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

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

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

person Feri    schedule 04.05.2014
comment
elementFormDefault применяется только к локально определенным элементам. В любом случае глобальные элементы должны быть квалифицированы в пространстве имен. - person Ihe Onwuka; 14.09.2020

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

person Neal    schedule 22.07.2011