这是我反对的一个典型例子。
我在我的模式中创建了派生类型,并且想要创建一个元素,这是一个无限列表(序列),它有一个限制,其中只允许三种派生类型中的两个。
从顶级视图来说,“我有一些情况,在一种情况下只能有两种类型的事件”。
以下是我如何定义我的事件以及序列的后续持有者。 (这一切都有效并且有效)。
抽象项是一个名为“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>
所以问题是,如何创建一个最终的Event * s *元素,它只包含特定的xsi:typed项目?
因此,在限制条件下,只有派生类型1和3有效(如上所述);但是如果它有派生类型2则无效。
我创建了一个公共GIST(Constraint or Restriction on xsi:type)
答案 0 :(得分:1)
我可能错了,但我不认为这是可能的。
在Events集合中,您基本上希望拥有不同的结构,但所有结构都具有相同的元素名称“Event”。这违背了模式的基本约束:http://www.w3.org/TR/xmlschema-1/#cos-element-consistent。使用xsi:type为模式处理器提供一个提示,使其能够消除这种结构选择的歧义,从而避免违反此规则。它本质上是一种解决方法。
你能不能调用每个不同的东西,所以你有一个“event1”和“event3”的集合或一个包含一系列可选的“events1”和“event3”的外部集合?以这种方式构造实施结构会容易得多。此外,您根本不需要使用xsi:type。我不确定您是否在实例中使用xsi:type来尝试解决此限制或其他原因,但使用模式的任何人都可能更容易担心派生类型。
或者,您可以使用其他技术(例如schematron)来帮助实施此约束。