我正在尝试为< property>创建一个模式元素必须具有< key>子元素,< val>< shell>中的一个或< perl>和可选的< os>或<条件>,并且子元素的顺序并不重要。
以下是有效< 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> ;.有人可以解释为什么吗? 更重要的是,有人可以提供一种方法来验证这样的<属性>元件?
我可以把三个元素 – < val>< perl>和<壳> – 作为< xs:all>中的可选元素,但是我希望模式验证该元素中只有一个存在于该元素中。这可以做吗
我认为这是一个更好的,因为“选择”现在是自己的元素(typeFacet),但不能直接使用它是抽象的。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="property"> <xs:complexType> <xs:all> <xs:element name="key" type="xs:string" /> <xs:element ref="typeFacet" /> <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:element name="typeFacet" abstract="true" /> <xs:element name="val" type="xs:string" substitutionGroup="typeFacet" /> <xs:element name="perl" type="xs:string" substitutionGroup="typeFacet" /> <xs:element name="shell" type="xs:string" substitutionGroup="typeFacet" /> </xs:schema>