Que fait elementFormDefault dans XSD?

Que fait elementFormDefault et quand doit-il être utilisé?

J’ai donc trouvé des définitions pour les valeurs de elementFormDefault :

qualified – les éléments et les atsortingbuts sont dans le targetNamespace du schéma

non qualifié – les éléments et atsortingbuts n’ont pas d’espace de nommage

Donc, à partir de cette définition, je pense que si un schéma est défini sur qualifié, pourquoi faut-il préfixer le type avec l’espace de noms? Et quels sont les scénarios que vous pourriez même imposer à cette question? J’ai essayé Googling, mais je n’ai eu que quelques pages du W3C extrêmement difficiles à comprendre.

C’est le fichier avec lequel je travaille en ce moment, pourquoi dois-je déclarer le type comme target:TypeAssignments lorsque je déclare targetNamespace identique à xmlns:target ?

                                     

    ElementFormDefault n’a rien à voir avec l’espace 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  ancestor is qualified, then the ·actual value· of the targetNamespace [atsortingbute] of the parent  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 ne s’applique qu’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 la forme = “qualifié” .

    Par exemple: Si elementFormDefault n’est pas qualifié –

       

    mettra l’attente des éléments “name” à être dans le targetNamespace et les éléments “page” à être dans le namespace null.

    Pour vous éviter d’avoir à mettre form = “qualifiée” sur chaque déclaration d’élément, énoncer elementFormDefault = “qualifiée” signifie que targetNamespace s’applique à chaque élément sauf en cas de substitution en mettant form = “non qualifié” sur la déclaration d’élément.

    Considérons le AuthorType utilisé par l’élément author

              

    Si elementFormDefault="unqualified"

    L’instance XML suivante est alors valide

      Aaron Skonnard (801)390-4552  

    l’atsortingbut name de l’auteur est autorisé sans spécifier l’espace de nommage (non qualifié). Tout élément faisant partie de est considéré comme local à complexType.

    si elementFormDefault="qualified"

    alors l’instance devrait avoir les éléments locaux qualifiés

      Aaron Skonnard (801)390-4552  

    Veuillez vous référer à ce lien pour plus de détails

    Nouvelle réponse détaillée et explication à une ancienne question fréquemment posée …

    Réponse courte : Si vous n’ajoutez pas elementFormDefault="qualified" à xsd:schema , la valeur unqualified par défaut signifie que les éléments déclarés localement ne sont dans aucun espace de noms .

    Il y a beaucoup de confusion en ce qui concerne elementFormDefault , mais cela peut être rapidement clarifié avec un court exemple …

    Version simplifiée de votre XSD:

                     

    Points clés:

    • L’élément d’ assignment est défini localement.
    • Les éléments définis localement dans XSD ne sont dans aucun espace de noms par défaut.
      • En effet, la valeur par défaut de elementFormDefault n’est unqualified .
      • C’est sans doute une erreur de conception des créateurs de XSD.
      • La pratique standard est de toujours utiliser elementFormDefault="qualified" pour que l’ assignment soit dans l’espace de noms cible comme on pourrait s’y attendre.

    XML apparemment valable

    Ce XML ressemble à ce qui devrait être valide selon le XSD ci-dessus:

       John   

    Remarquer:

    • L’espace de noms par défaut sur les assignments place les assignments et tous ses descendants dans l’espace de noms par défaut ( http://www.levijackson.net/web340/ns ).

    Erreur de validation compliquée

    Malgré son aspect valide, 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: Le contenu non valide a été trouvé en commençant par l’élément «assignation». Un des ‘{assignation}’ est attendu.

    Remarques:

    • Vous ne seriez pas le premier développeur à décrier ce diagnostic qui semble indiquer que le contenu est invalide car il s’attendait à trouver un élément d’ assignment mais il a en fait trouvé un élément d’ assignment . ( WTF )
    • Qu’est-ce que cela signifie vraiment? L’ assignment { and } around signifie que la validation attendait une assignment dans aucun espace de noms ici. Malheureusement, quand il dit qu’il a trouvé un élément d’ assignment , il ne mentionne pas qu’il l’a trouvé dans un espace de noms par défaut qui ne diffère d’aucun espace de noms.

    Solution

    • Vaste majorité du temps: Ajoutez elementFormDefault="qualified" à l’élément xsd:schema du XSD. Cela signifie qu’un XML valide doit placer des éléments dans l’espace de noms cible lorsqu’il est déclaré localement dans le XSD; sinon, le XML valide doit placer les éléments déclarés localement dans aucun espace de noms.
    • Minuscule minorité du temps: Modifiez le code XML pour satisfaire à l’exigence du XSD selon laquelle l’ assignment doit pas avoir lieu dans un espace de noms. Cela peut être réalisé, par exemple, en ajoutant xmlns="" à l’élément d’ assignment .

    Il est important de noter que elementFormDefault s’applique aux éléments définis localement , généralement des éléments nommés dans un bloc complexType, par opposition aux éléments globaux définis au niveau supérieur du schéma. Avec elementFormDefault = “qualified”, vous pouvez adresser des éléments locaux du schéma à partir du document XML en utilisant l’espace de noms cible du schéma comme espace de noms par défaut du document.

    En pratique, utilisez elementFormDefault = “qualifications” pour pouvoir déclarer des éléments dans des blocs nesteds, sinon vous devrez déclarer tous les éléments du niveau supérieur et vous y reporter dans le schéma des éléments nesteds en utilisant l’atsortingbut ref, ce qui donnera un 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 les espaces de noms dans le document de schéma lui-même (fichier .xsd).

    En spécifiant elementFormDefault = “qualified”, nous appliquons la déclaration d’espace de noms à 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, étant donné que atsortingbuteFormDefault = “non qualifié” est la valeur par défaut, il n’est pas nécessaire de la spécifier dans le document de schéma, si vous ne souhaitez pas qualifier les espaces de noms.

    J’ai remarqué que XMLSpy (au moins la version 2011) nécessite un targetNameSpace défini si elementFormDefault = “qualifications” est utilisé. Sinon, ne validera pas. Et aussi ne générera pas de XML avec les préfixes d’espace de noms