【发布时间】:2018-03-01 05:04:50
【问题描述】:
我有以下 xsd 架构:
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="Vehicle">
<xs:sequence>
<xs:element name="numberOfWheels" type="xs:int" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:complexType>
<xs:element name="car" type="Car"/>
<xs:complexType name="Car">
<xs:complexContent>
<xs:extension base="Vehicle">
<xs:sequence>
<xs:element name="numberOfSeats" type="xs:int" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="motorCycle" type="MotorCycle"/>
<xs:complexType name="MotorCycle">
<xs:complexContent>
<xs:extension base="Vehicle">
<xs:sequence>
<xs:element name="hasLuggageCompartment" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="wagon" type="Wagon"/>
<xs:complexType name="Wagon">
<xs:complexContent>
<xs:extension base="Vehicle">
<xs:sequence>
<xs:element name="typeOfCargo" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:element name="vehicleList" type="VehicleList"/>
<xs:complexType name="VehicleList">
<xs:sequence>
<xs:element <!-- what to do here? --> minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
如架构所示,我们有类型“Car”、“MotorCycle”和“Wagon”,它们都扩展了“Vehicle”类型。
我现在想在我的模式 (VehicleList) 中引入一个容器元素,它可以存储任何类型的元素,只要它扩展“Vehicle”,这样我们就可以存储“Car”、“MororCycle”或“Wagon”,但不是,例如,“Cow”类型的元素,因为它们会扩展“Animal”类型。
我已经搜索了很多,我认为不可能像我们在 OO 编程中经常使用的那样基于“祖先”类型在 XML 模式中引入这种限制。
所以我的问题:是否可以声明一个容器元素,根据它们扩展的类型来限制它包含的元素,如果可以,如何?
提前感谢您的回答和建议。
【问题讨论】:
-
您能否与我们分享一个 XML 文档,该文档应通过您想要的 XSD 进行验证?
标签: xml xsd containers restriction ancestor