29 votes

Espaces de noms et attributs XML

J'essaie de comprendre comment fonctionnent les espaces de noms dans le XML. Lorsque j'ai un élément comme foo:bar, les attributs n'ont souvent pas d'espace de noms. Mais parfois, ils le sont. Les attributs sont-ils dans l'espace de noms de l'élément, même lorsque l'espace de noms par défaut a été déclaré ? En regardant le xsd pour xhtml, il semble que les attributs fassent partie du schéma et devraient être dans l'espace de nom pour xhtml, mais ils ne sont jamais présentés de cette façon...

40voto

Bart Schuller Points 1992

La plupart du temps, les attributs ne seront pas dans un espace de nom. Le site espace de noms spec dit ( accentuation mine) :

Une déclaration d'espace de noms par défaut s'applique à tous les espaces de noms sans préfixe. élément des noms dans son champ d'application. Les déclarations d'espaces de noms par défaut font pas postulez directement à attribut L'interprétation des attributs sans préfixe est déterminée par l'élément sur lequel ils apparaissent.

Ce n'est pas sans raison que la plupart des vocabulaires XML utilisent des attributs sans espacement des noms :
Lorsque vos éléments ont un espace de nom et que ces éléments ont des attributs, il ne peut y avoir de confusion : les attributs appartiennent à votre élément, qui appartient à votre espace de nom. L'ajout d'un préfixe d'espace de nom aux attributs ne ferait que rendre le tout plus verbeux.

Alors pourquoi les attributs espace-nom existent-ils ?
Parce que certains vocabulaires font un travail utile avec principalement des attributs, et peuvent le faire lorsqu'ils sont mélangés à d'autres vocabulaires. L'exemple le plus connu est XLink .

Enfin, le W3C XML Schema propose un moyen trop facile ( <schema attributeFormDefault="qualified"> ) de déclarer vos attributs comme étant dans un espace de nom, vous obligeant à les préfixer dans vos documents, même lorsque vous utilisez un espace de noms par défaut.

7voto

Diego Tercero Points 535

Il y a une chose liée à ce sujet des attributs/espaces de noms qui m'a pris du temps à comprendre aujourd'hui alors que je travaillais sur un XSD. Je vais partager cette expérience avec vous au cas où quelqu'un aurait les mêmes problèmes.

Dans le document de schéma sur lequel je travaillais, il y avait quelques attributs globaux référencés par certains éléments. Pour simplifier les choses ici, supposons que le XSD dont je parle concernait un élément Client .

Appelons l'un de ces attributs globaux Id . Et l'élément Root qui l'utilise Client

Ma déclaration XSD ressemblait à ceci :

<?xml version="1.0" encoding="utf-8"?>
<xs:schema  xmlns="http://schemas.mycompany.com/Customer/V1" 
targetNamespace="http://schemas.mycompany.com/Customer/V1" 
xmlns:xs="http://www.w3.org/2001/XMLSchema">

Mon Id La déclaration d'attribut ressemblait à ceci :

<xs:attribute name="Id" type="xs:positiveInteger"/>

Et mon Client a utilisé l'attribut comme suit :

<xs:element name="Customer">
   <xs:complexType>
      <xs:attribute ref="Id" use="required"/>
      <!-- some elements here -->
    </xs:complexType>
</xs:element>

Maintenant, disons que je veux déclarer une Client document XML comme ceci :

<?xml version="1.0" encoding="utf-8"?>
<Customer Id="1" xmlns="http://schemas.mycompany.com/Customer/V1">
  <!-- ... other elements here -->
</Customer>

J'ai découvert que je ne peux pas : lorsque l'attribut est déclaré globalement, il n'est pas dans le même espace de noms que l'élément qui le référence.

Je me suis rendu compte que la seule solution avec le XSD défini comme ça était de déclarer l'espace de nom deux fois : une fois sans préfixe afin d'en faire l'espace de nom par défaut pour les éléments, et une fois avec un préfixe afin de l'utiliser avec les attributs. Voici donc à quoi cela aurait ressemblé :

<?xml version="1.0" encoding="utf-8"?>
<Customer cus:Id="1" xmlns="http://schemas.mycompany.com/Customer/V1"
 xmlns:cus="http://schemas.mycompany.com/Customer/V1">
  <!-- ... other elements here -->
</Customer>

C'est tellement peu pratique que j'ai décidé de me débarrasser de tous les attributs globaux et de les déclarer localement. Ce qui, dans le cas de l'exemple que j'ai donné ici, aurait ressemblé à ceci :

<xs:element name="Customer">
   <xs:complexType>
       <xs:attribute name="Id" type="xs:positiveInteger" use="required"/>
       <!-- some elements here -->
   </xs:complexType>
</xs:element>

J'ai eu du mal à trouver des références sur ce dont je parle sur le net. J'ai fini par trouver ce poste dans le forum XSD de Stylus où un certain Steen Lehmann a suggéré de déclarer l'attribut localement ou de le déclarer dans un groupe d'attributs.

"afin que la déclaration de l'attribut elle-même n'est plus globale"

Cette dernière solution a un goût de "bidouille", j'ai donc décidé de m'en tenir à la première solution et de déclarer tous mes attributs localement.

6voto

jelovirt Points 3531

Des exemples pour illustrer l'utilisation du Notation de Clark où le préfixe de l'espace de noms est remplacé par l'URL de l'espace de noms entre crochets :

<bar xmlns:foo="http://www.foo.com/"
    foo:baz="baz"
    qux="qux"/>
<bar xmlns="http://www.foo.com/" xmlns:foo="http://www.foo.com/"
    foo:baz="baz"
    qux="qux"/>
<foo:bar xmlns="http://www.foo.com/" xmlns:foo="http://www.foo.com/"
    foo:baz="baz"
    qux="qux"/>

est

<{}bar
    {http://www.foo.com/}baz="baz"
    {}qux="qux"/>
<{http://www.foo.com/}bar
    {http://www.foo.com/}baz="baz"
    {}qux="qux"/>
<{http://www.foo.com/}bar
    {http://www.foo.com/}baz="baz"
    {}qux="qux"/>

2voto

Staale Points 8795

Lire la suite sur 6.1 Portée de l'espace de nommage et 6.2 Défauts dans les espaces de noms sur w3c.

En gros :

La portée d'une déclaration d'espace de nom déclarant un préfixe s'étend du début de la balise de départ dans laquelle il apparaît jusqu'à la fin de la balise de fin correspondante.

Cependant, le texte ici ne semble pas expliquer si le moyen a est foo:a ou l'espace de nom par défaut dans le contexte. Je supposerais qu'il ne s'agit pas de foo:a, mais plutôt de l'espace de nom par défaut du document a. En considérant cette citation au moins :

Une telle déclaration d'espace de noms s'applique à tous les noms d'éléments et d'attributs de sa portée dont le préfixe correspond à celui spécifié dans la déclaration.

Par exemple, l'espace de nom "foo :" ne s'applique qu'aux éléments préfixés par foo :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X