2016-11-02 2 views
0

Ich habe ein XML-Dokument wie folgt aus:Key und Keyref Einschränkungen: Wie wählt man "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> 

Ich möchte xs schreiben: Schlüssel und xs: keyref in meiner XSD-Datei, die nur den richtigen Wert von Cname in „d“ Elemente Attribut auf diese Weise ermöglichen, können : Cname value ist nur dann ein gültiger Wert, wenn es ein untergeordnetes Element des bname-Elements ist (wie im Beispiel). Wie kann ich das tun? Ich kann nicht verstehen, wie der xs: selector xpath-Ausdruck es nicht erlaubt, den Attributwert ("@") anzugeben. Ist es möglich, xs: key und xs: keyref zu schreiben, oder gibt es vielleicht eine andere Lösung, die ich benutzen kann?

Antwort

0

Sie können dies nicht mit key und keyref tun, da die XPath-Ausdrücke keine Vergleichselemente zulassen und daher nicht von den tatsächlichen Werten der Attribute abhängen können.

Sie müssen XSD 1.1 Assertions (oder eine andere Technologie, wie Schematron) verwenden. Mit XSD 1.1 würden Sie eine Assertion auf dem <a> Element wie folgt definieren:

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

Danke. Das hat mir geholfen. –

Verwandte Themen