<xs:simpleType name="FuelType"> <xs:restriction base="xs:string"> <xs:enumeration value="Regular Unleaded"/> <xs:enumeration value="High Octane"/> <xs:enumeration value="Leaded"/> </xs:restriction> </xs:simpleType> <xs:complexType name="CarType"> <xs:sequence> <xs:element name="Make" type="xs:string"/> <xs:element name="Model" type="xs:string"/> <xs:element name="Cylinders" type="xs:int"/> <xs:element name="Fuel" type="FuelType"/> </xs:sequence> </xs:complexType>
现在让我们说我想要定义一个从CarType扩展的本田车型,但它有自己的Fuel定义:
<xs:simpleType name="HondaFuelType"> <xs:restriction base="xs:string"> <xs:enumeration value="85"/> <xs:enumeration value="87"/> <xs:enumeration value="89"/> <xs:enumeration value="91"/> <xs:enumeration value="93"/> <xs:enumeration value="95"/> </xs:restriction> </xs:simpleType> <xs:complexType name="HondaCarType"> <xs:complexContent> <xs:extension base="car:CarType"> <xs:sequence> <xs:element name="Fuel" type="HondaFuelType"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType>
扩展CarType可以获得我想要的一切,但是模式现在允许两个名为Fuel的元素(在不同的命名空间中).这是一个示例Xml实例:
<HondaCar xmlns="HondaNS" xmlns:car="CarNS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="HondaNS D:\Development\Temp\honda.xsd"> <car:Make/> <car:Model/> <car:Cylinders>4</car:Cylinders> <car:Fuel>High Octane</car:Fuel> <Fuel>87</Fuel> </HondaCar>
虽然这是完全有效的Xml,但它没有逻辑意义(至少对我来说).我的目的是扩展基类型然后覆盖* Fuel *以仅允许在HondaFuelType中定义的值.
有没有办法可以覆盖或掩盖我的扩展类型中的基本Fuel元素?
解决方法
> CarType的实例将生成名为Make,Model,Cylinders和Fuel的子项,并指明类型.
> Make和Model元素的值将是字符串.
> Cylinders元素的值将是xs:int.
> Fuel元素的值将从字符串{“Regular Unleaded”,“Leaded”,“High Octane”}中提取.
这是你正在运行的最后一项承诺.
扩展类型时,在内容模型的末尾添加新子项;对于XSD 1.0,对于对扩展有效的任何元素,总是可以从末尾删除零个或多个子元素,并生成一个对基类型有效的元素.这就是为什么你的扩展最终会有两个Fuel元素.
如果您只想要一个Fuel元素,那么您想要做的是限制而不是扩展CarType.但是您所考虑的限制并不是对基本类型的Fuel元素的法律限制.所以限制在这里对你不起作用.
当然,一种可能性是概括CarType以使其Fuel元素接受xs:string,然后将其限制两次,一次产生类似于现有CarType的东西,并且一次产生你想到的本田变体.
我希望这有帮助.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。