我想声明要包含在复杂类型声明中的元素,并且该元素具有强制属性:“option = MyOption”,但“option”属性的值可以是任何值,具体取决于背景。
即:在使用包含此元素的复杂类型的任何文档中,具有某些未知值的属性“选项”应该是必需的。
示例:
<xs:element name="SpecialOption" type="xs:string"/>
<xs:complexType name="SpecialOptions">
<xs:sequence>
<xs:element ref="SpecialOption" minOccurs="1" maxOccurs="100"/>
<xs:element ref="XXX"/>
</xs:sequence>
</xs:complexType>
在这种情况下,复杂类型“SpecialOptions”中的“SpecialOption”元素应具有此必需属性。
我不知道如何为XSD中的元素声明强制属性,或者如何指定该属性必须具有尚未知道的值。
答案 0 :(得分:26)
您需要修改“SpecialOption”元素的定义以包含必需的属性。更新此代码:
<xs:element name="SpecialOption" type="xs:string"/>
到此:
<xs:element name="SpecialOption">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="Option" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
通过此更改,您的复杂类型将在“SpecialOptions”复杂类型中的“SpecialOption”元素的所有实例上包含所需的“Option”属性。将“Option”属性声明为xs:string
类型将允许在此字段中传递任何值。
答案 1 :(得分:15)
1)这是一个简单的必需字符串属性
<xs:element name="SpecialOption">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="Option" type="xs:string" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
2)要求一个允许值列表中的一个:
<xs:element name="SpecialOption">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="Option" use="required">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="DE"/>
<xs:enumeration value="EN"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
3)可以使用范围作为限制,如下例所示。
<xs:element name="SpecialOption">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="Option" use="required">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="95"/>
<xs:maxInclusive value="137"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
4)下面,该属性被声明为包含十进制值的列表。这允许属性包含指定值的子集,例如,选项=“6 77 95”。
<xs:simpleType name="Items">
<xs:restriction base="xs:decimal">
<xs:enumeration value="137"/>
<xs:enumeration value="95"/>
<xs:enumeration value="6"/>
<xs:enumeration value="77"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="SpecialOption">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="Option" use="required">
<xs:simpleType>
<xs:list itemType="Items"/>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
5)此处属性被声明为可选属性,但提供了默认值(“test”),这有时足够了:
<xs:element name="SpecialOption">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="Option" type="xs:string" use="optional" default="test"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
答案 2 :(得分:3)
要将属性标记为必填,请使用<xs:attribute use="required" />
。
至于类型,你可以选择内置的XSD类型(xs:string等),或者你可以定义自己的<xs:simpleType />
并使用它。
<强>更新强>
我不确定你的意思该属性必须具有尚未知道的值。这是否意味着该值是一个字符串,但可以是任何字符串?还是小数?
因为它是我们所讨论的属性值,所以您只能使用内置的XSD类型,或者基于其中一种内置类型定义自己的xs:simpleType
类型。您可以在此处将更严格的规则应用于允许的值,例如通过扩展xs:string
并将正则表达式约束添加到允许的值。
<xsd:simpleType name="UKDate">
<xsd:restriction base="xsd:string">
<xsd:pattern value="(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)\d\d"/>
</xsd:restriction>
</xsd:simpleType>
但是,如果绝对无法知道将使用什么值,那么您就拥有众所周知的时间悖论,因此您无法在设计时将某些内容限制为仅在运行时知道的值。在这种情况下,当然只需要指定属性必须至少存在?
<xs:attribute use="required" />
希望这能更清楚地回答你的问题。
答案 3 :(得分:1)
您可以按照以下方式执行此操作
<xs:element name="SpecialOption">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="replace"/>
<xs:minLength value="1"></xs:minLength>
</xs:restriction>
</xs:simpleType>
</xs:element>
通过此代码强制在xml标记上插入值,并且空白限制将处理以从xml标记中删除空格。