编辑:这不是我最后一个问题的愚蠢,因为我不想再同时做这两件事。
我想指定我的设置节点具有:
<setting name='Some Setting'>
SomeData
</setting>
架构是:
<xs:element name="setting">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="name" type="xs:string" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
或
<setting name='Some Setting'>
<value>SomeData</value>
</setting>
架构是:
<xs:element minOccurs="0" name="setting">
<xs:complexType>
<xs:sequence>
<xs:element name="value" type="xs:string" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
但不是两者。
我无法弄清楚如何在整体架构中将它们组合在一起。 我尝试使用<xs:choice />
但是抱怨说具有相同名称的元素必须属于同一类型
答案 0 :(得分:4)
我认为你最接近的是使用mixed="true"
,如下所示:
<xs:complexType>
<xs:sequence>
<xs:element name="setting">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="value" type="xs:string" minOccurs="0" />
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
这允许您将简单内容和组合成value
元素。
使用此模式,以下XML将被视为有效:
仅限简单内容:
<setting name="Some Setting">SomeData</setting>
仅限子元素:
<setting name="Some Setting">
<value>SomeData</value>
</setting>
这两种:
<setting name="Some Setting">
Some Data
<value>SomeData</value>
</setting>
(3)的可能性绝对不理想,但我认为你不能避免它。您需要有一个处理这种情况的规则。我认为合理的规则是:如果存在value
元素,请使用value
标记之间的数据,否则使用setting
标记之间的数据。
答案 1 :(得分:1)
这些类型的限制无法在XSD中描述,您需要使用其他语言对其进行建模,例如: Schematron的。