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] éléments uniques dans un xsd:list


Sujet :

Valider XML

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 103
    Points : 110
    Points
    110
    Par défaut [XSD] éléments uniques dans un xsd:list
    Bonjour,

    Est-ce qu'on peut obtenir la longueur, i.e. lenombre d'éléments, d'une liste ?
    Par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <xs:simpleType name="StringListType">
    <xs:list itemType="xs:string"/>
    </xs:simpleType>
    Ma seconde question concerne plus le schema :
    Est-il possible de forcer les éléments d'une liste à prendre des valeurs distinctes ?

    Merci d'avance.
    Arnaud

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Février 2009
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Février 2009
    Messages : 155
    Points : 231
    Points
    231
    Par défaut
    Bonjour,

    On peut utiliser la fonction count() pour compter le nb d'éléments d'une liste.

    Pour limiter le contenu des éléments de la liste on se sert de l'attribut value de xs:pattern :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="val1|val2|val3"/>
      </xs:restriction>
    </xs:simpleType>

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 103
    Points : 110
    Points
    110
    Par défaut
    Bonjour,

    Merci pour la réponse et désolé de mon temps de réaction
    Malheureusement, je n'arrive pas à utiliser la fonction count() correctement.
    Considérons l'exemple suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <!--  Xml schema : example.xsd-->
    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
     
    <xs:element name="list"> 
        <xs:simpleType>
        <xs:list itemType="xs:int"/>
      </xs:simpleType>
    </xs:element>
    </xs:schema>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <!--  fichier xml valide-->
    <?xml version="1.0" encoding="UTF-8"?>
    <list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="file:/home/nono/tmp/example.xsd">
        1 2 3
    </list>
    La requête count(//list) renvoie 1 puisqu'il n'y a qu'un seul élément.
    La requête count(//list/*) renvoie 0 ce qui semble indiquer que les éléments de la liste ne sont pas considérées comme des nœuds enfants.
    Quelle est la syntaxe correcte pour accéder à la longueur de la liste ?

    Concernant ma seconde question, je ne parlais pas d'une restriction mais de valeurs distinctes.
    Par exemple (1,2,3) est valide mais (1,2,2) est invalide.

    Merci d'avance.
    Arnaud

  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
    Bonjour,

    le type simple xs:list est trop rudimentaire pour définir des contraintes d'unicité ou faire un comptage simple avec count(). Il faut passer par un type complexe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      <xs:element name="list"> 
        <xs:complexType>
          <xs:sequence>
            <xs:element name="item" type="xs:int" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
        <xs:unique name="uniq-item">
          <xs:selector xpath="item"/>
          <xs:field xpath="."/>
        </xs:unique>
      </xs:element>
    Exemple :
    <list>
    <item>1</item>
    <item>2</item>
    <item>3</item>
    </list>

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 103
    Points : 110
    Points
    110
    Par défaut
    Bonjour,

    Je craignais cette réponse
    J'utilise le type simple xs:list car il autorise une syntaxe beaucoup plus compact et lisible qu'un type complexe.
    Je trouve cela préférable dans certain cas.

    Du coup, la validation du fichier avec schematron va être difficile.
    Je vais devoir reporter cette étape directement dans mon code java.

    Je trouve quand même dommage de proposer un type de list mais aucun service !

    Merci pour votre aide.

  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 nono_31 Voir le message
    Je trouve quand même dommage de proposer un type de list mais aucun service !
    Il est certain qu'à part la possibilité d'avoir une liste sous forme condensée, les listes de type xs:list ont peu d'avantages... Du point de vue de DOM par exemple, une telle liste est considérée comme un noeud texte qui doit être parsé par du code additionnel pour en obtenir les éléments individuels. Idem pour XSLT, qui est peu doué en l'occurrence pour ce genre de traitement. Pour toutes ces raisons, ce format de données est très peu répandu.

Discussions similaires

  1. Item non unique dans un mx:List
    Par Bastoktok dans le forum Flex
    Réponses: 4
    Dernier message: 17/09/2011, 16h46
  2. Réponses: 20
    Dernier message: 27/07/2010, 15h52
  3. Réponses: 9
    Dernier message: 14/05/2009, 13h35
  4. élément unique dans une combobox
    Par zandru dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 15/07/2008, 11h45
  5. [XSD] element optionnel dans le xsd
    Par barthelus76 dans le forum Valider
    Réponses: 1
    Dernier message: 03/01/2008, 10h50

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