Que fait elementFormDefault
et quand doit-il être utilisé?
J'ai donc trouvé quelques définitions pour les valeurs elementFormDefault
:
qualifié - les éléments et attributs sont dans le targetNamespace du schéma
non qualifié - les éléments et attributs n'ont pas d'espace de nom
Donc, à partir de cette définition, je penserais que si un schéma est défini sur qualifié, pourquoi devez-vous préfixer le type avec l'espace de noms? Et quels sont les scénarios que vous auriez même un ensemble à qualifier non qualifié pour cette question? J'ai essayé Googling, mais je n'ai eu que quelques pages du W3C extrêmement difficiles à comprendre.
C'est le fichier sur lequel je travaille en ce moment, pourquoi dois-je déclarer le type en tant que target:TypeAssignments
quand je déclare le targetNamespace
comme identique à 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>
ElementFormDefault n'a rien à voir avec les espaces de noms des types du schéma, il s'agit des espaces de noms des éléments des documents XML conformes au schéma.
Voici la section pertinente de la spécification:
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·.
Cela signifie que le targetNamespace que vous avez déclaré en haut du schéma s'applique uniquement aux éléments du document XML conforme au schéma si elementFormDefault est "qualifié" ou si l'élément est déclaré explicitement dans le schéma comme ayant form = "qualifié". .
Par exemple: Si elementFormDefault n'est pas qualifié -
<element name="name" type="string" form="qualified"></element>
<element name="page" type="target:TypePage"></element>
mettra les éléments "name" attendus dans l’espace targetNamespace et les éléments "page" dans l’espace de noms null.
Pour vous éviter de mettre form = "qualifié" sur chaque déclaration d'élément, la déclaration de elementFormDefault = "qualifié" signifie que le targetNamespace s'applique à chaque élément, sauf substitution, en insérant form = "unqualified" dans la déclaration d'élément.
Considérez le ComplexType AuthorType
suivant utilisé par l'élément 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"/>
Si elementFormDefault="unqualified"
alors l'instance XML suivante est valide
<x:author xmlns:x="http://example.org/publishing">
<name>Aaron Skonnard</name>
<phone>(801)390-4552</phone>
</x:author>
l'attribut name de l'auteur est autorisé sans spécifier l'espace de nom (non qualifié). Tout élément faisant partie de <xsd:complexType>
sont considérés comme locaux à complexType.
si elementFormDefault="qualified"
alors l'instance devrait avoir les éléments locaux qualifiés
<x:author xmlns:x="http://example.org/publishing">
<x:name>Aaron Skonnard</name>
<x:phone>(801)390-4552</phone>
</x:author>
s'il vous plaît se référer this lien pour plus de détails
Nouvelle réponse détaillée et explication d'une vieille question fréquemment posée ...
Réponse courte: Si vous n'ajoutez pas elementFormDefault="qualified"
à xsd:schema
, la valeur par défaut unqualified
signifie que les éléments déclarés localement sont dans sans espace de nom.
Il y a beaucoup de confusion à propos de ce que elementFormDefault
fait, mais cela peut être rapidement clarifié avec un court exemple ...
<?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>
Points clés:
assignment
est défini localement.elementFormDefault
est unqualified
.elementFormDefault="qualified"
de sorte que assignment
se trouve dans l’espace de noms cible comme on pourrait s’y attendre.Ce XML ressemble à ce qu'il devrait être valide selon le XSD ci-dessus:
<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>
Avis:
assignments
place assignments
et tous ses descendants dans l'espace de noms par défaut (http://www.levijackson.net/web340/ns
).En dépit de sa validité, le code XML ci-dessus génère l'erreur de validation confuse suivante:
[Erreur] try.xml: 4: 23: cvc-complex-type.2.4.a: Un contenu invalide a été trouvé à partir de l'élément 'assignation'. Un des '{affectation}' est attendu.
Notes:
assignment
mais il a en fait trouvé un élément assignment
element. ( WTF ){
et }
autour de assignment
signifie que la validation attendait assignment
dans aucun espace de nom ici. Malheureusement, quand il dit avoir trouvé un élément assignment
, il ne mentionne pas qu'il l'a trouvé dans un espace de noms par défaut qui diffère de aucun espace de noms.elementFormDefault="qualified"
au xsd:schema
élément de la XSD. Cela signifie qu'un XML valide doit placer des éléments dans l'espace de nom cible lors de la déclaration locale dans le fichier XSD. sinon, un XML valide doit placer les éléments déclarés localement dans aucun espace de nom.assignment
ne doit pas figurer dans un espace de noms. Ceci peut être réalisé, par exemple, en ajoutant xmlns=""
à l'élément assignment
.Il est important de noter que elementFormDefault s'applique aux éléments définis localement localement, généralement nommés dans un bloc complexType, par opposition aux éléments globaux définis dans la partie supérieure. niveau du schéma. Avec elementFormDefault = "qualifié", vous pouvez adresser des éléments locaux du schéma à partir du document xml en utilisant l'espace de nom cible du schéma comme espace de nom par défaut du document.
En pratique, utilisez elementFormDefault = "qualifié" pour pouvoir déclarer des éléments dans des blocs imbriqués. Dans le cas contraire, vous devrez déclarer tous les éléments au niveau supérieur et y faire référence dans le schéma des éléments imbriqués à l'aide de l'attribut ref. schéma beaucoup moins compact.
Ce bit dans XML Schema Primer en parle: http://www.w3.org/TR/xmlschema-0/#NS
elementFormDefault = "qualifié" est utilisé pour contrôler l'utilisation des espaces de noms dans les documents d'instance XML (fichier .xml), plutôt que des espaces de noms dans le document de schéma lui-même (fichier .xsd).
En spécifiant elementFormDefault = "qualifié", nous appliquons la déclaration d'espace de nom à utiliser dans les documents validés avec ce schéma.
Il est courant de spécifier cette valeur pour déclarer que les éléments doivent être qualifiés plutôt que non qualifiés. Cependant, comme attributFormDefault = "non qualifié" est la valeur par défaut, il n’est pas nécessaire de le spécifier dans le document de schéma, si l’on ne souhaite pas qualifier les espaces de noms.
J'ai remarqué que XMLSpy (version 2011 minimum) a besoin d'un targetNameSpace défini si elementFormDefault = "qualifié" est utilisé. Sinon, ne pas valider. Et aussi ne générera pas de XML avec les préfixes d'espace de noms