在XSD中,如何定义一个包含多个子类型的类型,一个带有限制

时间:2018-01-29 14:38:54

标签: xml xsd schema

有人可以告诉我,是否可以定义一个可以包含复杂子类型的多个元素的类型。然而,

  1. 必须至少包含一个孩子。
  2. 对于这个孩子,孙子的价值仅限于一个特定值。
  3. 对于可选的其他子节点,孙的值仅限于一组字符串值。
  4. 示例:

    <Identifiers>
    <ns:Identifier xmlns:ns='http://schemas.com/common'>
        <ns0:SourceSystem xmlns:ns0='http://schemas.com/common'>ORACLE</ns0:SourceSystem>
        <ns0:IDType xmlns:ns0='http://schemas.com/common'>PARTY_ID</ns0:IDType>
        <ns0:IDValue xmlns:ns0='http://schemas.com/common'>38784313</ns0:IDValue>
    </ns:Identifier>
    <ns:Identifier xmlns:ns='http://schemas.com/common'>
        <ns0:SourceSystem xmlns:ns0='http://schemas.com/common'>ORACLE</ns0:SourceSystem>
        <ns0:IDType xmlns:ns0='http://schemas.com/common'>ANY_ID</ns0:IDType>
        <ns0:IDValue xmlns:ns0='http://schemas.com/common'>12345</ns0:IDValue>
    </ns:Identifier>
    

    Identifier元素的第一次出现具有IDType的强制值“PARTY_ID”。第二次出现是可选的,可以从枚举中获得任何值。

    以下是当前XSD的一些摘录,其中对标识符元素的数量没有限制。

    <xsd:complexType name="IdentifiersType">
    <xsd:sequence>
        <xsd:element name="Identifier" type="cmn:IdentifierType" maxOccurs="unbounded"/>
    </xsd:sequence>
    

    <xsd:complexType name="IdentifierType">
    <xsd:sequence>
        <xsd:element name="SourceSystem"/>
        <xsd:element ref="cmn:IDType"/>
        <xsd:element name="IDValue" type="xsd:string"/>
    </xsd:sequence>
    

    <xsd:simpleType name="IDType">
    <xsd:restriction base="xsd:string">
        <xsd:minLength value="1"/>
        <xsd:enumeration value="VENDOR_ID"/>
        <xsd:enumeration value="VENDOR_SITE_ID"/>
        <xsd:enumeration value="VENDOR_SITE_NUMBER"/>
        <xsd:enumeration value="APPLICANT_ID"/>
        <xsd:enumeration value="AGMNT_ID"/>
        <xsd:enumeration value="SAMPLE_ID"/>
        <xsd:enumeration value="PROGRAM_ID"/>
        <xsd:enumeration value="QUOTE_ID"/>
        <xsd:enumeration value="AAA_PARTY_ID"/>
        ...
        <xsd:enumeration value="PARTY_ID"/>
    </xsd:restriction>
    

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您似乎在这里有两种不同的元素:聚会标识符(必需)和非聚会标识符的标识符(可选)。为什么你选择给他们相同的名字?考虑一下程序员说“我想要有四个变量;第一个应该是一个所需值为42的整数,而第二个和第四个应该是可能会或可能不会被初始化的字符串,第三个应该是一个指针。哦,他们都必须被称为x。为什么这种编程语言的类型系统不能让我这样做呢?“在XSD中,与XML DTD和XML的大多数其他模式语言一样,约束与元素名称相关联。如果需要不同的约束集,请使用不同的元素名称。

以下XML在架构中更容易验证,因为它不会对工具产生影响。

<Identifiers>
  <partyID sourceSystem="ORACLE">38784313</partyID>
  <anyID sourceSystem="ORACLE">12345</anyID>
</Identifiers>

如果您真的更喜欢为难以理解的XML编写难以理解的模式而不是简单XML的简单模式,请使用XSD 1.1和断言。