2016-11-02 3 views
0

J'ai un document XML comme ceci:Contraintes de Key et Keyref: comment choisir "xs: selector"?

<a> 
    <b name="OneB"> 
     <c name="OneC"/> 
    </b> 
    <b name="TwoB"> 
     <c name="TwoC"/> 
    </b> 

    <d Bname="OneB" Cname="OneC"/> <!-- Correct --> 
    <d Bname="TwoB" Cname="TwoC"/> <!-- Correct --> 
    <d Bname="OneB" Cname="TwoC"/> <!-- Wrong --> 
    <d Bname="TwoB" Cname="OneC"/> <!-- Wrong --> 
</a> 

Je veux écrire xs: key et xs: keyref dans mon fichier XSD qui ne peut permettre la bonne valeur de Cname attribut dans les éléments « d » de cette façon : La valeur Cname est une valeur valide uniquement s'il s'agit d'un enfant de l'élément de valeur Bname (comme dans l'exemple). Comment puis-je faire cela? Je ne peux pas comprendre comment parce que l'expression xs: selector xpath ne permet pas de spécifier la valeur de l'attribut ("@"). Est-il possible d'écrire xs: key et xs: keyref ou peut-être y a-t-il une autre solution que je peux utiliser?

Répondre

0

Vous ne pouvez pas le faire avec key et keyref car les expressions XPath n'autorisent pas les prédicats et ne peuvent donc pas dépendre des valeurs réelles des attributs.

Vous devrez utiliser des assertions XSD 1.1 (ou une technologie différente, comme Schematron). Avec XSD 1.1, vous devez définir une assertion sur l'élément <a> comme ceci:

<xs:assert test="every $d in d satisfies 
       some $b in b satisfies $d/@Cname = $b/c/@name 
           and $d/@Bname = $b/@name"/> 
+0

Merci. Cela m'a aidé. –