Contraintes sur schéma XML

Contraintes sur schéma XML - XML/XSL - Programmation

Marsh Posté le 04-12-2003 à 11:33:44    

Salut à tous,
 
J'ai réalisé un schéma XML qui représente une topologie réseau avec toute sorte d'informations dedans. Je vérifie déjà certaines contraintes mais il y en a certaines que j'aimerais pouvoir vérifier mais, jusqu'à présent, c'est sans grand succès...
 
1/ J'ai un élément de cette forme :

Code :
  1. <wireless range="45" speed="2"/>


où les deux attributs ne sont pas obligatoires. Cependant, j'aimerais pouvoir vérifier qu'au moins un des deux attributs est présent... Est-ce que cela est possible ?
 
2/ J'ai un autre élément de cette forme :

Code :
  1. <link id="0" from="135.89.2.22" to="135.89.2.23">
  2.    <mpls>
  3.     <srlg id="1"/>
  4.     <srlg id="2"/>
  5.    </mpls>
  6. </link>


où l'attribut "id" de "link" est une clé et où l'attribut "id" de "srlg" se réfère à un identifiant de lien. J'aimerais pouvoir également vérifier que les couples de la forme (id link, id srlg) sont uniques... Est-ce que cela est possible ?
 
Merci d'avance pour vos réponses.

Reply

Marsh Posté le 04-12-2003 à 11:33:44   

Reply

Marsh Posté le 04-12-2003 à 11:48:41    

Sigmund a écrit :

Salut à tous,
 
J'ai réalisé un schéma XML qui représente une topologie réseau avec toute sorte d'informations dedans. Je vérifie déjà certaines contraintes mais il y en a certaines que j'aimerais pouvoir vérifier mais, jusqu'à présent, c'est sans grand succès...
 
1/ J'ai un élément de cette forme :

Code :
  1. <wireless range="45" speed="2"/>


où les deux attributs ne sont pas obligatoires. Cependant, j'aimerais pouvoir vérifier qu'au moins un des deux attributs est présent... Est-ce que cela est possible ?
 
2/ J'ai un autre élément de cette forme :

Code :
  1. <link id="0" from="135.89.2.22" to="135.89.2.23">
  2.    <mpls>
  3.     <srlg id="1"/>
  4.     <srlg id="2"/>
  5.    </mpls>
  6. </link>


où l'attribut "id" de "link" est une clé et où l'attribut "id" de "srlg" se réfère à un identifiant de lien. J'aimerais pouvoir également vérifier que les couples de la forme (id link, id srlg) sont uniques... Est-ce que cela est possible ?
 
Merci d'avance pour vos réponses.

Pour le 1 ca doit pouvoir se faire avec un outil integrant des possibilités de contraintes. J'irais voir du coté de http://relaxng.org/
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 04-12-2003 à 21:40:30    

gilou a écrit :

Pour le 1 ca doit pouvoir se faire avec un outil integrant des possibilités de contraintes. J'irais voir du coté de http://relaxng.org/
A+,


 
OK, merci j'irai jeter un coup d'oeil...
 
Sinon, pour le 2, personne n'a une idée ?

Reply

Marsh Posté le 05-12-2003 à 10:10:11    

gilou a écrit :

Pour le 1 ca doit pouvoir se faire avec un outil integrant des possibilités de contraintes. J'irais voir du coté de http://relaxng.org/
A+,


 
J'ai regardé le lien que tu m'as donné. En fait, ce que j'aimerais pouvoir faire, c'est utiliser le langage XML Schema du W3C pour vérifier ces contraintes, et, d'après ce que j'ai pu lire, Relax NG est un autre langage de schéma XML...

Reply

Marsh Posté le 05-12-2003 à 11:37:14    

Ca m'a l'air faisable avec une DTD et par extension en XSD (XML Schemas) mais j'ai jamais utilisé ce dernier...
 

Reply

Marsh Posté le 05-12-2003 à 14:01:23    

Avander a écrit :

Ca m'a l'air faisable avec une DTD et par extension en XSD (XML Schemas) mais j'ai jamais utilisé ce dernier...


 
Je le pense aussi mais plus je cherche et moins je trouve. J'ai beau éplucher les documents du W3C, je trouve rien qui parle de cela. Ils avaient bien mis un exemple qui répondait à ma deuxième question dans un de leur document mais il a été supprimé dans l'errata :D.
 
Sinon, tu ferais comment avec une DTD (ça pourrait peut-être m'aider quand même, on sait jamais ;)) ?

Reply

Marsh Posté le 05-12-2003 à 15:11:42    

1/ Pour contourner le problème tu pourrait peut-être définir une valeur par défaut dans la DTD pour un des attributs, comme ceci :  
 

<!ATTLIST chapter
  id ID #REQUIRED
  creationDate CDATA '19800101'
  revisionDate CDATA '19800101'
  type CDATA #FIXED "chapter"
  layout ( portrait|landscape) "portrait"
 >


 
Pour celui qui crée l'xml l'attribut creationDate n'est pas obligatoire, si tu parse l'xml avec la DTD en cas d'absence tu obtiendras toujours l'attribut avec la valeur par défaut dedans. L'attribut layout est analogue sauf que la tu spécifies la liste des valeurs authorisées et entre " la valeur par défaut.  

Reply

Marsh Posté le 05-12-2003 à 15:25:53    

2/ Si tu veut que l'id de link soit unique et que l'id de srlg pointe toujours vers un id de link qui existe, il te faut qq. chose comme ceci dans la DTD :  
 


 
 <!ELEMENT link ( mpls)>
 <!ATTLIST link
  id ID #REQUIRED>
...
 <!ELEMENT srlg ( #PCDATA)>
 <!ATTLIST srlg
  id IDREF #REQUIRED>
...


Reply

Marsh Posté le 05-12-2003 à 19:54:43    

Avander a écrit :

1/ Pour contourner le problème tu pourrait peut-être définir une valeur par défaut dans la DTD pour un des attributs...


 
En fait, je ne veux pas mettre une valeur par défaut. Je veux juste qu'au niveau des contraintes du schéma je puisse spécifier le nombre d'attributs minimum qu'un élément doit avoir pour être valide. Autrement dit, je veux pouvoir vérifier lors de la validation du fichier à l'aide d'un validateur classique que l'attribut speed est présent ou que l'attribut range est présent ou que les deux sont présents. Mettre une valeur par défaut ne m'aidera pas puisque je ne saurai pas dire au niveau de la validation que le créateur de la topologie a donné au moins un des deux attributs.
 

Avander a écrit a écrit :

2/ Si tu veut que l'id de link soit unique et que l'id de srlg pointe toujours vers un id de link qui existe...




 
Ca, je l'ai déjà. L'id de link est une clé et l'id de srlg pointe vers un id de link. Ce que je voudrais, c'est dire que les couples (id link, id srlg) sont uniques donc que les couples (0,1) et (0,2) sont uniques. Cela pourrait me servir à vérifier le fait que l'utilisateur n'a pas entré deux fois le même srlg pour un même link.
 
J'espère que mon explication est plus claire maintenant (quoique :D)... Merci pour ta réponse en tout cas.

Reply

Marsh Posté le 06-12-2003 à 03:06:36    

Bon apres y avoir reflechi a tete reposée...
 
Pour le 1:  
Tu ne peux pas exprimer celà avec XML Schema seulement. Mais si tu etends XML Schema avec des regles Schematron, tu peux exprimer ce type de contraintes.  
Ca donnerait dans ton cas:
[sans regles schematron]

Code :
  1. <xs:element name="wireless">
  2.     <xs:complexType>
  3.         <xs:attribute name="range" type="xs:string" use="optional"/>
  4.         <xs:attribute name="speed" type="xs:string" use="optional"/>
  5.     </xs:complexType>
  6. </xs:element>


 
[avec regles schematron]

Code :
  1. <xs:element name="wireless">
  2.     <xs:annotation>
  3.         <xs:appinfo>
  4.             <sch:pattern name="Au moins un des deux attributs presents" xmlns:sch="http://www.ascc.net/xml/schematron">
  5.                 <sch:rule context="wireless">
  6.                     <sch:assert test="@range | @speed">L'un des deux attributs range ou speed doit etre present sur l'élement wireless</sch:assert>
  7.                 </sch:rule>
  8.             </sch:pattern>
  9.          </xs:appinfo>
  10.      </xs:annotation>
  11.      <xs:complexType>
  12.          <xs:attribute name="range" type="xs:string" use="optional"/>
  13.          <xs:attribute name="speed" type="xs:string" use="optional"/>
  14.      </xs:complexType>
  15. </xs:element>


 
Pour Schematron est ses liens avec XML Schema, lire ceci: http://www.topologi.com/resources/ [...] paper.html
 
Pour le 2:  
Normalement ca se realise avec l'element key de XML Schema, qui implique une contrainte d'unicité:
 

Code :
  1. <xs:element name="srlg">
  2. .............
  3.     <xs:key name="couple">
  4.         <xs:selector xpath="."/>
  5.         <xs:field xpath="../../@id"/>
  6.         <xs:field xpath="@id"/>
  7.     </xs:key>
  8. </xs:element>


 
A+,


Message édité par gilou le 06-12-2003 à 03:09:39

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-12-2003 à 03:06:36   

Reply

Marsh Posté le 06-12-2003 à 11:16:53    

gilou a écrit :

Bon apres y avoir reflechi a tete reposée...
 
Pour le 1:  
Tu ne peux pas exprimer celà avec XML Schema seulement. Mais si tu etends XML Schema avec des regles Schematron, tu peux exprimer ce type de contraintes.


 
Ok merci pour le lien. J'ai regardé et ça a l'air vraiment intéressant cet outil.
 

gilou a écrit a écrit :

 
Pour le 2:  
Normalement ca se realise avec l'element key de XML Schema, qui implique une contrainte d'unicité:
 

Code :
  1. <xs:element name="srlg">
  2. .............
  3.     <xs:key name="couple">
  4.         <xs:selector xpath="."/>
  5.         <xs:field xpath="../../@id"/>
  6.         <xs:field xpath="@id"/>
  7.     </xs:key>
  8. </xs:element>






 
L'expression XPath ../ n'est pas supporté par XML Schema. J'avais déjà essayé cette possibilité avec la contrainte <unique> mais ça ne marchait pas non plus. J'ai quand même réessayer ta proposition avec deux validateurs différents mais le résultat est le même...
 
Sans vouloir abuser, j'ai une question supplémentaire. Dans mon schéma, j'ai un élément de la forme suivante :

Code :
  1. <lsp id="2">
  2.    ...
  3.    <type>Backup</type>
  4.    <backup>
  5.     ...
  6.    </backup>
  7.   </lsp>


avec id et type qui doivent obligatoirement être présents. type ne peut être égal qu'à Backup ou Primary. L'élément <backup>, lui, est optionnel. Est-ce qu'il y a moyen de vérifier avec XSD que si et seulement si le type est égal à Backup, alors l'élément <backup> est présent ? Sinon, je suppose, pour avoir parcouru le document dont tu m'as donné l'adresse, qu'il y a moyen avec Schematron ?
 
Merci d'avance.

Reply

Marsh Posté le 06-12-2003 à 12:05:28    

Sigmund a écrit :


L'expression XPath ../ n'est pas supporté par XML Schema. J'avais déjà essayé cette possibilité avec la contrainte <unique> mais ça ne marchait pas non plus. J'ai quand même réessayer ta proposition avec deux validateurs différents mais le résultat est le même...
 

.. est l'abbreviation xpath de parent::node() et ca devrait marcher.
Essayes alors: ancestor::link/attribute::id au lieu de ../../@id
(on remonte au premier ancetre de type link et on selectionne l'attribut id dessus).
 
EDIT: je viens de voir le pb: ce qui est admis ici est du restricted XPATH et pas du full XPATH: http://www.w3.org/TR/xmlschema-1/# [...] constraint
On ne peut pas remonter dans la hierarchie avec .. ou ancestor :/
Donc on est coincé (je comprends bien les raisons d'implementation sous jacentes qui sont a l'origine de cette restriction).
A priori, alors, pas de solution.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-12-2003 à 12:25:38    

Sigmund a écrit :


 
 
Sans vouloir abuser, j'ai une question supplémentaire. Dans mon schéma, j'ai un élément de la forme suivante :

Code :
  1. <lsp id="2">
  2.    ...
  3.    <type>Backup</type>
  4.    <backup>
  5.     ...
  6.    </backup>
  7.   </lsp>


avec id et type qui doivent obligatoirement être présents. type ne peut être égal qu'à Backup ou Primary. L'élément <backup>, lui, est optionnel. Est-ce qu'il y a moyen de vérifier avec XSD que si et seulement si le type est égal à Backup, alors l'élément <backup> est présent ? Sinon, je suppose, pour avoir parcouru le document dont tu m'as donné l'adresse, qu'il y a moyen avec Schematron ?
 
Merci d'avance.


Ce que tu veux verifier, c'est que si le contenu de l'element type est la chaine backup alors on a aussi l'element backup??
en XML Schema je pense pas qu'on puisse faire (on ne doit pas pouvoir poser de contraintes sur le contenu d'un noeud texte non typé en XML Schema je pense)
Par contre, ca doit pouvoir se faire en Schematron sans trop de pb avec 2 regles.
Notes que ton modele est bizarre: pourquoi ne pas avoir cree un element "type" vide, support d'attribut a 2 valeurs, Backup ou Primary?
Bon, je tape ca assez a la bourre; j'y rejeterai un oeil ce soir.
A+,


Message édité par gilou le 06-12-2003 à 12:26:46

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-12-2003 à 13:51:38    

gilou a écrit :


Donc on est coincé (je comprends bien les raisons d'implementation sous jacentes qui sont a l'origine de cette restriction).
A priori, alors, pas de solution.


 
C'est ce que je craignais :/. Sinon, je vois pas trop pourquoi ils ont restreint le XPath à ce point... Est-ce que tu penses que Schematron pourrait résoudre le problème ?
 

gilou a écrit a écrit :

 
Ce que tu veux verifier, c'est que si le contenu de l'element type est la chaine backup alors on a aussi l'element backup??




 
Exact.
 

gilou a écrit a écrit :

 
en XML Schema je pense pas qu'on puisse faire (on ne doit pas pouvoir poser de contraintes sur le contenu d'un noeud texte non typé en XML Schema je pense)
Par contre, ca doit pouvoir se faire en Schematron sans trop de pb avec 2 regles.




 
Ok merci. J'essayerai de le faire alors.
 

gilou a écrit a écrit :

 
Notes que ton modele est bizarre: pourquoi ne pas avoir cree un element "type" vide, support d'attribut a 2 valeurs, Backup ou Primary?
Bon, je tape ca assez a la bourre; j'y rejeterai un oeil ce soir.
A+,




 
Euh en fait, c'est mon deuxième schéma :D ! Donc il est possible que ce ne soit pas du tout optimal. Cependant, je ne comprends pas trop ce que tu veux dire. Voici ce que j'ai fais pour l'élément type :


<element name="type">
 <simpleType>
  <restriction base="string">
   <enumeration value="Primary"/>
   <enumeration value="Backup"/>
  </restriction>
 </simpleType>
</element>


 
C'est pas bon ?
 
Merci d'avance pour ta réponse.

Reply

Marsh Posté le 07-12-2003 à 18:53:19    

Up :bounce: !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed