我正在尝试为<property>
元素创建一个模式,该模式必须包含<key>
个子元素,以及<val>
,<shell>
或{{1}之一和一个可选的<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>
中的可选元素,但我希望架构能够验证该元素元素中存在三个中的一个。可以这样做吗?
答案 0 :(得分:22)
我认为这有点好,因为“选择”现在是它自己的元素(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>
答案 1 :(得分:7)
基于newt关于使用替换组进行选择的评论(使用xmllint测试):
<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="val"/>
<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="val" type="xs:string"/>
<xs:element name="perl" type="xs:string" substitutionGroup="val" />
<xs:element name="shell" type="xs:string" substitutionGroup="val" />
</xs:schema>