我希望能够创建的是一个可以验证以下内容的XSD:
<parent>
<mother>
<name>
<firstname>foo</firstname>
<surname> bar </surname>
<maidenname>rab</maidenname>
</name>
</mother>
</parent>
和
<parent>
<father>
<name>
<firstname>foo</firstname>
<surname> bar </surname>
</name>
</father>
</parent>
我理想地希望能够使用相同的元素名称,但基于父属性对它有不同的要求。到目前为止我尝试过的是:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="firstname">
<xs:complexType mixed="true" />
</xs:element>
<xs:element name="maidenname">
<xs:complexType mixed="true" />
</xs:element>
<xs:element name="mother">
<xs:complexType>
<xs:sequence>
<xs:element ref="name" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="father">
<xs:complexType>
<xs:sequence>
<xs:element ref="name" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="name">
<xs:complexType>
<xs:all>
<xs:element ref="firstname" />
<xs:element ref="surname" />
<xs:element ref="maidenname" />
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="parent">
<xs:complexType>
<xs:choice>
<xs:element ref="mother"/>
<xs:element ref="father"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="surname">
<xs:complexType mixed="true" />
</xs:element>
</xs:schema>
答案 0 :(得分:0)
您可以创建两种不同的类型(例如fathersName
和mothersName
),并将它们用于相应的name
元素。这是完整的XSD:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="firstname">
<xs:complexType mixed="true" />
</xs:element>
<xs:element name="maidenname">
<xs:complexType mixed="true" />
</xs:element>
<xs:element name="mother">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="mothersName" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="father">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="fathersName" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="fathersName">
<xs:all>
<xs:element ref="firstname" />
<xs:element ref="surname" />
</xs:all>
</xs:complexType>
<xs:complexType name="mothersName">
<xs:all>
<xs:element ref="firstname" />
<xs:element ref="surname" />
<xs:element ref="maidenname" />
</xs:all>
</xs:complexType>
<xs:element name="parent">
<xs:complexType>
<xs:choice>
<xs:element ref="mother"/>
<xs:element ref="father"/>
</xs:choice>
</xs:complexType>
</xs:element>
<xs:element name="surname">
<xs:complexType mixed="true" />
</xs:element>
</xs:schema>
此外,如果名称应该是简单的字符串,您可以更简洁的方式编写XSD:
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="mother">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="mothersName" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="father">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="fathersName" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="fathersName">
<xs:all>
<xs:element name="firstname" type="xs:string" />
<xs:element name="surname" type="xs:string" />
</xs:all>
</xs:complexType>
<xs:complexType name="mothersName">
<xs:all>
<xs:element name="firstname" type="xs:string" />
<xs:element name="surname" type="xs:string" />
<xs:element name="maidenname" type="xs:string" />
</xs:all>
</xs:complexType>
<xs:element name="parent">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element ref="mother"/>
<xs:element ref="father"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
最后,您可以将mothersName
写为fathersName
的扩展名,但这需要付出代价:元素的顺序必须(至少部分)修复。以下是两种类型定义的外观:
<!-- ... -->
<xs:complexType name="fathersName">
<xs:sequence>
<xs:element name="firstname" type="xs:string" />
<xs:element name="surname" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="mothersName">
<xs:complexContent>
<xs:extension base="fathersName">
<xs:sequence>
<xs:element name="maidenname" type="xs:string" />
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<!-- ... -->