Co elementFormDefault robi w XSD?

Co robi elementFormDefault i kiedy należy go używać?

Więc znalazłem kilka definicji dla elementFormDefault wartości:

Qualified - elementy i atrybuty znajdują się w przestrzeni targetNamespace of the schemat

Niekwalifikowane - elementy i atrybuty nie mają przestrzeni nazw

Więc z tej definicji myślę, że jeśli schemat jest ustawiony na qualified to dlaczego musisz przedrostek typu z przestrzenią nazw? I jakie są scenariusze, które masz nawet jeden zestaw bez kwalifikacji? Próbowałem Googlować, ale dostałem tylko kilka stron W3C, które były niezwykle trudne do zrozumienia.

Jest to plik, z którym obecnie pracuję, dlaczego muszę zadeklarować typ jako target:TypeAssignments, Kiedy deklaruję targetNamespace jako ten sam, co 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>
Author: kjhughes, 2009-09-23

6 answers

ElementFormDefault nie ma nic wspólnego z przestrzenią nazw typów w schemacie, chodzi o przestrzenie nazw elementów w dokumentach XML, które są zgodne ze schematem.

Oto odpowiednia sekcja spec:

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

Oznacza to, że zadeklarowana przestrzeń targetNamespace u góry schematu ma zastosowanie tylko do elementów w dokumencie XML zgodnym ze schematem, jeśli elementFormDefault jest "kwalifikowany" lub element jest zadeklarowany jawnie w schemat jako mający form= "qualified".

Na przykład: jeśli elementFormDefault jest niekwalifikowany -

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

Umieści elementy expect " name "w przestrzeni targetNamespace, a elementy" page " w przestrzeni null.

Aby uniknąć konieczności umieszczania form= "qualified"na Deklaracji każdego elementu, podanie elementFormDefault=" qualified"oznacza, że przestrzeń targetNamespace ma zastosowanie do każdego elementu, chyba że zostanie nadpisana przez umieszczenie form=" unqualified " na deklaracji elementu.

 63
Author: Alohci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-23 00:25:31

Rozważmy następujący ComplexType AuthorType używany przez author element

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

If elementFormDefault="unqualified"

Następnie następująca instancja XML jest poprawna

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

Atrybut nazwy autorów jest dozwolony bez podawania przestrzeni nazw (bez zastrzeżeń). Wszystkie elementy, które są częścią <xsd:complexType> są uważane za lokalne dla complexType.

If elementFormDefault="qualified"

Wtedy instancja powinna mieć kwalifikowane lokalne elementy

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

Proszę zapoznać się z ten link po więcej szczegółów

 52
Author: Girish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-02 08:39:13

Nowa, szczegółowa odpowiedź i Wyjaśnienie starego, często zadawanego pytania...

Krótka odpowiedź: jeśli nie dodasz elementFormDefault="qualified" do xsd:schema, wtedy domyślna wartość unqualified oznacza, że lokalnie zadeklarowane elementy są w BEZ przestrzeni nazw .

Jest wiele zamieszania odnośnie tego, co robi elementFormDefault, ale można to szybko wyjaśnić krótkim przykładem...

Usprawniona wersja twojego 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>

Klucz punkty:

  • element assignment jest lokalnie zdefiniowany.
  • Elementy lokalnie zdefiniowane w XSD domyślnie nie mają przestrzeni nazw.
    • jest tak dlatego, że domyślną wartością dla elementFormDefault jest unqualified.
    • to prawdopodobnie błąd projektowy twórców XSD.
    • standardową praktyką jest zawsze używać elementFormDefault="qualified" tak, że assignment znajduje się w docelowej przestrzeni nazw, tak jak spodziewaj się.

Pozornie poprawny XML

Ten XML wygląda na to, że powinno być poprawne zgodnie z powyższym 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>

Notice:

  • domyślna przestrzeń nazw na assignments umieszcza assignments i wszystkie jej potomkinie w domyślnej przestrzeni nazw (http://www.levijackson.net/web340/ns).

Perplexing Validation Error

Pomimo poprawnego wyglądu, powyższy XML daje następujący mylący błąd walidacji:

[błąd] spróbuj.xml: 4: 23: CVC-complex-type.2.4.Odp: Nieprawidłowa treść była znalezione zaczynające się od elementu / align = "left" / Jednym z "{assignment} " jest oczekiwane.

Uwagi:

  • nie byłbyś pierwszym programistą, który przeklinał tę diagnostykę, która wydaje się mówić, że treść jest nieprawidłowa, ponieważ oczekiwała, że znajdzie element assignment, ale faktycznie znalazła element assignment. (WTF )
  • Co to tak naprawdę znaczy: { i } wokół assignment oznacza, że Walidacja oczekiwała assignment in no namespace proszę. Niestety, kiedy mówi, że znalazł element assignment, nie wspomina, że znalazł go w domyślnej przestrzeni nazw, która różni się od żadnej przestrzeni nazw.

Rozwiązanie

  • zdecydowana większość czasu: dodaj {[2] } do xsd:schema elementu XSD. Oznacza to, że poprawny XML musi umieszczać elementy w docelowej przestrzeni nazw, gdy lokalnie jest zadeklarowany w XSD; w przeciwnym razie poprawny XML musi umieszczać elementy lokalnie zadeklarowane w żadnej przestrzeni nazw.
  • mała mniejszość czas: Zmień XML, aby był zgodny z XSD wymaganie, aby {[6] } nie było w żadnej przestrzeni nazw. Można to osiągnąć, na przykład poprzez dodanie xmlns="" do elementu assignment.
 18
Author: kjhughes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-16 00:33:39

Należy pamiętać, że elementFormDefault ma zastosowanie do lokalnie zdefiniowanych elementów, typowo nazwanych wewnątrz bloku complexType, w przeciwieństwie do elementów globalnych zdefiniowanych na najwyższym poziomie schematu. Za pomocą elementFormDefault = "qualified" możesz zwracać się do lokalnych elementów schematu z poziomu dokumentu xml, używając docelowej przestrzeni nazw schematu jako domyślnej przestrzeni nazw dokumentu.

W praktyce, użyj elementFormDefault="qualified", aby móc zadeklarować elementy w zagnieżdżonych blokach, w przeciwnym razie będziesz musiał zadeklarować wszystkie elementy na najwyższym poziomie i odwoływać się do nich w schemacie w zagnieżdżonych elementach za pomocą atrybutu ref, co skutkuje znacznie mniej zwartym schematem.

Ten bit w XML Schema Primer mówi o tym: http://www.w3.org/TR/xmlschema-0/#NS

 12
Author: stephan f,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-17 15:28:01

ElementFormDefault="qualified" jest używany do kontrolowania użycia przestrzeni nazw w dokumentach instancji XML (.plik xml), a nie przestrzenie nazw w samym dokumencie schematu (.plik xsd).

Poprzez podanie elementFormDefault= "qualified" wymuszamy deklarację przestrzeni nazw, która ma być używana w dokumentach potwierdzonych tym schematem.

Powszechną praktyką jest określanie tej wartości, aby zadeklarować, że elementy powinny być kwalifikowane, a nie niekwalifikowane. Jednakże, ponieważ attributeFormDefault = "unqualified"jest wartością domyślną, nie musi być określona w dokumencie schematu, jeśli nie chce się kwalifikować przestrzeni nazw.

 5
Author: Feri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-04 21:17:51

Zauważyłem, że XMLSpy (przynajmniej w wersji 2011)wymaga zdefiniowanej przestrzeni targetNameSpace, jeśli używany jest elementFormDefault= "qualified". Inaczej się nie potwierdzi. A także nie będzie generować xmlów z prefiksami przestrzeni nazw

 0
Author: Neal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-22 09:52:52