如何在xsd模式中定义XML元素以使所有子元素具有相同的属性值?

时间:2013-07-02 11:07:35

标签: xml xsd xsd-validation

<root>
<elem type="1" id="1"/>
<elem type="1" id="2"/>
</root>

我想检查XSD架构,以便所有元素都应具有“type”的相同属性值。 假设一个元素的type =“1”而另一个元素的type =“2”,那么我希望模式验证失败。 如何在Schema中限制它?

2 个答案:

答案 0 :(得分:1)

我认为在xsd 1.0中不可能。

我不知道你到底在做什么,但在这种情况下,它会给我一个感觉,有一些包裹元素,例如elems会保持这个价值。因此

<root>
   <elems type="1">
      <elem id="1"/>
      <elem id="2"/>
   </elems>
</root>

答案 1 :(得分:1)

如果您想要单个值类型,为什么不将该单个值放在一个位置,而不是在多个位置复制它?也就是说,为什么不以这种方式构建XML呢?

<root type="1">
  <elem id="1"/>
  <elem id="2"/>
</root>

不允许不同元素具有不同类型值的事实表明,类型并不严格地说是elem的属性,而是整个文档的属性。

这样,XML的结构已经保证了类型只有一个值,而不是允许您或验证者必须添加额外的临时检查的不一致。

可能还有一些更复杂的方法可以确保类型只有一个值(可能是一些非常聪明的键和keyref约束;在XSD 1.1中,使用断言;使用外部或内部Schematron断言),但是当有这么简单的选择时,我不想鼓励他们使用。