XSD 不同元素的独特约束?

问题描述 投票:2回答:1

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

xml xsd xsd-validation xml-validation
1个回答
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元素的范围是分开的。

© www.soinside.com 2019 - 2024. All rights reserved.