Xsd 对xsi:type的约束或限制

Xsd 对xsi:type的约束或限制,xsd,Xsd,这是我面临的一个普遍的例子 我已经在模式中创建了派生类型,并希望创建一个元素,该元素是一个无限列表(序列),它有一个限制,其中只允许三个派生类型中的两个 从顶层来看,“我有一些事件,在一种情况下只能有两种类型的事件” 下面是我如何定义我的事件和序列的后续持有者。(这一切都有效) 抽象项是名为“Event Base”的复杂类型,具有名为Name的公共属性: <xs:complexType name="EventBase"> <xs:annotation><xs:

这是我面临的一个普遍的例子

我已经在模式中创建了派生类型,并希望创建一个元素,该元素是一个无限列表(序列),它有一个限制,其中只允许三个派生类型中的两个

从顶层来看,“我有一些事件,在一种情况下只能有两种类型的事件”

下面是我如何定义我的事件和序列的后续持有者。(这一切都有效)

抽象项是名为“Event Base”的复杂类型,具有名为Name的公共属性:

<xs:complexType name="EventBase">
   <xs:annotation><xs:documentation>***Abstract Event***</xs:documentation></xs:annotation>
   <xs:attribute name="Name"/>
</xs:complexType>

***抽象事件***
然后,我从摘要中得出三个事件,如下所示

<xs:complexType name="DerivedEvent1">
    <xs:complexContent>
        <xs:extension base="EventBase">
            <xs:attribute name="Alpha" type="xs:string"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="DerivedEvent2">
    <xs:complexContent>
        <xs:extension base="EventBase">
            <xs:attribute name="Beta"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="DerivedEvent3">
    <xs:complexContent>
        <xs:extension base="EventBase">
            <xs:attribute name="Gamma"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

为了简化复杂对象以保存派生事件,我创建了一个从抽象复杂对象派生的具体“泛型”事件

<xs:element name="Event" type="EventBase">
    <xs:annotation><xs:documentation>A generic event derived from abstract.</xs:documentation></xs:annotation>
</xs:element>

从抽象派生的泛型事件。
然后我希望能够保存事件,因此我创建了一个新的复杂对象来保存上面显示的“通用”事件,但实际上将由最终使用者保存派生事件

<xs:complexType name="EventsCollectionType">
    <xs:annotation><xs:documentation>Holds derived events</xs:documentation></xs:annotation>
    <xs:sequence>
        <xs:element ref="Event" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

保存派生事件
最后,我创建了一个从集合类型派生的元素,它将保存实际事件:

<xs:element name="Events"><xs:annotation><xs:documentation>Concrete holder of events.</xs:documentation></xs:annotation>
    <xs:complexType>
        <xs:sequence>
            <xs:element ref="Event" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>
事件的具体持有者。
生成的xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Events xsi:noNamespaceSchemaLocation="file:///C:/StackOverflow.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Event xsi:type="DerivedEvent1" Name="D1" Alpha="Content1"/>
    <Event xsi:type="DerivedEvent3" Name="D1" Gamma="Content3"/>
</Events>


所以问题是,如何创建一个final Event*s*元素,它将只保存特定的xsi:typed项

因此,在限制规定只有1和3的派生类型有效的情况下(如上所述);但如果它有一个派生类型2,它将是无效的


我创建了一个公共要点()

我可能错了,但我认为这是不可能的

在Events集合中,您基本上希望有不同的结构,但都具有相同的元素名“Event”。这违背了模式的一个基本约束:。使用xsi:type会给模式处理器一个提示,允许它消除这种结构选择的歧义,从而避免违反此规则。这基本上是一种变通方法

你能不能不调用每个不同的东西,这样你就有一个“event1”和“event3”的集合,或者一个包含可选“events1”和“event3”序列的外部集合?以这种方式实施架构将更容易。而且,您根本不需要使用xsi:type。我不确定您是否在实例中使用xsi:type来尝试绕过此限制或出于其他原因,但使用模式的任何人都不必担心派生类型


或者,您可以使用另一种技术(例如schematron)来帮助实施此约束。

我同意-我认为您使用派生只会增加复杂性,而我看不到真正的好处。分别为每种事件类型制作序列。