我有一个这样的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,或者可以使用另一种解决方案?
答案 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"/>