ElementFormDefault XSD'de ne yapar?


92

Ne elementFormDefaultişe yarar ve ne zaman kullanılmalıdır?

Bu yüzden elementFormDefaultdeğerler için bazı tanımlar buldum :

nitelikli - öğeler ve öznitelikler şemanın targetNamespace içindedir

nitelenmemiş - öğeler ve özniteliklerin bir ad alanı yoktur

Bu tanımdan yola çıkarak, eğer bir şema nitelikli olarak ayarlanmışsa, o zaman neden tipin önüne ad alanı eklemelisiniz? Ve bu konuda niteliksiz olarak ayarlayacağınız senaryolar nelerdir? Googling'i denedim, ancak elime geçen tek şey anlaşılması çok zor olan birkaç W3C sayfasıydı.

Ben türü bildirmek gerekiyor olarak nedeni budur, şu an ile çalışıyorum dosyasıdır target:TypeAssignmentsben bildirirken targetNamespaceaynı biri olarak 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>

Yanıtlar:


73

ElementFormDefault'un şemadaki türlerin ad alanlarıyla ilgisi yoktur, XML belgelerindeki öğelerin şemaya uygun ad alanları ile ilgilidir.

Spesifikasyonun ilgili bölümü şöyledir:

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

Bunun anlamı, şemanın en üstünde bildirdiğiniz targetNamespace, yalnızca elementFormDefault "nitelikli" ise veya öğenin şemada form = "nitelikli" olarak açıkça bildirilmesi durumunda şema uyumlu XML belgesindeki öğeler için geçerli olmasıdır. .

Örneğin: elementFormDefault nitelenmemişse -

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

"name" öğelerinin targetNamespace'de olmasını ve "page" öğelerinin boş ad alanında olmasını bekler.

Sizi her öğe bildirimine form = "nitelikli" koymak zorunda kalmamak için, elementFormDefault = "nitelenmiş" belirtilmesi, öğe bildirimine form = "unqualified" koyarak geçersiz kılınmadıkça targetNamespace'in her öğe için geçerli olduğu anlamına gelir.


Bu cevap spesifikasyona atıfta bulunmasına rağmen, onu doğru yorumlamaz. Yerel olarak tanımlanan öğeler hala targetNamespace içindedir ve hiçbir zaman boş ad alanında değildir. elementFormDefault, ad alanının onları bir örnekte nitelemeniz gerekip gerekmediğini belirten bir anahtardır.
Ihe Onwuka

1
@Ihe, bu doğru değil: ya da en azından insanların kafasını karıştırabilir. Yerel bir öğe bildiriminde form = nitelikli yoksa, öğe bildirim şeması bileşeninin {target namespace} özelliği "eksiktir" ve bu, öğe örneğinin ad alanı URI özelliğinin de "eksik olması gerektiği anlamına gelir.
Michael Kay

@MichaelKay Bana göre bu daha da kafa karıştırıcı. Soru, örnek sayfadaki boş ad alanında olup olmadığıdır, çünkü bu durumda spesifikasyon, neden elementFormDefault = unqualified ayarının yerel olarak tanımlanmış öğeleri boş ad alanına koyduğunu söylemiyor. Sayfanın bir örnekte ad alanı niteliği taşımaması gerektiğini söylemek, sayfanın isim alanında olmadığını söylemekle aynı şeydir, çünkü bu, neden spesifikasyon bunu söylemiyor ve neden olmayan şeyleri doğrulayan bir targetNamespace şema bu ad alanında?
Ihe Onwuka

1
Bunu "basitçe söylemez" çünkü onu gayri resmi bir şekilde tanımlıyorsunuz: "boş isim alanına bir eleman koymak" ifadesi XSD belirtiminin terminolojisini kullanmıyor; şartname çok daha dikkatli bir terminoloji kullanmayı tercih ediyor, bu da genellikle okumayı zorlaştırıyor, ancak çok daha kesin sonuç veriyor.
Michael Kay

1
Bana kalırsa, bu yazıldığı gibi doğru bir cevap.
Michael Kay

61

Aşağıdaki complexType düşünün AuthorTypekullandığı authoreleman

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

Eğer elementFormDefault="unqualified"

ardından aşağıdaki XML Örneği geçerlidir

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

yazarların isim özniteliğine isim alanı belirtilmeden izin verilir (niteliksiz). Bir parçası olan tüm öğeler <xsd:complexType>, yerelden complexType'a kadar kabul edilir.

Eğer elementFormDefault="qualified"

bu durumda örnek, nitelikli yerel öğelere sahip olmalıdır

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

daha fazla ayrıntı için lütfen bu bağlantıya bakın


56

Eski, sık sorulan bir soruya yeni, ayrıntılı cevap ve açıklama ...

Kısa cevap : Eklemek yoksa elementFormDefault="qualified"üzere xsd:schema, varsayılan unqualifiedyerel olarak ilan elemanları olan değer araçlarının hiçbir ad .

Ne elementFormDefaultolduğu konusunda çok fazla kafa karışıklığı var, ancak bu kısa bir örnekle hızlıca açıklığa kavuşturulabilir ...

XSD'nizin geliştirilmiş versiyonu:

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

Anahtar noktaları:

  • assignmentEleman lokal olarak tanımlanır.
  • XSD'de yerel olarak tanımlanan öğeler varsayılan olarak hiçbir ad alanında değildir.
    • Bunun nedeni, varsayılan değerinin elementFormDefaultolmasıdır unqualified.
    • Bu muhtemelen XSD'nin yaratıcıları tarafından yapılan bir tasarım hatasıdır.
    • Standart uygulama daima kullanmaktır elementFormDefault="qualified" böylece assignmentbir beklendiği gibi hedef ad alanında olduğunu.
  • Varsayılan değerleri belirleyen bildirimlerde nadiren kullanılan bir formözniteliktir .xs:elementelementFormDefault

Görünüşte Geçerli XML

Bu XML, yukarıdaki XSD'ye göre geçerli olması gerektiği gibi görünüyor:

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

Farkına varmak:

  • Varsayılan ad assignmentsyerlerde assignmentsvarsayılan ad ve çocuklarının tüm ( http://www.levijackson.net/web340/ns).

Şaşırtıcı Doğrulama Hatası

Geçerli görünmesine rağmen, yukarıdaki XML aşağıdaki kafa karıştırıcı doğrulama hatasını verir:

[Hata] try.xml: 4: 23: cvc-complex-type.2.4.a: 'assignment' öğesinden başlayarak geçersiz içerik bulundu. "{Atama}" dan biri bekleniyor.

Notlar:

  • Bir assignmentöğe bulması beklendiği için içeriğin geçersizassignment olduğunu , ancak aslında bir öğe bulduğunu söyleyen bu teşhisi lanetleyen ilk geliştirici olmayacaksınız . ( WTF )
  • Bu gerçekte ne anlama geliyor: {ve }etrafı assignment, burada assignment hiçbir ad alanında doğrulama beklemediği anlamına gelir . Ne yazık ki, bir assignmentöğe bulduğunu söylediğinde, onu hiçbir ad alanından farklı bir varsayılan ad alanında bulduğundan bahsetmiyor.

Çözüm

  • Zaman büyük çoğunluğu: Ekleme elementFormDefault="qualified"için xsd:schemaXSD'nin elemanı. Bu, geçerli XML'in, XSD'de yerel olarak bildirildiğinde öğeleri hedef ad alanına yerleştirmesi gerektiği anlamına gelir; aksi takdirde, geçerli XML yerel olarak bildirilmiş öğeleri hiçbir ad alanına yerleştirmemelidir.
  • Zamanın çok küçük bir kısmı: XML'yi XSD'nin assignmenthiçbir ad alanı olmayan gereksinimine uyacak şekilde değiştirin . Bu ilave edilerek, örneğin, elde edilebilir xmlns=""için assignmenteleman.

Kredi: Bu yanıtla ilgili faydalı geri bildirimler için Michael Kay'a teşekkürler .


12

ElementFormDefault ile dikkat edilmesi gereken önemli husus , şemanın en üst seviyesinde tanımlanan global öğelerin aksine, yerel olarak tanımlanmış öğeler, tipik olarak bir complexType bloğu içinde adlandırılan öğeler için geçerli olmasıdır . ElementFormDefault = "nitelikli" ile, şemadaki yerel öğeleri, belgenin varsayılan ad alanı olarak şemanın hedef ad alanını kullanarak xml belgesinden adresleyebilirsiniz.

Pratikte, iç içe bloklardaki öğeleri bildirebilmek için elementFormDefault = "nitelikli" kullanın, aksi takdirde en üst düzeydeki tüm öğeleri bildirmeniz ve bunlara ref özniteliğini kullanarak iç içe öğelerdeki şemada bunlara başvurmanız gerekir. çok daha az kompakt şema.

XML Schema Primer'daki bu bit bundan bahsediyor: http://www.w3.org/TR/xmlschema-0/#NS


En doğru yanıtın neye benzediğine dair küçük bir açıklama. ElementFormDefault = nitelikli ile, ad alanını girişteki yerel öğeleri nitelemelisiniz. Niteliksiz olarak ayarlandığında, ad alanını nitelendirmemelisiniz.
Ihe Onwuka

6

elementFormDefault = "nitelikli", şema belgesindeki (.xsd dosyası) ad alanları yerine XML örnek belgelerindeki (.xml dosyası) ad alanlarının kullanımını kontrol etmek için kullanılır.

ElementFormDefault = "nitelikli" belirterek, bu şema ile doğrulanan belgelerde kullanılmak üzere ad alanı bildirimini zorunlu kılıyoruz.

Elemanların niteliksiz olmak yerine nitelikli olması gerektiğini beyan etmek için bu değeri belirtmek yaygın bir uygulamadır. Ancak, attributeFormDefault = "unqualified" varsayılan değer olduğundan, ad alanlarının nitelendirilmesi istenmiyorsa, şema belgesinde belirtilmesine gerek yoktur.


elementFormDefault yalnızca yerel olarak tanımlanmış öğeler için geçerlidir. Global öğeler, ne olursa olsun ad alanlı nitelikli olmalıdır.
Ihe Onwuka

0

ElementFormDefault = "nitelikli" kullanılıyorsa XMLSpy'ın (en az 2011 sürümü) tanımlanmış bir targetNameSpace'e ihtiyacı olduğunu fark ettim. Aksi takdirde doğrulanmaz. Ayrıca ad alanı öneklerine sahip xml'ler oluşturmaz

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.