XSD <xs:key>为不同元素分别设置唯一性约束吗?

时间:2019-04-01 16:06:36

标签: xml xsd xsd-validation xml-validation

我对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不会验证。

1 个答案:

答案 0 :(得分:2)

您非常亲密。只需使用两个xs:key元素,orangebrown中的每个元素:

<?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元素,并且其范围分别与orangebrown元素分开。

相关问题