我对XSD验证还很陌生,因此可能缺少一些关键的内容,但是我环顾了四周,似乎找不到合适的解决方案。
我想做的是这样的:
考虑这个XML示例,我被迫使用(简化)
.
.
.
<categories>
<orange id="1" value="10">...</orange>
<orange id="2" value="10">...</orange>
<brown id="1" value="10">...</brown>
<brown id="2" value="10">...</brown>
<brown id="3" value="10">...</brown>
.
.
.
</categories>
基本上,我想确保所有橙色类别和棕色类别的ID都是唯一的,但总体上不是唯一的。
我最初的XSD看起来像这样:
.
.
.
<xs:element name="categories">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="orange">
<xs:complexType>
<xs:attribute name="id" type="xs:integer" use="required"/>
<xs:attribute name="value" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="brown ">
<xs:complexType>
<xs:attribute name="id" type="xs:integer" use="required"/>
<xs:attribute name="value" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:key name="catKeys">
<xs:selector xpath="/*" />
<xs:field xpath="@id" />
</xs:key>
</xs:element>
XSD上方检查所有类别的id唯一性-> XML不会验证。
答案 0 :(得分:2)
您非常亲密。只需使用两个xs:key
元素,orange
和brown
中的每个元素:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="categories">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="orange">
<xs:complexType>
<xs:attribute name="id" type="xs:integer" use="required"/>
<xs:attribute name="value" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="brown ">
<xs:complexType>
<xs:attribute name="id" type="xs:integer" use="required"/>
<xs:attribute name="value" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:key name="orangeKeys">
<xs:selector xpath="orange"/>
<xs:field xpath="@id"/>
</xs:key>
<xs:key name="brownKeys">
<xs:selector xpath="brown"/>
<xs:field xpath="@id"/>
</xs:key>
</xs:element>
</xs:schema>
然后,您的XML将是有效的,因为它具有唯一的id
元素,并且其范围分别与orange
和brown
元素分开。