IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Valider XML Discussion :

[XSD] Incompatibilité des types xs:ID et xs:IDREF ?


Sujet :

Valider XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 19
    Points : 18
    Points
    18
    Par défaut [XSD] Incompatibilité des types xs:ID et xs:IDREF ?
    Bonjour, j'ai un petit problème sur la validation d'un XML schéma.

    J'ai un schéma avec un élément de ce type, comportant un attribut de type xs:ID :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xs:complexType name="typeClasse">
          <xs:attribute name="id" type="xs:ID" use="required" />
    </xs:complexType>
    Et un élément "Fournisseur" fera référence à un élément du type ci-dessus, à l'aide d'un IDREF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <xs:complexType name="typeFournisseur">
          <xs:attribute name="idref" type="xs:IDREF" use="required" />
    </xs:complexType>
    J'ai des contraintes sur la référence, notamment de la position de l'élément référencé dans le document. J'introduis donc un mécanisme key/keyref pour garantir le bon référencement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <xs:key name="idClasse" >
          	<xs:selector xpath=".//Classe" />
          	<xs:field xpath="@id" />
    </xs:key>
     
    <xs:keyref name="idClasseRefGeneralisation" refer="idClasse" >
         <xs:selector xpath=".//Classe/Relations/Generalisation/Fournisseur" />
         <xs:field xpath="@idref" />
    </xs:keyref>
    En validant le schéma avec Schéma Quality Checker d'IBM, il me trouve des warnings :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    There is no attribute matching the selector Xpath for which <xs:field xpath="@idref"/>  defined in the keyRef evaluates to an element or an attribute declaration whose type is compatible with the type of an attribute evaluated by the corresponding field in the referenced Key, <xs:field xpath="@id"/> . Here type compatibility means that either both types should be equal or one should be a valid restriction of the other.
    Pour résumer (et pour les anglophobes ), il m'avertit que les 2 types, la clé et sa référence ne sont pas comptabiles, qu'ils devraient l'être ou être tous 2 dérivés d'un même type.
    Par contre, en travaillant sur un exemple instanciant le schéma, mes références se font bien comme je le veux.
    Est-ce ce que c'est Schema Quality Checker qui a des petits problèmes et que cette construction est valide comme je le pense, ou bien le problème se trouve dans mon code ?

    Merci

  2. #2
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Bonjour,

    le problème est dans ton code : xs:ID et xs:IDREF sont tous deux dérivés par restriction de xs:NCName, et ne peuvent donc pas être considérés comme du même type ou dérivant l'un de l'autre.

    D'autre part, xs:ID et xs:IDREF émulent le comportement de leurs équivalents DTD. Tu disposes donc déjà d'un contrôle de référence, et l'ajout d'une paire xs:key et xs:keyref est par conséquent redondant.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    Merci de ta réponse,

    J'ai ajouté un contrôle des références avec xs:key et xs:keyref afin d'ajouter une contrainte sur le référencement : l'idref ne doit pas seulement référencer un ID présent dans le document, mais un ID présent dans un élément particulier.
    L'emploi des types xs:ID et xs:IDREF s'est fait naturellement car le schéma vise en fait à structurer et valider une transformation XSL d'un XML d'origine où ces attributs sont présents avec les mêmes types.
    Et il me semblait logique de vérifier le référencement sur le seul attribut étant unique à coup sûr, comme il me semble logique de faire le contrôle sur l'identifiant de l'élément...

    Je suis un peu perplexe en fait, il n'y a pas d'autre solution que de passer par un autre attribut ?
    Ce n'est pas particulièrement capital pour le truc que je suis en train de faire, mais j'aime bien faire les choses proprement

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par Cpt.FLAM
    J'ai ajouté un contrôle des références avec xs:key et xs:keyref afin d'ajouter une contrainte sur le référencement : l'idref ne doit pas seulement référencer un ID présent dans le document, mais un ID présent dans un élément particulier.
    C'est justement pour pallier à cette limitation des ID et IDREF que le dispositif xs:key - xs:keyref est à préférer. Tes ID étant forcément unique sur l'ensemble du XML, je ne vois pas l'intérêt de conserver les deux mécanismes.
    Citation Envoyé par Cpt.FLAM
    Je suis un peu perplexe en fait, il n'y a pas d'autre solution que de passer par un autre attribut ?
    Un autre type d'attribut, tu veux dire ? Je crains que non.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par GrandFather
    C'est justement pour pallier à cette limitation des ID et IDREF que le dispositif xs:key - xs:keyref est à préférer. Tes ID étant forcément unique sur l'ensemble du XML, je ne vois pas l'intérêt de conserver les deux mécanismes.
    D'accord, sachant que mes attributs sont copiés (via une transformation XSL) d'un XML originel où ils ont justement les types xs:ID et xs:IDREF, que faut-il faire ? Charger ces attributs dans des attributs de type xs:NCName, puis faire le contrôle de référence à l'aide de xs:key et xs:keyref ?
    Je suppose que c'est un "problème" rencontré fréquemment et qu'il y a une solution "standard" ?

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    Citation Envoyé par Cpt.FLAM
    Charger ces attributs dans des attributs de type xs:NCName, puis faire le contrôle de référence à l'aide de xs:key et xs:keyref ?
    C'est ce que je te conseille. Tu peux également conserver les types xs:ID et xs:IDREF, mais conserver les deux dispositifs me paraît superflu, et même problématique car comme tu l'as constaté la hiérarchie des types symples des XML Schema complique les choses...

    Le fait que le XML que tu cherches à valider provienne de la transformation via XSLT d'un autre XML ne les lient pas sur le plan des contraintes et du schéma. La sémantique des ID et IDREF est "perdue" durant la transformation, et tu ne peux la rétablir qu'en liant une DTD ou un XML Schema, comportant ces contraintes, au XML transformé.
    FAQ XML
    ------------
    « Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
    Giacomo Leopardi

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    Je pense effectivement que je vais faire comme ça.
    Merci pour ces explications.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. xsd:all sur des éléments de type différents
    Par Steph0 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 12/08/2012, 18h04
  2. incompatibilité des types ?
    Par zangaloni dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/01/2011, 17h47
  3. [AC-2000] 3464 Incompatibilité des types
    Par Flo90 dans le forum VBA Access
    Réponses: 7
    Dernier message: 21/04/2009, 11h52
  4. [JAXB] Modification du binding par défaut des types (xsd:decimal -> BigDecimal)
    Par jcdonnart dans le forum Persistance des données
    Réponses: 0
    Dernier message: 03/12/2008, 18h09
  5. Réponses: 10
    Dernier message: 26/11/2008, 18h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo