Я пытаюсь создать схему для элемента <property>
, который должен иметь подэлемент <key>
и один из <val>
, <shell>
или <perl>
и необязательный <os>
или <condition>
, и порядок подэлементов не имеет значения.
Вот некоторые примеры допустимых <property>
элементов:
<property>
<key>A</key>
<val>b</val>
</property>
<property>
<key>A</key>
<val>b</val>
<os>Windows</os>
</property>
<property>
<condition>a == 1</condition>
<key>A</key>
<perl>1+1</perl>
<os>unix</os>
</property>
В идеале я подумал об использовании <xs:all>
для этого:
<xs:element name="property">
<xs:complexType>
<xs:all>
<xs:element name="key" type="xs:string" />
<xs:choice>
<xs:element name="val" type="xs:string" />
<xs:element name="perl" type="xs:string" />
<xs:element name="shell" type="xs:string" />
</xs:choice>
<xs:element name="os" type="xs:string" minOccurs="0" />
<xs:element name="condition" type="xs:string" minOccurs="0" />
</xs:all>
</xs:complexType>
</xs:element>
Но я обнаружил, что <xs:all>
может содержать только <xs:element>
, а не <xs:choice>
. Может кто-нибудь объяснить, почему это так?
Что еще более важно, может кто-нибудь предоставить способ проверки такого <property>
элемента?
Я могу поместить три элемента - <val>
, <perl>
и <shell>
- в качестве необязательных элементов в <xs:all>
, но я хочу, чтобы схема проверяла, что один и только один из трех существует в элементе , Можно ли это сделать?