如何使用XML Schema验证选择列表

时间:2009-05-09 17:32:56

标签: xml xsd

我遇到了这个问题,我不能为我的生活找到一个简单的解决方案。

我正在尝试编写操作系统列表,其中XML文件包含给定人员具有的操作系​​统列表。有一个固定的操作系统列表(XP,Vista,Win7,OSX和Ubuntu) 我有以下XML

<operatingSystems>
   <operatingSystem name="Windows XP" />
   <operatingSystem name="Windows Vista" />
   <operatingSystem name="Windows 7" />
   <operatingSystem name="OS X" />
   <operatingSystem name="Ubuntu Linux" />
</operatingSystems>

<operatingSystems>元素可以包含0个或多个列出的操作系统。

如此有效的例子是:

<operatingSystems>
   <operatingSystem name="Windows XP" />
   <operatingSystem name="OS X" />
   <operatingSystem name="Ubuntu Linux" />
</operatingSystems>

<operatingSystems />

我正在尝试编写一个XSD架构来验证这一点。我的问题是验证<operatingSystems>元素是否仅包含子<operatingSystem>元素的最佳方法是什么,其中名称来自给定集,并且每个名称元素不会出现多次。< / p>

无效的例子是:

<operatingSystems>
   <operatingSystem name="OS X" />
   <operatingSystem name="OS X" />
   <operatingSystem name="Ubuntu Linux" />
</operatingSystems>

<operatingSystems>
   <operatingSystem name="Sun Solaris" />
</operatingSystems>

我试过这个:

<element name="operatingSystems">
  <complexType>
    <sequence>
       <element name="operatingSystem" minOccurs="0" maxOccurs="1">
         <complexType>
           <attribute name="name" fixed="Windows XP" />
         </complexType>
       </element>
       <element name="operatingSystem" minOccurs="0" maxOccurs="1">
         <complexType>
           <attribute name="name" fixed="Windows Vista" />
         </complexType>
       </element>
      .......
     </sequence>
   </complexType>
</element>

但是它忽略了minOccurs为0的事实,如果缺少任何元素操作系统,它会抱怨。

任何帮助都将不胜感激。

由于

1 个答案:

答案 0 :(得分:0)

您可以使用xs:unique元素:

<xs:element name="operatingSystems">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="operatingSystem" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:unique name="oneOperatingSystem">
    <xs:selector xpath="operatingSystem"/>
    <xs:field xpath="@name"/>
  </xs:unique>
</xs:element>
<xs:element name="operatingSystem">
  <xs:complexType>
    <xs:attribute name="name" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:token">
          <xs:enumeration value="Windows XP"/>
          <xs:enumeration value="Windows Vista"/>
          <xs:enumeration value="Windows 7"/>
          <xs:enumeration value="OS X"/>
          <xs:enumeration value="Ubuntu Linux"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>
</xs:element>