Що робить elementFormDefault у XSD?


89

Що робить elementFormDefaultі коли його слід використовувати?

Тож я знайшов деякі визначення для elementFormDefaultзначень:

кваліфіковано - елементи та атрибути знаходяться у просторі targetNames схеми

некваліфікований - елементи та атрибути не мають простору імен

Тож із цього визначення я міг би думати, що якщо для схеми встановлено кваліфікацію, то чому ви повинні префіксувати тип до простору імен? І які сценарії, для яких ви б навіть визначили некваліфікований з цього приводу? Я спробував погуглити, але все, що я отримав, - це кілька сторінок 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>

Відповіді:


72

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 є "кваліфікованим", або елемент явно оголошений у схемі як має форму = "кваліфікований" .

Наприклад: Якщо елементFormDefault некваліфікований -

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

очікуватиме, що елементи "name" будуть у просторі targetNames, а "page" - у нульовому просторі імен.

Щоб заощадити вам доводити розміщувати form = "qualified" у кожному оголошенні елемента, зазначення елементаFormDefault = "кваліфікованого" означає, що targetNamespace застосовується до кожного елемента, якщо це не перевизначено шляхом встановлення form = "unqualified" у оголошенні елемента.


Хоча ця відповідь стосується специфікації, вона не правильно її трактує. Локально визначені елементи все ще знаходяться в просторі targetNames і ніколи не знаходяться в просторі імен null. elementFormDefault - це просто перемикач, який вказує, чи слід вам призначити простір імен їх кваліфікацією в екземплярі.
Ihe Onwuka

1
@Ihe, це не правильно: або в будь-якому випадку це може заплутати людей. Якщо локальне оголошення елемента не має форми = кваліфіковано, тоді властивість {target namespace} компонента схеми оголошення елемента "відсутня", а це означає, що властивість URI простору імен екземпляра елемента також повинна бути "відсутньою.
Майкл Кей

@MichaelKay Для мене це ще більше заплутано. Питання полягає в тому, чи знаходиться сторінка прикладу в нульовому просторі імен, тому що якщо це те, чому специфікація просто не говорить параметр elementFormDefault = unqualified поміщає локально визначені елементи у нульовий простір імен. Це означає, що сторінка не повинна бути визначена простором імен в екземплярі, те саме, що сказати, що сторінка знаходиться в просторі імен, тому що саме тому специфікація просто не говорить про це, і чому схема з цільовимНайпростір перевіряє речі, які не є у цьому просторі імен?
Ihe Onwuka

1
Це не "просто говорить", оскільки ви описуєте це дуже неформально: фраза "розміщення елемента в нульовому просторі імен" не використовує термінологію специфікації XSD; специфікація воліє використовувати набагато обережнішу термінологію, що часто ускладнює читання, але в підсумку стає набагато точнішим.
Майкл Кей

1
Що стосується мене, це правильна відповідь, написана.
Майкл Кей

60

Розглянемо наступний 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>

будь ласка, зверніться за цим посиланням для отримання детальної інформації


55

Нова, детальна відповідь та пояснення до старого, часто задаваного питання ...

Коротка відповідь : Якщо ви не додасте 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знаходитись у цільовому просторі імен, як і слід було очікувати.
  • Це рідко використовуваний 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 )
  • Що це насправді означає: " {and" }навколо assignmentозначає, що перевірки очікувалося assignment в жодному просторі імен тут. На жаль, коли він каже, що знайшов assignmentелемент, він не згадує, що знайшов його у просторі імен за замовчуванням, який відрізняється від простору імен.

Рішення

  • Переважна більшість випадків: додайте elementFormDefault="qualified"до xsd:schemaелемента XSD. Це означає, що дійсний XML повинен розміщувати елементи в цільовому просторі імен, коли локально оголошено в XSD; в іншому випадку, дійсний XML повинен розміщувати локально оголошені елементи в просторі імен.
  • Крихітна незначна частина часу: Змініть XML на відповідність вимогам XSD, які не assignmentповинні бути в просторі імен. Цього можна досягти, наприклад, додаванням xmlns=""до assignmentелемента.

Подяки: Дякуємо Майклу Кей за корисний відгук щодо цієї відповіді.


12

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

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

Про це розповідає цей біт у букварі схеми XML: http://www.w3.org/TR/xmlschema-0/#NS


Невелике роз’яснення щодо того, що виглядає як найбільш точна відповідь. За допомогою елементуFormDefault = кваліфікованого ви повинні простору імен кваліфікувати локальні елементи в інстанції. Якщо він встановлений як некваліфікований, ви не повинні кваліфікувати простір імен.
Ihe Onwuka

6

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

Вказуючи elementFormDefault = "кваліфікований", ми застосовуємо декларацію простору імен для використання в документах, перевірених за допомогою цієї схеми.

Загальноприйнятою практикою є зазначення цього значення, щоб заявити, що елементи повинні бути кваліфікованими, а не некваліфікованими. Однак, оскільки attributeFormDefault = "некваліфікований" є значенням за замовчуванням, його не потрібно вказувати в документі схеми, якщо він не хоче кваліфікувати простори імен.


elementFormDefault застосовується лише до локально визначених елементів. Глобальні елементи мають бути кваліфікованими для простору імен незалежно.
Ihe Onwuka

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.