XML 元素选择,但当 maxOccurs 不受限制时,元素类型相同
XML Choice of elements, but of same type when maxOccurs is unbounded
我正在尝试使用带有选择的 XSD 模式在 XML 文件中定义一个元素,这并不难:
<xs:complexType abstract="true"
name="ESAPIObject">
<xs:sequence>
<xs:element name="PropertyName"
type="xs:string"/>
<xs:element name="Condition"
minOccurs="1"
maxOccurs="unbounded">
...
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BeamObject">
<xs:complexContent>
<xs:extension base="ESAPIObject">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="DoseObject">
<xs:complexContent>
<xs:extension base="ESAPIObject">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="StructureObject">
<xs:complexContent>
<xs:extension base="ESAPIObject">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="Beam"
type="BeamObject"/>
<xs:element name="Dose"
type="DoseObject"/>
<xs:element name="Structure"
type="StructureObject"/>
<xs:group name="actualValueType">
<xs:choice>
<xs:element ref="Beam"/>
<xs:element ref="Dose"/>
<xs:element ref="Structure"/>
</xs:choice>
</xs:group>
<xs:complexType name="SimpleConditionType">
<xs:sequence>
<xs:element name="ActualValue">
<xs:complexType>
<xs:choice>
<xs:group ref="actualValueType" minOccurs="1" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
然而,令人恼火的是 ActualValue
中的 choice 元素可能会重复,但前提是它与之前的元素来自同一类型?
因此只有结构元素或光束元素或剂量元素而不是它们的混合,例如:
<ActualValue>
<Structure />
<Structure />
</ActualValue>
或
<ActualValue>
<Beam />
<Beam />
</ActualValue>
或
<ActualValue>
<Dose />
<Dose />
</ActualValue>
但不是:
<ActualValue>
<Structure />
<Dose />
</ActualValue>
我在 XSD 中找不到实现此功能的方法。有什么建议吗?
我在你的文章中发现了一些错误 XSD:
- 您定义了一个重复选择而不是具有重复成员的选择
- 您的组引用周围有多余的
- 您的全局组 'ActualValueType' 应该是 'ActualValueGroup'(组不是类型,因此区分很重要)
为了更容易地测试你的xsd,我做了ActualValue
一个全局元素声明。
进行这些更改后,我得到了这个:
<xs:group name="actualValueGroup">
<xs:choice>
<xs:element ref="Beam" maxOccurs="unbounded"/>
<xs:element ref="Dose" maxOccurs="unbounded"/>
<xs:element ref="Structure" maxOccurs="unbounded"/>
</xs:choice>
</xs:group>
<xs:element name="ActualValue">
<xs:complexType>
<xs:group ref="actualValueGroup" minOccurs="1" maxOccurs="1"/>
</xs:complexType>
</xs:element>
...正确接受或拒绝您的每个示例。
我正在尝试使用带有选择的 XSD 模式在 XML 文件中定义一个元素,这并不难:
<xs:complexType abstract="true"
name="ESAPIObject">
<xs:sequence>
<xs:element name="PropertyName"
type="xs:string"/>
<xs:element name="Condition"
minOccurs="1"
maxOccurs="unbounded">
...
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="BeamObject">
<xs:complexContent>
<xs:extension base="ESAPIObject">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="DoseObject">
<xs:complexContent>
<xs:extension base="ESAPIObject">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="StructureObject">
<xs:complexContent>
<xs:extension base="ESAPIObject">
<xs:sequence/>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="Beam"
type="BeamObject"/>
<xs:element name="Dose"
type="DoseObject"/>
<xs:element name="Structure"
type="StructureObject"/>
<xs:group name="actualValueType">
<xs:choice>
<xs:element ref="Beam"/>
<xs:element ref="Dose"/>
<xs:element ref="Structure"/>
</xs:choice>
</xs:group>
<xs:complexType name="SimpleConditionType">
<xs:sequence>
<xs:element name="ActualValue">
<xs:complexType>
<xs:choice>
<xs:group ref="actualValueType" minOccurs="1" maxOccurs="unbounded"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
然而,令人恼火的是 ActualValue
中的 choice 元素可能会重复,但前提是它与之前的元素来自同一类型?
因此只有结构元素或光束元素或剂量元素而不是它们的混合,例如:
<ActualValue>
<Structure />
<Structure />
</ActualValue>
或
<ActualValue>
<Beam />
<Beam />
</ActualValue>
或
<ActualValue>
<Dose />
<Dose />
</ActualValue>
但不是:
<ActualValue>
<Structure />
<Dose />
</ActualValue>
我在 XSD 中找不到实现此功能的方法。有什么建议吗?
我在你的文章中发现了一些错误 XSD:
- 您定义了一个重复选择而不是具有重复成员的选择
- 您的组引用周围有多余的
- 您的全局组 'ActualValueType' 应该是 'ActualValueGroup'(组不是类型,因此区分很重要)
为了更容易地测试你的xsd,我做了ActualValue
一个全局元素声明。
进行这些更改后,我得到了这个:
<xs:group name="actualValueGroup">
<xs:choice>
<xs:element ref="Beam" maxOccurs="unbounded"/>
<xs:element ref="Dose" maxOccurs="unbounded"/>
<xs:element ref="Structure" maxOccurs="unbounded"/>
</xs:choice>
</xs:group>
<xs:element name="ActualValue">
<xs:complexType>
<xs:group ref="actualValueGroup" minOccurs="1" maxOccurs="1"/>
</xs:complexType>
</xs:element>
...正确接受或拒绝您的每个示例。