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>
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.
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
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
jestunqualified
. - to prawdopodobnie błąd projektowy twórców XSD.
- standardową praktyką jest zawsze używać
elementFormDefault="qualified"
tak, żeassignment
znajduje się w docelowej przestrzeni nazw, tak jak spodziewaj się.
- jest tak dlatego, że domyślną wartością dla
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
umieszczaassignments
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 elementassignment
. (WTF ) - Co to tak naprawdę znaczy:
{
i}
wokółassignment
oznacza, że Walidacja oczekiwałaassignment
in no namespace proszę. Niestety, kiedy mówi, że znalazł elementassignment
, 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 elementuassignment
.
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
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.
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
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