0

几年以来,我一直在我的模型中使用这种架构。

我有 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怎么知道要添加呢?

4

1 回答 1

1

是的,您使用 xsi:type 正确。(这不是我非常喜欢的设计,但这无关紧要。)

您不需要在您的架构中声明 xsi 命名空间(或前缀),只需在您的实例文档中。

我不太喜欢这种设计的一个原因是这个模式的用户必须理解它才能创建实例文档,也就是说,他们需要了解实例文档需要包含一个 xsi:type 属性(因此绑定“xsi”前缀)。

于 2018-04-10T11:29:33.110 回答