我彻底迷失了。
这就是我想要的:
这是 XML1:
<EL0 attr0="type1">
<EL1 attr1="someValue"/>
<EL2>
<EL2_SUBEL1>String1</EL2_SUBEL1>
<EL2_SUBEL2 attr2="value1"/>
</EL2>
<EL0>
这是 XML2:
<EL0 attr0="type2">
<EL1 attr1="someValue"/>
<EL2>
<EL2_SUBEL3>String1</EL2_SUBEL3>
</EL2>
<EL3 attr4="value2"/>
<EL0>
元素是:
根元素:EL0
元素,可以位于结构中的任何位置(将来但现在位于根中):
a) El1 具有属性“attr0”
b) EL2
c) El3 具有属性“attr4”
EL2 有 3 个元素,但基于 EL0 attr0 值(“type1”和“type2”):
<EL2_SUBEL1>String1</EL2_SUBEL1>
<EL2_SUBEL2 attr2="value1"/>
<EL2_SUBEL3>String2</EL2_SUBEL3>
如果 EL0 attr0 值为“type1”,则 EL2 的子元素为 EL2_SUBEL1 和 EL2_SUBEL2
如果 EL0 attr0 值为“type2”,则 EL2 的子元素为 EL2_SUBEL3
这是我所做的,但有一些错误。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Define complex type for EL1 -->
<xs:complexType name="EL1Type">
<xs:attribute name="id" type="xs:string"/>
</xs:complexType>
<!-- Define complex type for EL2_SUBEL1 -->
<xs:complexType name="EL2_SUBEL1Type">
<xs:sequence>
<xs:element name="EL2_SUBEL1" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<!-- Define complex type for EL2_SUBEL2 -->
<xs:complexType name="EL2_SUBEL2Type">
<xs:sequence>
<xs:element name="EL2_SUBEL2">
<xs:complexType>
<xs:attribute name="value" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<!-- Define complex type for EL2_SUBEL3 -->
<xs:complexType name="EL2_SUBEL3Type">
<xs:sequence>
<xs:element name="EL2_SUBEL3" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<!-- Define complex type for EL3 -->
<xs:complexType name="EL3Type">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="number" type="xs:string"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Define complex type for EL3 for "type1" -->
<xs:complexType name="type1">
<xs:sequence>
<xs:element ref="EL2_SUBEL1" minOccurs="0" maxOccurs="1"/>
<xs:element ref="EL2_SUBEL2" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<!-- Define complex type for EL3 for "type2" -->
<xs:complexType name="type2">
<xs:sequence>
<xs:element ref="EL2_SUBEL3" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<!-- Define the root element "EL0" -->
<xs:element name="EL0">
<xs:complexType>
<xs:sequence>
<xs:element name="EL1" type="EL1Type"/>
<xs:element name="EL3">
<xs:complexType>
<xs:choice>
<xs:element ref="EL2_SUBEL1" minOccurs="0" maxOccurs="1"/>
<xs:element ref="EL2_SUBEL2" minOccurs="0" maxOccurs="1"/>
<xs:element ref="EL2_SUBEL3" minOccurs="0" maxOccurs="1"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="EL3" type="EL3Type"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
但是,当然,这是行不通的。
对于这种约束:
if EL0 attr0 value is "type1"
then sub-elements of EL2 are EL2_SUBEL1 and EL2_SUBEL2
if EL0 attr0 value is "type2"
then sub-elements of EL2 is EL2_SUBEL3
您需要 XSD 1.1。这完全适合“条件类型分配”功能,该功能使元素的复杂类型以其属性值为条件。
有许多模式处理器支持 XSD 1.1,但许多仅支持 1.0。如果您无法使用 1.1 处理器,则无法定义这些约束,因此您必须使用其他一些处理来补充 XSD 验证,例如使用 Schematron 或自定义 XSLT 验证阶段。