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] Contenu variable et extensible avec éléments uniques


Sujet :

Valider XML

  1. #1
    GentooGeek
    Invité(e)
    Par défaut [XSD] Contenu variable et extensible avec éléments uniques
    Bonjour.

    Je souhaite mettre au point un conteneur XML avec contenu variable et extensible de sorte que chaque élément du conteneur n'apparaisse qu'une seule fois. Je souhaite que le contenu soit extensible, c'est-à-dire que les éléments peuvent appartenir à des espaces de noms différents, ces derniers définis dans des schémas différents.

    Comme un petit dessin vaut mieux qu'un long discours, voici ce que je souhaite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <root xmlns="http://example.org/base" xmlns:ns1="urn:ns1" xmls:ns2="urn:ns2">
        <conteneur>
            <ns1:auteur>Texte</ns1:auteur>
            <ns2:date>Texte</ns2:date>
        </conteneur>
    </root>
    Je voudrais pouvoir définir l'élément <conteneur> dans un schéma et les éléments <ns1:auteur> et <ns2:date> dans deux schémas différents sans qu'il soit autorisé d'avoir un même élément plus d'une fois. Le truc est d'autoriser des éléments supplémentaires sous <conteneur> à condition
    • qu'ils soient définis dans un schéma
    • qu'ils apparaissent au plus une fois
    • mais sans modifier l'espace de noms de <conteneur> ni de ses ancêtres.


    Est-ce possible avec une simple substitution d'éléments? Ou dois-je utiliser les types caméléons?

    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    moi je te dirais de regarder du coté de any, au pire cela ne fera que vérifié si le document est bien formé

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

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

    tu n'auras pas de difficulté pour ajouter des éléments de namespaces différents, par contre je ne vois pas comment tu pourras placer une contrainte de multiplicité sur les éléments du conteneur. A priori, tu vas définir le modèle de contenu de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://example.org/base" 
      elementFormDefault="qualified" 
      attributeFormDefault="unqualified" 
      xmlns="http://example.org/base">
      <xs:element name="root">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="conteneur">
              <xs:complexType>
                <xs:sequence>
                  <xs:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="strict"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>	
      </xs:element>
    </xs:schema>
    Je ne vois pas trop comment tu pourrais contrôler le nombre d'occurrences d'éléments externes du même type, étant donné qu'on ne peut définir à l'avance les éléments qu'on va avoir.

    Par contre, tu ne peux pas utiliser les schémas caméléons ; ils ont pour caractéristique d'adopter le namespace du schéma qui les inclut, hors ce n'est pas ce que tu souhaites, puisque chaque élément inclus aura son propre namespace.
    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

  4. #4
    GentooGeek
    Invité(e)
    Par défaut
    Merci pour vos réponses.

    Je ne puis utiiser <xs:any> car je souhaite malgré tout vérifier le type des éléments du conteneur. En cela <any> me piège dans le sens où je n'ai pas de type de base que je puisse dériver, que ce soit par substitution de type ou d'élément.

    La seule possibilité que j'aie imaginé jusqu'à présent est de forcer le type (de base) de l'élément contenu, à la place de <any> - les multiplicités étant identiques. Le contenu variable est obtenu par substitution d'élément.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ...
            <xs:element name="conteneur">
              <xs:complexType>
                <xs:sequence>
                  <xs:element ref="property" minOccurs="0" maxOccurs="unbounded"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
    ...
    J'imagine qu'une des solutions (pour vérifier les cardinalités) serait d'utiliser schematron ou quelque chose du genre. Je pourrais aussi établir ces limitations au niveau applicatif.
    Dernière modification par GentooGeek ; 03/10/2006 à 20h15.

  5. #5
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    mais ces types que tu as , même si tu ne sais pas à l'avance lesquels tu va rajouter, n'ont t'il pas chacuns un xml schema pour les valider ?

  6. #6
    GentooGeek
    Invité(e)
    Par défaut
    Citation Envoyé par Erwy
    mais ces types que tu as , même si tu ne sais pas à l'avance lesquels tu va rajouter, n'ont t'il pas chacuns un xml schema pour les valider ?
    Si si. Je suppose que c'est l'intérêt de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    processContents="strict"
    ?
    Le type de base me permet de fixer les propriétés de base des éléments enfants, sans accepter n'importe quoi, même si les éléments du conteneur possèdent un schéma. Ces schémas définissent aussi d'autres types et éléments.

    EDIT: En fait la question des cardinalités aurait été résolue si l'élément <xs:unique> supportait des contraintes utilisant les fonctions XPath comme name() ou local-name(). Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <xs:element name="conteneur"...>
    ...
        <xs:unique name="uniqueChild">
          <xs:selector xpath="child::*"/>
          <xs:field xpath="name()"/>
        </xs:unique>
    ...
    <xs:element>
    ...
    Dernière modification par GentooGeek ; 03/10/2006 à 20h35.

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Par défaut
    Citation Envoyé par GentooGeek
    Le type de base me permet de fixer les propriétés de base des éléments enfants, sans accepter n'importe quoi, même si les éléments du conteneur possèdent un schéma. Ces schémas définissent aussi d'autres types et éléments.
    Ca change tout. Dans ce cas, effectivement, les groupes de substitution rempliront parfaitement ce rôle.
    Citation Envoyé par GentooGeek
    EDIT: En fait la question des cardinalités aurait été résolue si l'élément <xs:unique> supportait des contraintes utilisant les fonctions XPath comme name() ou local-name().
    Eh oui, mais non... Les expressions XPath utilisées pour définir les contrôles d'identité n'utilisent qu'un sous-ensemble (très restreint) de la grammaire XPath. La seule façon d'implémenter ces contrôles d'unicité est de passer par du code applicatif.
    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

  8. #8
    GentooGeek
    Invité(e)
    Par défaut
    Merci GrandFather. Dommage pour XPath. Comme je développe sous Gentoo/Apache/PHP je vais m'essayer à Schematron.

Discussions similaires

  1. [CS4] mise en page, avec contenu variable suivant donné SGBD
    Par poullot dans le forum Dreamweaver
    Réponses: 8
    Dernier message: 14/12/2009, 11h05
  2. Petit souci avec stringstream et contenu variable.
    Par JulienDuSud dans le forum SL & STL
    Réponses: 4
    Dernier message: 23/10/2009, 20h31
  3. page jsp avec contenu variable
    Par gazafayza dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 15/09/2009, 22h04
  4. Listbox avec contenu variable
    Par mfmf99 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/11/2008, 15h02
  5. [XSD][Debutant]Contenu variable à valider
    Par Aymerik dans le forum Valider
    Réponses: 2
    Dernier message: 09/11/2006, 10h52

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