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 :

Validation avec énumération sur la base de la dépendance d'un attribut ? [XSD]


Sujet :

Valider XML

  1. #1
    Membre régulier
    Profil pro
    ERP + Oracle + VBA Excel
    Inscrit en
    Juin 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : ERP + Oracle + VBA Excel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2005
    Messages : 58
    Points : 78
    Points
    78
    Par défaut Validation avec énumération sur la base de la dépendance d'un attribut ?
    Bonjour,

    Je tourne en rond avec un problème, avec un dictionnaire département / fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <depliste>
    	<departement value="30">Production
    		<fonction value="30000">Ouvrier qualifié</fonction>
    		<fonction value="30100">Ouvrier</fonction>
    	</departement>
    	<departement value="31">Direction
    		<fonction value="31000">Directeur</fonction>
    		<fonction value="31100">Administrateur</fonction>
    	</departement>
    </depliste>
    J'arrive bien à valider le département sur l'attribut "value" et séparément l'énumération des fonctions, mais je n'arrive pas à faire une dépendance departement-fonction. Le département "Production" n'a que les fonctions 30000 et 30100.
    J'ai vu ce tuto, https://xml.developpez.com/faq/?page...selon_attribut, mais n'ai pas de variation sur l'attribut.

  2. #2
    Membre régulier
    Profil pro
    ERP + Oracle + VBA Excel
    Inscrit en
    Juin 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : ERP + Oracle + VBA Excel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2005
    Messages : 58
    Points : 78
    Points
    78
    Par défaut
    J'ai trouvé la solution avec xs:assert et l'héritage de l'élément parent puis pour finir une énumération.
    Le seul bémol : Il faut pour cela passer en version XSD 1.1 (donc avoir un outil de validation compatible)

    L'héritage du code du département : permet de récupérer la valeur du code dans l'élément enfant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xs:attribute name="Depvalue" type="xs:int" inheritable="true"/>
    L'assert sur les premières positions du code de la fonction (p.ex dep=30 et fonction=30 000)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <xs:attribute ref="Foncvalue" use="required"/>
    <xs:assert test="matches(substring(string(@Foncvalue),1,3), string(//@Depvalue))" 
    L'énumération qui permet de valider le code fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <xs:simpleType name="code_value">
    		<xs:restriction base="xs:int">
    			<xs:enumeration value="30000"/>
    			<xs:enumeration value="30100"/>
    			<xs:enumeration value="31000"/>
    			<xs:enumeration value="31100"/>
    		</xs:restriction>
    </xs:simpleType>
    le XSD en entier.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:vc="http://www.w3.org/2007/XMLSchema-versioning" elementFormDefault="qualified" attributeFormDefault="unqualified" vc:minVersion="1.1">
    
    	<xs:element name="depliste" type="T_depliste"/>
    
    	<xs:attribute name="Depvalue" type="xs:int" inheritable="true"/>
    	
    	<xs:attribute name="Foncvalue" type="code_value"/>
    	
    	<xs:complexType name="T_depliste">
    		<xs:sequence>
    			<xs:element name="departement" type="T2_departement" maxOccurs="unbounded"/>
    		</xs:sequence>
    	</xs:complexType>
    	
    	<xs:complexType name="T3_fonction">
    		<xs:simpleContent>
    			<xs:extension base="ST3_fonction">
    				<xs:attribute ref="Foncvalue" use="required"/>
    				<xs:assert test="matches(substring(string(@Foncvalue),1,3), string(//@Depvalue))" />
    			</xs:extension>
    
    		</xs:simpleContent>
    	</xs:complexType>
    	<xs:complexType name="T2_departement" mixed="true">
    		<xs:sequence>
    			<xs:element name="fonction" type="T3_fonction" maxOccurs="unbounded"/>
    		</xs:sequence>
    		<xs:attribute ref="Depvalue" use="required"/>
    	</xs:complexType>
    	
    	<xs:simpleType name="ST3_fonction">
    		<xs:restriction base="xs:string"/>
    	</xs:simpleType>
    	
    	<xs:simpleType name="code_value">
    		<xs:restriction base="xs:int">
    			<xs:enumeration value="30000"/>
    			<xs:enumeration value="30100"/>
    			<xs:enumeration value="31000"/>
    			<xs:enumeration value="31100"/>
    		</xs:restriction>
    	</xs:simpleType>
    	
    </xs:schema>

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    La nécessité du 1.1 est un assez gros bémol, dans la mesure où tu vas vite te rendre compte que personne ne le gère (si tu fais du XML avec validation, c'est pas pour rester seul dans ton coin avec le validateur que tu as trouvé.)

    Raison pour laquelle j'avais prévu dès que j'ai le temps de montrer comment le lien que tu avais trouvé, pouvait s'adapter à ton cas. Seulement voilà, il nécessite des attributs xsi:type dans ton document XML, que tu n'as sans doute pas envie d'ajouter. Pas de solution réaliste donc. Fondamentalement, c'est une vérification que XSD n'est pas censé faire.

    Mais si tu es satisfait de ce que tu as, tant mieux.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre régulier
    Profil pro
    ERP + Oracle + VBA Excel
    Inscrit en
    Juin 2005
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : ERP + Oracle + VBA Excel
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2005
    Messages : 58
    Points : 78
    Points
    78
    Par défaut Co-occurrence Constraints et Conditional Type Assignment uniquement en XML Schema 1.1
    Bonjour,

    En effet c'est malheureusement le gros problème .

    J'était en premier radicalement sur cette position :
    Citation Envoyé par thelvin Voir le message
    .... Fondamentalement, c'est une vérification que XSD n'est pas censé faire.
    Ces recherches me permettent d'affiner en :
    Fondamentalement, c'est une vérification que XSD n'est pas censé faire, en tout cas dans la version 1.0 qui est encore le standard très majoritairement employé.


    Effectivement ce n'est pas pris en charge par la plus grande partie des validations disponibles, mais aussi notamment dans les bibliothèques XML de la suite Microsoft Office (VB, VBA).
    MSXML2 ne supporte (actuellement) que la version 1.0. du XSD. Comme une grande partie des projets concernés par ces recherches sont développés autour du VB/VBA ....

  5. #5
    Membre émérite Avatar de tsuji
    Inscrit en
    Octobre 2011
    Messages
    1 558
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 558
    Points : 2 736
    Points
    2 736
    Par défaut
    Je tiens à vous signaler que le schéma (v1.1) ainsi arrivé n'est pas encore tout à fait correct.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <xs:assert test="matches(substring(string(@Foncvalue),1,3), string(//@Depvalue))" />
    Ceci, avec @heritable="true" sur @Depvalue de department, la façon correcte de simplement comme ça.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <xs:assert test="matches(substring(string(@Foncvalue),1,3), string(@Depvalue))" />
    comme si l'élément possède l'attribut Depvalue, prenant de l'avantage de @heritage="true" de son parent. L'axes // devant lui rend l'écriture incorrecte fonctionellement en validant le xml.

    Pour une illustration, on peut ne pas mettre @heritable du tout, c'est-à-dire, false. Dans ce cas, il suffit de l'écrire comme ça.
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <xs:assert test="matches(substring(string(@Foncvalue),1,3), string(parent::*/@Depvalue))" />
    ou un peu plus poussé, dans le cas nécessaire:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    <xs:assert test="matches(substring(string(@Foncvalue),1,3), string(ancestor::*/@Depvalue))" />

    Voilà ! un très bon effort. Comme vous êtes dans une position de mieux apprécier schéma v1.1, vous pouvez consulter mes interventions antérieures:
    http://www.developpez.net/forums/d11...valeurs-texte/
    http://www.developpez.net/forums/d13...es-dattributs/

    Je remarque aussi que, dans ce cas-ci, il n'est pas question de lier aux cas ou un besoin de xsi:type soit nécessaire ou, par extrapolation, ainsi évité. Ce n'est pas de cas du tout ici. Et puis, les travaux des gens pour mettre en place de schéma v1.1 dans le projet xerces-j encore en beta sont tout à fait louables et je trouve insupportable en les raillant comme travailler dans un petit coin et n'apprécier que par un tout petit monde. Je dirais que les bigoterie et ignorance passent, seules restent le progrès méritoire des sciences et les travaux sérieux.

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

Discussions similaires

  1. Requête avec select sur 3 bases
    Par maloue dans le forum Développement
    Réponses: 1
    Dernier message: 20/07/2015, 12h07
  2. Problème de date avec Coldfusion sur une base Oracle
    Par HappyTreeFred dans le forum Coldfusion
    Réponses: 7
    Dernier message: 13/02/2009, 08h33
  3. [ODBC] Pb de requète avec jointure sur 2 bases
    Par Invité dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/12/2006, 16h46
  4. Problème avec les indexes sur une base de données.
    Par osoudee dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/02/2006, 09h24
  5. Problémes mémoire avec le bde sur des bases paradox
    Par Keke des Iles dans le forum Bases de données
    Réponses: 2
    Dernier message: 27/05/2004, 16h55

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