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



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



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




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



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




поэтому из этого определения я бы подумал, что если схема имеет значение 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>
863   6  

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

например: если elementFormDefault является абсолютным -

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

положим ожидать "имя" элементов, которые должны быть в targetnamespace и "страницы" элементов, которые должны быть в нуль-пространство имен.

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

рассмотрим следующий комплексный тип 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 делает, но это можно быстро прояснить с помощью короткого примера...

модернизированная версия ваш отзыв:

<?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>

ключевые моменты:

  • The assignment элемент определяется локально.
  • элементы, локально определенные в XSD, по умолчанию не имеют пространства имен.
    • это потому, что значение по умолчанию для elementFormDefault и 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: cvc-сложный тип.2.4.стало: недопустимый контент найдено начиная с элемента 'назначение'. Один из '{назначение}' является ожидаемый.

Примечания:

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

решение

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.