第三十四章 XML 模式的高级选项
类和属性参数
-
XMLTYPECONSTRAINT
-
XMLINCLUDEINLIST
-
XMLINHERITANCE
自动创建子类的类型
当为一个类定义 XML
投影时,它的所有子类都会自动映射到单独的类型,所有这些类型都使用超类作为基类型。这意味着无论何时使用超类型,都可以使用其中一种子类型。还可以使用子类型在 XML
模式中定义选择列表或替换组。
请注意,可以为抽象类定义 XML
映射;该类在任何派生类模式中都显示为基类型,尽管它是抽象的,无法实例化。
考虑一个例子。我们从一个简单的 Person
类开始:
Class UsingSubclasses.Person Extends (%Persistent, %XML.Adaptor)
{
Property Name As %String [Required];
Property DOB As %Date(FORMAT = 5, MAXVAL = "+$h") [Required];
}
假设我们有两个直接基于 Person
类的类。首先是 Patient
类:
Class UsingSubclasses.Patient Extends UsingSubclasses.Person
{
Property PatientID As %String [Required];
}
接下来是 Employee
类:
Class UsingSubclasses.Employee Extends UsingSubclasses.Person
{
Property EmployeeID As %String [Required];
}
最后,考虑一个使用 Person
作为属性的类:
Class UsingSubclasses.Example1 Extends (%Persistent, %XML.Adaptor)
{
Property Person As UsingSubclasses.Person;
}
当生成 Example1
类的架构时,结果如下:
<s:complexType name="Example1">
<s:sequence>
<s:element name="Person" type="Person" minOccurs="0" />
</s:sequence>
</s:complexType>
<s:complexType name="Employee">
<s:complexContent>
<s:extension base="Person">
<s:sequence>
<s:element name="EmployeeID" type="s:string" />
</s:sequence>
</s:extension>
</s:complexContent>
</s:complexType>
<s:complexType name="Person">
<s:sequence>
<s:element name="Name" type="s:string" />
<s:element name="DOB" type="s:date" />
</s:sequence>
</s:complexType>
<s:complexType name="Patient">
<s:complexContent>
<s:extension base="Person">
<s:sequence>
<s:element name="PatientID" type="s:string" />
</s:sequence>
</s:extension>
</s:complexContent>
</s:complexType>
请注意以下事项:
Example1
的类型是Person
。Employee
类型和Patient
类型均已定义;这是默认设置。 (作为参考,这对应于将XMLTYPECONSTRAINT
属性参数设置为等于“EXPLICIT”
。)- 根据
XML
架构规范,前面的架构意味着无论何时包含<Person>
元素,都可以包含<Employee>
元素或<Patient>
元素。