我是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不会验证。
你很近。只需使用两个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
元素的范围是分开的。