Apa yang dilakukan elementFormDefault di XSD?

92

Apa elementFormDefault , dan kapan harus digunakan?

Jadi saya menemukan beberapa definisi untuk elementFormDefaultnilai:

memenuhi syarat - elemen dan atribut ada di targetNamespace skema

unqualified - elemen dan atribut tidak memiliki namespace

Jadi dari definisi itu saya akan berpikir bahwa jika skema diatur ke kualifikasi lalu mengapa Anda harus mengawali tipe dengan namespace? Dan skenario apa yang bahkan Anda setel ke tidak memenuhi syarat dalam hal ini? Saya mencoba Googling, tetapi yang saya dapatkan hanyalah beberapa halaman W3C yang sangat sulit dimengerti.

Ini adalah file yang saya kerjakan sekarang, mengapa saya perlu mendeklarasikan tipe seperti target:TypeAssignmentsketika saya mendeklarasikan targetNamespacesama dengan 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>
Levi
sumber

Jawaban:

73

ElementFormDefault tidak ada hubungannya dengan namespace dari tipe dalam skema, ini tentang ruang nama elemen dalam dokumen XML yang sesuai dengan skema.

Inilah bagian yang relevan dari spesifikasi:

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

Artinya, targetNamespace yang Anda nyatakan di bagian atas skema hanya berlaku untuk elemen dalam dokumen XML yang sesuai dengan skema jika salah satu elemenFormDefault "memenuhi syarat" atau elemen dinyatakan secara eksplisit dalam skema sebagai memiliki form = "memenuhi syarat" .

Misalnya: Jika elementFormDefault tidak memenuhi syarat -

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

akan mengharapkan elemen "name" berada di targetNamespace dan elemen "page" berada di namespace null.

Untuk menyelamatkan Anda dari keharusan untuk meletakkan form = "qualified" pada setiap deklarasi elemen, menyatakan elementFormDefault = "qualified" berarti targetNamespace berlaku untuk setiap elemen kecuali diganti dengan meletakkan form = "unqualified" pada deklarasi elemen.

Alohci
sumber
Meskipun jawaban ini mengacu pada spesifikasi, itu tidak menafsirkannya dengan benar. Elemen yang ditentukan secara lokal masih ada di targetNamespace dan tidak pernah ada di namespace null. elementFormDefault hanyalah sebuah sakelar yang menentukan apakah Anda seharusnya memenuhi syarat namespace mereka dalam sebuah instance atau tidak.
Ihe Onwuka
1
@Ihe, itu tidak benar: atau bagaimanapun juga, itu dapat membingungkan orang. Jika deklarasi elemen lokal tidak memiliki form = qualifikasi, maka properti {target namespace} dari komponen skema deklarasi elemen adalah "absent", dan itu berarti properti URI namespace dari instance elemen juga harus "tidak ada.
Michael Kay
@MichaelKay Bagi saya itu bahkan lebih membingungkan. Pertanyaannya adalah apakah di halaman contoh berada di namespace null, karena jika itu mengapa spesifikasi tidak mengatakan pengaturan elementFormDefault = unqualified menempatkan elemen yang ditentukan secara lokal di namespace null. Mengatakan bahwa halaman seharusnya tidak memenuhi syarat namespace dalam sebuah contoh, hal yang sama seperti mengatakan halaman tidak dalam namespace karena jika itu mengapa spesifikasi tidak mengatakan itu dan mengapa skema dengan targetNamespace memvalidasi hal-hal yang tidak di namespace itu?
Ihe Onwuka
1
Ini tidak "hanya mengatakan itu" karena Anda mendeskripsikannya dengan sangat informal: frasa "meletakkan elemen di namespace null" tidak menggunakan terminologi spesifikasi XSD; spek lebih suka menggunakan terminologi yang jauh lebih hati-hati, yang seringkali membuat sulit untuk dibaca tetapi akhirnya menjadi jauh lebih tepat.
Michael Kay
1
Sejauh yang saya ketahui, itu jawaban yang benar seperti yang tertulis.
Michael Kay
61

Pertimbangkan ComplexType berikut yang AuthorTypedigunakan oleh authorelemen

<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"/>

Jika elementFormDefault="unqualified"

maka Instance XML berikut ini valid

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

atribut nama pengarang diperbolehkan tanpa menentukan namespace (tidak memenuhi syarat). Setiap elemen yang merupakan bagian dari <xsd:complexType>dianggap sebagai lokal untuk complexType.

jika elementFormDefault="qualified"

maka instance tersebut harus memiliki elemen lokal yang memenuhi syarat

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

silakan lihat tautan ini untuk lebih jelasnya

Girish
sumber
56

Jawaban dan penjelasan baru dan mendetail untuk pertanyaan lama yang sering ditanyakan ...

Jawaban singkat : Jika Anda tidak menambahkan elementFormDefault="qualified"ke xsd:schema, maka nilai defaultnya unqualifiedberarti bahwa elemen yang dideklarasikan secara lokal tidak ada dalam namespace .

Ada banyak kebingungan tentang apa elementFormDefault itu, tetapi ini dapat dengan cepat diklarifikasi dengan contoh singkat ...

Versi sederhana XSD Anda:

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

Poin utama:

  • Itu assignment elemen lokal didefinisikan.
  • Elemen yang ditentukan secara lokal di XSD tidak ada dalam namespace secara default.
    • Ini karena nilai default untuk elementFormDefault adalah unqualified.
    • Ini bisa dibilang adalah kesalahan desain oleh pencipta XSD.
    • Praktik standar adalah selalu menggunakan elementFormDefault="qualified" sehingga assignmentada di namespace target seperti yang diharapkan.
  • Ini adalah formatribut yang jarang digunakan pada xs:elementdeklarasi yang elementFormDefaultmenetapkan nilai default.

XML Tampak Valid

XML ini sepertinya harus valid sesuai dengan XSD di atas:

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

Memperhatikan:

  • Namespace default di assignmentstempat assignmentsdan semua turunannya di namespace default ( http://www.levijackson.net/web340/ns).

Kesalahan Validasi yang Membingungkan

Meskipun terlihat valid, XML di atas menghasilkan kesalahan validasi yang membingungkan berikut:

[Error] try.xml: 4: 23: cvc-complex-type.2.4.a: Ditemukan konten yang tidak valid dimulai dengan elemen 'assignment'. Salah satu dari '{assignment}' diharapkan.

Catatan:

  • Anda bukan pengembang pertama yang mengutuk diagnostik ini yang tampaknya mengatakan bahwa konten tidak valid karena diharapkan menemukan assignmentelemen tetapi sebenarnya menemukan assignmentelemen. ( WTF )
  • Artinya: The {and }around assignmentberarti validasi tidak diharapkan assignment di namespace di sini. Sayangnya, ketika dikatakan bahwa ia menemukan sebuah assignmentelemen, ia tidak menyebutkan bahwa ia menemukannya di namespace default yang berbeda dari tidak ada namespace.

Larutan

  • Sebagian besar waktu: Tambahkan elementFormDefault="qualified"ke xsd:schemaelemen XSD. Ini berarti XML yang valid harus menempatkan elemen di namespace target ketika dideklarasikan secara lokal di XSD; jika tidak, XML yang valid harus menempatkan elemen yang dideklarasikan secara lokal tanpa namespace.
  • Minoritas kecil waktu: Ubah XML untuk memenuhi persyaratan XSD yang assignmenttidak ada di namespace. Hal ini dapat dicapai, misalnya, dengan menambahkan xmlns=""ke assignmentelemen.

Penghargaan: Terima kasih kepada Michael Kay atas umpan balik yang membantu tentang jawaban ini.

kjhughes
sumber
12

Penting untuk diperhatikan dengan elementFormDefault adalah bahwa ini berlaku untuk elemen yang ditentukan secara lokal , biasanya bernama elemen di dalam blok complexType, sebagai lawan dari elemen global yang ditentukan di tingkat atas skema. Dengan elementFormDefault = "kualifikasi" Anda dapat menangani elemen lokal dalam skema dari dalam dokumen xml menggunakan ruang nama target skema sebagai ruang nama default dokumen.

Dalam praktiknya, gunakan elementFormDefault = "kualifikasi" untuk dapat mendeklarasikan elemen dalam blok bersarang, jika tidak, Anda harus mendeklarasikan semua elemen di tingkat atas dan merujuknya ke skema dalam elemen bertingkat menggunakan atribut ref, menghasilkan skema yang jauh lebih kompak.

Bit dalam XML Schema Primer ini membahasnya: http://www.w3.org/TR/xmlschema-0/#NS

stephan f
sumber
Klarifikasi singkat tentang apa yang tampak seperti jawaban paling akurat. Dengan elementFormDefault = kualifikasi Anda harus memenuhi syarat namespace elemen lokal di intance. Dengan itu disetel ke tidak memenuhi syarat Anda tidak boleh membuat namespace memenuhi syarat mereka.
Ihe Onwuka
6

elementFormDefault = "memenuhi syarat" digunakan untuk mengontrol penggunaan ruang nama dalam dokumen contoh XML (file .xml), bukan ruang nama dalam dokumen skema itu sendiri (file .xsd).

Dengan menentukan elementFormDefault = "kualifikasi" kami memberlakukan deklarasi ruang nama untuk digunakan dalam dokumen yang divalidasi dengan skema ini.

Merupakan praktik umum untuk menentukan nilai ini untuk menyatakan bahwa elemen harus memenuhi syarat daripada tidak memenuhi syarat. Namun, karena atributFormDefault = "unqualified" adalah nilai default, ini tidak perlu ditentukan dalam dokumen skema, jika tidak ingin memenuhi syarat ruang nama.

Feri
sumber
elementFormDefault hanya berlaku untuk elemen yang ditentukan secara lokal. Elemen global harus memiliki spasi nama yang memenuhi syarat.
Ihe Onwuka
0

Saya telah memperhatikan bahwa XMLSpy (setidaknya versi 2011) membutuhkan targetNameSpace yang ditentukan jika elementFormDefault = "memenuhi syarat" digunakan. Jika tidak, tidak akan memvalidasi. Dan juga tidak akan menghasilkan xml dengan awalan namespace

Neal
sumber