Что делает elementFormDefault
и когда нужно использовать?
Итак, я нашел несколько определений для elementFormDefault
значений:
квалифицированный - элементы и атрибуты находятся в targetNamespace схемы
unqualified - элементы и атрибуты не имеют пространства имен
Итак, исходя из этого определения, я мог бы подумать, что если схема настроена как квалифицированная, то почему вы должны префикс типа с пространством имен? И каковы сценарии, при которых у вас даже был бы один набор неквалифицированных в этом отношении? Я пробовал поискать в 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>
Рассмотрим следующий 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"
к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
Элемент локально определен.elementFormDefault
являетсяunqualified
.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 выглядит корректным, он дает следующую сбивающую с толку ошибку проверки:
Примечания:
assignment
элемент, но на самом деле нашелassignment
элемент. ( WTF ){
и}
вокругassignment
означает, что здесь не ожидалось проверкиassignment
в пространстве имен . К сожалению, когда он говорит, что нашелassignment
элемент, он не упоминает, что нашел его в пространстве имен по умолчанию, которое отличается от пространства имен no.Решение
elementFormDefault="qualified"
кxsd:schema
элементу XSD. Это означает, что действительный XML должен помещать элементы в целевое пространство имен при локальном объявлении в XSD; в противном случае действительный XML не должен помещать локально объявленные элементы в пространство имен.assignment
должны находиться в пространстве имен. Этого можно добиться, например, добавивxmlns=""
кassignment
элементу.Кредиты: Спасибо Майклу Кею за полезный отзыв на этот ответ.
источник
Важно отметить, что elementFormDefault применяется к локально определенным элементам, обычно именованным элементам внутри блока complexType, в отличие от глобальных элементов, определенных на верхнем уровне схемы. С elementFormDefault = "квалифицированный" вы можете адресовать локальные элементы в схеме изнутри XML-документа, используя целевое пространство имен схемы в качестве пространства имен документа по умолчанию.
На практике используйте elementFormDefault = "квалифицированный", чтобы иметь возможность объявлять элементы во вложенных блоках, в противном случае вам придется объявить все элементы на верхнем уровне и ссылаться на них в схеме во вложенных элементах с помощью атрибута ref, что приведет к гораздо менее компактная схема.
Об этом говорится в этом фрагменте XML Schema Primer: http://www.w3.org/TR/xmlschema-0/#NS
источник
elementFormDefault = "квалифицированный" используется для управления использованием пространств имен в документах экземпляров XML (файл .xml), а не пространства имен в самом документе схемы (файл .xsd).
Указав elementFormDefault = "квалифицированный", мы принудительно используем объявление пространства имен в документах, проверенных с помощью этой схемы.
Это обычная практика указывать это значение, чтобы объявить, что элементы должны быть квалифицированными, а не неквалифицированными. Однако, поскольку attributeFormDefault = "unqualified" является значением по умолчанию, его не нужно указывать в документе схемы, если не требуется уточнять пространства имен.
источник
Я заметил, что XMLSpy (по крайней мере версия 2011 года) требует определенного targetNameSpace, если используется elementFormDefault = "qualified". В противном случае не будет подтверждено. А также не будет генерировать xmls с префиксами пространства имен
источник