XSD架构中的元素强制属性声明:

时间:2011-10-07 17:48:26

标签: xsd

我想声明要包含在复杂类型声明中的元素,并且该元素具有强制属性:“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中的元素声明强制属性,或者如何指定该属性必须具有尚未知道的值。

4 个答案:

答案 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标记中删除空格。