Bonjour à tous,
Je suis confronté à un petit problème avec les schémas et je me reporte à votre grande expérience et sagesse dans le domaine pour m’aider à le résoudre ;-) J’utilise le XML pour les données d’entrées d’un programme que j’ai écrit en C++ pour la manipulation de graphes. Je vous donne le code du schéma (que j’ai simplifié au maximum : ne vous inquiétez pas si vous trouvez certaines structures inutilement complexes : j’ai enlevé beaucoup d’éléments non pertinents pour le problème).
Dans mon schéma, un arbre (arc = relation, nœud = paramètre) est défini de manière récursive comme suit :
- Une relation de base appelée rootRelation est le premier élément de l’arbre.
- Ensuite chaque relation est composée :
o D’un élément rootParameter (type string) désignant le paramètre parent de l’arbre : il est obligatoire
o Dans le cas d’une branche avec un seul descendant nous trouvons un élément subParameter (type string) et subRelation désignant respectivement le paramètre fils et la relation de plus bas niveau
o De la même manière pour les branches avec deux descendants nous avons deux paramètres (type string) et deux sous-relations
o Dans le cas où il n’y a pas de successeur, seul le paramètre rootParameter est présent dans l’élément structure.
Une liste de paramètres au même niveau que rootRelation contient tous les paramètres du modèle avec pour chacun d’eux un élément unique /name/ (type string).
Le but que je recherche est double :
- Chaque paramètre de /parameterList/ doit posséder un /name/ unique
- Chaque paramètre utilisé dans l’arbre (soit rootParameter, subParameter, subParameter1 et subParameter2) doit correspondre à un paramètre défini dans la liste des paramètres.
Pour cela j’utilise le mécanisme de clés sur la liste de paramètres (garantit bien l’unicité de la valeur du paramètre ciblé c’est-à-dire /name/) et la référence à la clé via un chemin de localisation xpath. Le problème c’est que ça marche bien pour l’unicité du nom des paramètres (key) mais pour les keyrefs je suis obligé de spécifier le chemin xpath complet ce qui ne me permet pas d’atteindre tous les éléments rootParameter et subParameter puisque la structure est récursive mais pas le chemin (dans l’exemple je désigne le premier rootParameter comme simple exemple).
Si quelqu’un pouvait m’aider à résoudre ce problème combiné de déclaration récursive et d’unicité des valeurs dans une telle structure, je lui en serais fort reconnaissant J
Merci d’avance ;-)
Alexis
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84 <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="relation"> <xs:complexType> <xs:sequence> <xs:element name="rootRelation" type="relationType"> </xs:element> <xs:element name="parameterList" type="parameterListType"> </xs:element> </xs:sequence> </xs:complexType> <xs:key name="parameterKey"> <xs:selector xpath="./parameterList/parameter"></xs:selector> <xs:field xpath="name"></xs:field> </xs:key> <xs:keyref refer="parameterKey" name="parameterKeyRef"> <xs:selector xpath="./rootRelation/structure"></xs:selector> <xs:field xpath="rootParameter"></xs:field> </xs:keyref> </xs:element> <xs:complexType name="relationType"> <xs:sequence minOccurs="1" maxOccurs="1"> <xs:element name="structure"><xs:complexType> <xs:sequence> <xs:element name="rootParameter" type="xs:string"> </xs:element> <xs:choice minOccurs="0" maxOccurs="1"> <xs:sequence> <xs:element name="subRelation" type="relationType"> </xs:element> <xs:element name="subParameter" type="xs:string"> </xs:element> </xs:sequence> <xs:sequence> <xs:element name="subRelation1" type="relationType"> </xs:element> <xs:element name="subParameter1" type="xs:string"> </xs:element> <xs:element type="relationType" name="subRelation2"> </xs:element> <xs:element name="subParameter2" type="xs:string"> </xs:element> </xs:sequence> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="parameterListType"> <xs:sequence> <xs:element minOccurs="1" maxOccurs="unbounded" type="parameterType" name="parameter"> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="parameterType"> <xs:sequence> <xs:element name="name" type="xs:string"> </xs:element> </xs:sequence> </xs:complexType> </xs:schema>
Partager