2016-11-02 2 views
0

У меня есть документ XML, как это:Ограничения Key и Keyref: как выбрать «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> 

Я хочу написать хз: ключ и хз: KeyRef в моем файле XSD, который может только разрешить правильное значение CNAME атрибут в элементах «D» в этом случае : Значение Cname является допустимым значением, только если оно является дочерним элементом элемента значения Bname (как в примере). Как я могу это сделать? Я не понимаю, как из-за того, что выражение xpath: selector xpath не позволяет указать значение атрибута («@»). Можно ли написать xs: key и xs: keyref или, возможно, есть другое решение, которое я могу использовать?

ответ

0

Вы не можете сделать это с помощью ключа и keyref, потому что выражения XPath не позволяют предикаты и, следовательно, не могут зависеть от фактических значений атрибутов.

Вам нужно будет использовать утверждения XSD 1.1 (или другую технологию, например Schematron). С XSD 1.1 вы должны были бы определить утверждение на элементе <a> следующим образом:

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

Спасибо. Это помогло мне. –