Как проверить список выбора с помощью XML-схемы - PullRequest
2 голосов
/ 09 мая 2009

У меня есть эта проблема, и я не могу на всю жизнь найти простое решение.

Я пытаюсь систематизировать список операционных систем, где 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>, имя которых принадлежит данному набору, и что каждый элемент name появляется не более одного раза.

Недопустимые примеры:

<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 голосов
/ 09 мая 2009

Вы можете использовать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...