Key和Keyref约束:如何选择“xs:selector”?

时间:2016-11-02 16:32:55

标签: xml xpath xsd

我有一个这样的XML文档:

<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>

我想在我的XSD文件中编写xs:key和xs:keyref,它只能以这种方式在“d”元素中允许Cname属性的正确值:Cname值只有在它的子元素时才是有效值Bname值元素(如示例中所示)。 我怎样才能做到这一点?我无法理解,因为xs:selector xpath表达式不允许指定属性值(“@”)。是否可以编写xs:key和xs:keyref,或者可以使用另一种解决方案?

1 个答案:

答案 0 :(得分:0)

您不能使用key和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"/>