2011-10-07 80 views
9

我想要声明一个要包含在复杂类型声明中的元素,并且该元素具有强制属性:“option = MyOption”,,但“option”属性可以是任何东西,这取决于上下文。XSD架构中的元素强制属性声明:

即:在使用包含此元素的复杂类型的任何文档中,具有某个未知值的属性“选项”应为强制性的。

实施例:

<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中元素的强制属性,或者如何指定该属性必须具有尚未知的值。

回答

23

您需要修改“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> 

有了这个改变你的复杂类型将包含所需的“选项”的“SpecialOption”元素的所有实例“SpecialOptions”属性复杂类型。声明“Option”属性的类型为xs:string将允许在该字段中传递任何值。

+0

听起来不错 - 这是我需要知道的:如何使属性成为元素的必需组件。 “声明”Option“属性的类型为xs:string将允许在该字段中传递任何值。”理解 - 但我可以通过声明一个枚举类型并根据我的需求进行扩展来更好地服务。将尝试你的代码 - 如果它的工作,你有奖金。 – Vector

3

要标记属性为必填项,请使用<xs:attribute use="required" />

至于类型,您可以选择内置的XSD类型(xs:string等),或者您可以定义自己的<xs:simpleType />并使用它。

UPDATE

我不能肯定你被意思的属性必须有一个还不知道的值。这是否意味着该值是一个字符串,但可以是任何字符串?还是小数?

因为它是我们谈论的属性值,所以仅限于使用内置的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" />

希望这一点更清晰地回答你的问题。

+0

不太清楚 - 你没有解释如何声明一个包含强制属性的元素。 – Vector

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)这里的属性被声明为可选的,但提供了一个默认值(“测试”),这有时是不够的:

<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> 
+0

+1 - 你的回答很详细,内容非常丰富,但我给了奖励回答2,因为它已经足够,并且比你早得多。 Tnx – Vector

+0

谢谢,时间已经过去了,我考虑了你的意见。不过,我明白答案2是足够的,所以没有问题:] – mousio

0

只要你能做到这一点,如下

<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标记中删除空白区域。