Что делает 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 с префиксами пространства имен