XML学习之Xml Schema:七、派生复杂类型--扩展

        当从简单类型或具有简单内容的复杂类型派生复杂类型时(注意:简单内容直接或间接派生出来的复杂类型也必须是简单内容,简单内容不能派生复杂内容),使用xs:simpleContent元素,如果是扩展派生,使用xs:extension元素,如果是限制派生,使用xs:restriction元素。

        扩展派生

        通过扩展派生的复杂类型,他的有效内容模型是基类型的内容模型加上扩展的内容模型。

        扩展简单内容

        扩展简单内容可以从简单类型或具有简单内容的复杂类型扩展。由于不能通过扩展简单内容来得到复杂内容,因此对简单内容的扩展只能是添加新的属性

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="employee" type="expandEmpType"/>
	<xs:complexType name="empType">
		<xs:simpleContent>
			<xs:extension base="xs:token">
				<xs:attribute name="number" type="xs:token" use="required"/>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
	<xs:complexType name="expandEmpType">
		<xs:simpleContent>
			<xs:extension base="empType">
				<xs:attribute name="birthdate" type="xs:date" use="required"/>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
</xs:schema>

从具有简单内容的复杂类型扩展

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="employee" type="expandEmpType"/>
	<xs:complexType name="expandEmpType">
		<xs:simpleContent>
			<xs:extension base="xs:string">
				<xs:attribute name="number" type="xs:string" use="required"/>
				<xs:attribute name="birthdate" type="xs:date" use="required"/>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
</xs:schema>

从简单类型扩展

        扩展纯元素内容

        从纯元素内容的复杂类型扩展,我们可以在基类型的内容模型最后添加新的与元素或属性。模式处理器会把基类型的内容模型和新增的内容模型合并到一个sequence中。注意不能对一个all组的基类型进行扩展添加新的元素(添加属性是可以的)。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="fruit" type="expandedFruitType"/>
	<xs:complexType name="fruitType">
		<xs:complexContent>
			<xs:restriction base="xs:anyType">
				<xs:sequence>
					<xs:element name="Apple" type="xs:string"/>
					<xs:element name="Pear" type="xs:string"/>
				</xs:sequence>
			</xs:restriction>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="expandedFruitType">
		<xs:complexContent>
			<xs:extension base="fruitType">
				<xs:sequence>
					<xs:element name="Banane" type="xs:string"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
</xs:schema>

        扩展混合内容

        混合内容的扩展跟纯元素的扩展类似,唯一的要求是派生类型也必须具有混合内容,也就是mixed=true。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="employee" type="expandedEmpType"/>
	<xs:complexType name="empType" mixed="true">
		<xs:sequence>
			<xs:element name="name" type="xs:string"/>
			<xs:element name="age" type="xs:string"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="expandedEmpType" mixed="true">
		<xs:complexContent>
			<xs:extension base="empType">
				<xs:sequence>
					<xs:element name="salary" type="xs:integer"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
</xs:schema>

        扩展空内容

        从空内容类型扩展,派生类型可以具有纯元素内容,也可以就混合内容。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="employee" type="extendedEmpType"/>
	<xs:complexType name="empType">
		<xs:attribute name="number" type="xs:string" use="required"/>
	</xs:complexType>
	<xs:complexType name="extendedEmpType" mixed="true">
		<xs:complexContent>
			<xs:extension base="empType">
				<xs:sequence>
					<xs:element name="name" type="xs:string"/>
					<xs:element name="age" type="xs:integer"/>
				</xs:sequence>
				<xs:attribute name="remark" use="required"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
</xs:schema>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值