【问题标题】:Element-Mandatory Attribute declaration in XSD Schema:XSD Schema 中的 Element-Mandatory Attribute 声明:
【发布时间】:2011-10-07 17:48:26
【问题描述】:

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

也就是说:在任何使用包含该元素的复杂类型的文档中,具有某个未知值的属性“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 中为元素声明一个强制属性,或者如何指定该属性必须有一个未知的值。

【问题讨论】:

    标签: xsd


    【解决方案1】:

    您需要修改“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 类型将允许在此字段中传递任何值。

    【讨论】:

    • 听起来不错——这就是我需要知道的:如何使属性成为元素的强制组件。 “将“Option”属性声明为 xs:string 类型将允许在此字段中传递任何值。”明白了 - 但我可能会更好地声明一个枚举类型并随着我的需求的发展对其进行扩展。将尝试您的代码 - 如果它有效,您将获得赏金。
    【解决方案2】:

    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> 
    

    【讨论】:

    • +1 - 你的回答很详细而且信息量很大,但我愿意回答 2,因为它已经足够了,而且比你的早得多。 Tnx
    • 谢谢,不过还是来得及,我考虑到了你们的 cmets。不过我知道答案 2 就足够了,所以没问题 :]
    【解决方案3】:

    要将属性标记为必填,请使用&lt;xs:attribute use="required" /&gt;

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

    更新

    我不确定你所说的属性必须有一个未知的值。这是否意味着该值是一个字符串,但可以是任何字符串?还是小数?

    因为它是我们所说的属性值,所以您只能使用内置的 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>
    

    但是,如果绝对无法知道将使用什么值,那么您就会遇到众所周知的时间悖论,即您无法在设计时将某些内容限制为仅在运行时才知道的值。在这种情况下,肯定只需要指定属性至少必须存在吗?

    &lt;xs:attribute use="required" /&gt;

    希望这能更清楚地回答您的问题。

    【讨论】:

    • 不太清楚 - 您还没有解释如何声明包含强制属性的元素。
    【解决方案4】:

    只需按照以下方式进行即可

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多