是否可以将根元素限制为从指定父类型派生的类型?

Is it possible to restrict the root element to a type derived from a specified parent type?

让我们从一个简单的架构开始:

<xs:complexType name="AnimalType" abstract="true">
    <xs:sequence>
        <xs:element name="legs" xml:base="xs:nonNegativeInteger"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="DogType">
    <xs:complexContent>
        <xs:extension base="AnimalType">
            <xs:sequence>
                <xs:element name="furColor" xml:base="xs:string"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="BirdType">
    <xs:complexContent>
        <xs:extension base="AnimalType">
            <xs:sequence>
                <xs:element name="canFly" xml:base="xs:boolean"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

是否可以定义一个名为 pet 的根 xs:element,它可以是任何动物类型? IE。使这两个文件都有效:

<!-- a dog -->
<pet>
    <legs>4</legs>
    <furColor>black</furColor>
</pet>


<!-- a bird -->
<pet>
    <legs>2</legs>
    <canFly>true</canFly>
</pet>

添加 <xs:element name="pet" type="AnimalType"/> 不起作用,因为 AnimalType 是抽象的(即使不是,我仍然无法从派生类型添加子元素)。

我需要 pet 成为 AnimalType 的实例,因此将 pet 的类型设置为 xs:anyType 不是一个选项。

不,需要评论来区分这两个 pet 案例这一事实应该被视为一个信号,即 XML 设计目标应该在这里受到质疑,而不是[的能力] =34=].

这里有一些可供选择的 XML 设计:

  1. 一个文档可以有不同的根节点可能性,所以简单 允许 dogbird 根元素,以及它们各自的 类型都来自共同的 AnimalType.
  2. XSD 1.1支持Conditional Type Assignment (CTA),所以加个属性 AnimalType 可以进行测试以区分 DogTypeBirdTypepet 根元素的替代可能性。您可以找到 .

我更喜欢#1。

由于xsi:type,一种可能性是明确指定元素的类型。

在狗的情况下,您可以使用(假设您的架构已保存在animals.xsd):

<?xml version="1.0" encoding="UTF-8"?>
<pet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="animals.xsd" xsi:type="DogType">
    <legs>4</legs>
    <furColor>red</furColor>
</pet>

对于鸟来说:

<?xml version="1.0" encoding="UTF-8"?>
<pet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="animals.xsd" xsi:type="BirdType">
    <legs>2</legs>
    <canFly>true</canFly>
</pet>