gpt4 book ai didi

xsd - xsi :type 的约束或限制

转载 作者:行者123 更新时间:2023-12-04 16:59:40 28 4
gpt4 key购买 nike

这是我所反对的一个普遍的例子。

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

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

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

抽象项是一个名为“Event Base”的复杂类型,并有一个名为 Name 的公共(public)属性:

<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,那将是无效的。

我创建了一个公共(public) GIST ( Constraint or Restriction on xsi:type)

最佳答案

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

在 Events 集合中,您本质上希望具有不同的结构,但都具有相同的元素名称“Event”。这违背了模式的基本约束:http://www.w3.org/TR/xmlschema-1/#cos-element-consistent .使用 xsi:type 给模式处理器一个提示,允许它消除这种结构选择的歧义,从而避免违反此规则。这本质上是一种解决方法。

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

或者,您可能会使用另一种技术(例如 schematron)来帮助强制执行此约束。

关于xsd - xsi :type 的约束或限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8478283/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com