gpt4 book ai didi

xsd - 无法抑制子元素中父元素的属性(xsd 限制)

转载 作者:行者123 更新时间:2023-12-04 17:00:26 27 4
gpt4 key购买 nike

我想压制主题标识符 子元素 中的属性(在父元素 ConsumerSubjectResponseType 中声明)联合消费者主题响应类型 .我认为不重复子元素中的属性声明就足够了,但显然不是。这可以在 xsd 中做到吗?


<xs:complexType name="ConsumerSubjectResponseType">
<xs:sequence>
<xs:element name="CustomerReferenceNumber" type="xs:string" minOccurs="0"/>
<xs:element name="Sources" type="xs:string" minOccurs="0"/>
<xs:element name="AdditionalOutputData" type="xs:string" minOccurs="0"/>
</xs:sequence>
<xs:attribute name="subjectIdentifier" type="xs:string" use="required"/>
</xs:complexType>

<xs:complexType name="CombinedConsumerSubjectResponseType">
<xs:complexContent>
<xs:restriction base="ConsumerSubjectResponseType">
<xs:sequence>
<xs:element name="Sources" type="xs:string" minOccurs="0"/>
<xs:element name="AdditionalOutputData" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:restriction>
</xs:complexContent>
</xs:complexType>

<xs:element name="Test">
<xs:complexType><xs:sequence>
<xs:element name="A" type="ConsumerSubjectResponseType"></xs:element>
<xs:element name="B" type="CombinedConsumerSubjectResponseType"></xs:element>
</xs:sequence></xs:complexType>
</xs:element>

最佳答案

Is this possible to do in xsd?


在你的例子中:不,或者不是那样。
通过限制派生的类型必须重复所有粒子组件,但在派生类型定义中不需要重复属性,它们是从基类型继承的。删除 需要 来自受限类型的属性是不可能的。您可以为必需的属性和 指定某个固定(可能为空)的值。可选 您可以使用 use="prohibited" 删除的属性.
通常,您尝试做的是在某种程度上倒退,因为“类型 A 的成员,其定义是另一种类型 B 的定义的限制,始终也是类型 B 的成员”和“复杂类型定义除了另一个指定的类型定义所允许的内容之外,还允许元素或属性内容被称为扩展”(引自 W3C 模式定义 12 )。
解决方案1,使用 xs:extension反而
创建 ConsumerSubjectResponseType作为基类型并派生 CombinedConsumerSubjectResponseType从它扩展。
<xs:complexType name="CombinedConsumerSubjectResponseType-base">
<xs:sequence>
<xs:element minOccurs="0" name="Sources" type="xs:string" />
<xs:element minOccurs="0" name="AdditionalOutputData" type="xs:string" />
</xs:sequence>
</xs:complexType>

<xs:complexType name="ConsumerSubjectResponseType-extension">
<xs:complexContent>
<xs:extension base="CombinedConsumerSubjectResponseType-base">
<xs:sequence>
<xs:element minOccurs="0" name="CustomerReferenceNumber" type="xs:string" />
</xs:sequence>
<xs:attribute name="subjectIdentifier" type="xs:string" use="required" />
</xs:extension>
</xs:complexContent>
</xs:complexType>
此解决方案的问题在于,与原始类型定义相比,扩展类型中元素的顺序发生了变化。元素 <Sources><AdditionalOutputData>出现在元素之前 <CustomerReferenceNumber> .这样做的原因是基本类型和附加定义被视为一个连续组的两个子项,并且首先添加基本类型。
解决方案2,使用 xs:group包含共同元素
CombinedConsumerSubjectResponseType 中定义序列作为一个团队。然后你可以创建类型 CombinedConsumerSubjectResponseType只需提及该组即可。在 ConsumerSubjectResponseType您在正确的位置添加所需的新元素和属性,并引用该组。
<xs:group name="CombinedConsumerSubjectResponse-group">
<xs:sequence>
<xs:element minOccurs="0" name="Sources" type="xs:string" />
<xs:element minOccurs="0" name="AdditionalOutputData" type="xs:string" />
</xs:sequence>
</xs:group>

<xs:complexType name="ConsumerSubjectResponseType-group">
<xs:sequence>
<xs:element minOccurs="0" name="CustomerReferenceNumber" type="xs:string" />
<xs:group ref="CombinedConsumerSubjectResponse-group" />
</xs:sequence>
<xs:attribute name="subjectIdentifier" type="xs:string" use="required" />
</xs:complexType>

<xs:complexType name="CombinedConsumerSubjectResponseType-group">
<xs:group ref="CombinedConsumerSubjectResponse-group" />
</xs:complexType>
在这种情况下,影响这两种类型的更改应该在组上完成,而不是在类型上完成。

关于xsd - 无法抑制子元素中父元素的属性(xsd 限制),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4988489/

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