我需要在XML Schema 1.0下定义一个验证规则,它允许元素在一组兄弟元素中出现(一次),只有当另一个特定的兄弟元素具有某个值时才会发生。
例如,给定实例XML文档片段
<root>
<parent>
<child1>A</child1>
</parent>
<parent>
<child1>B</child1>
<chlld2>C</child2>
</parent>
</root>
我希望规则允许child2元素仅在必需的child1元素的值为'B'时才出现,否则,child1元素应该在给定的父元素下自行出现。
使用xs:assert在XML Schema 1.1下很容易实现,但1.0版本的解决方案避开了我。
非常感谢任何见解。
答案 0 :(得分:2)
XSD 1.0中的常用方法是以不同的方式设计XML:如果我们为child1设置了一个特定值B,这使得child2的出现成为可能,那么我们可以将child1拆分为两个元素类型:child1-notB和child1-B 。因为在child1-B的情况下我们知道值,所以实际上不需要存在该值。 XML变为:
<root>
<parent>
<child1-notB>A</child1-notB>
</parent>
<parent>
<child1-B/>
<chlld2>C</child2>
</parent>
</root>
编写内容模型很简单,其中父元素包含child1-notB或child1-B,后跟可选的child2。
正如Dijkgraaf已经观察到的那样,您描述的具体设计无法在XSD 1.0中表达。 XSD 1.1添加断言的部分原因是因为很多人都想要像你描述的那样设计,其中两个完全不同的元素,对于什么是允许的和不允许的,具有不同的影响,但是它们被赋予相同的名称以掩盖它们的区别在意义上,而不是被不同的名称调用,以使他们在语义上的显着差异。