几年来,我一直在我的模型中使用这种架构。
我有 3 种型号:
- 作为主模型的对象,
- A 和 B 扩展对象模型并添加新元素。
对象.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="A.xsd"/>
<xs:include schemaLocation="B.xsd"/>
<xs:complexType name="object">
<xs:sequence>
<xs:element name="elt1" type="xs:token"/>
</xs:sequence>
</xs:complexType>
<xs:element name="object" type="object"/>
</xs:schema>
A.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="object.xsd"/>
<xs:complexType name="A">
<xs:complexContent>
<xs:extension base="object">
<xs:sequence>
<xs:element name="elt2" type="xs:token"/>
<xs:element name="elt3" type="xs:token"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
B.xsd:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="object.xsd"/>
<xs:complexType name="B">
<xs:complexContent>
<xs:extension base="object">
<xs:sequence>
<xs:element name="elt4" type="xs:token"/>
<xs:element name="elt5" type="xs:token"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
我在示例中使用 xsi:type 来选择对象是 A 类型还是 B。下面是与 A 关联的示例:
<?xml version="1.0" encoding="UTF-8"?>
<object xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="A">
<elt1>test1</elt1>
<elt2>test2</elt2>
<elt3>test3</elt3>
</object>
我的一些合作伙伴在他们的ERP中导入XSD模式来创建他们的类对象。但是,他们必须调整我提供的文件才能正确导入它们并能够利用它们。
我想知道我是否正确使用了 xsi:type。实际上,XSD 中没有对 xsi 命名空间 (xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"( 的引用。xsi:type引用也是如此,他们的ERP如何知道添加它?
是的,您正确使用了 xsi:type。(这不是我非常喜欢的设计,但这无关紧要。
您无需在架构中声明 xsi 命名空间(或前缀(,只需在实例文档中声明即可。
我不太喜欢这种设计的一个原因是,这个模式的用户必须理解它才能创建实例文档,也就是说,他们需要了解实例文档需要包含 xsi:type 属性(因此绑定"xsi"前缀(。