【问题标题】:In XSD, how to define a type which contains several occurences of a subtype, one with restriction在 XSD 中,如何定义一个包含多个出现的子类型的类型,其中一个有限制
【发布时间】:2018-01-30 02:44:27
【问题描述】:

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

  1. 它必须至少包含一个孩子。
  2. 对于这个孩子,孙子的值被限制为一个特定的值。
  3. 对于可选的其他子项,孙子项的值被限制为一组字符串值。

例子:

<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 的一些摘录,其中对 Identifier 元素的数量没有限制。

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

非常感谢任何帮助。

【问题讨论】:

    标签: xml xsd schema


    【解决方案1】:

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

    以下 XML 更容易在模式中验证,因为它不会与工具发生冲突。

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

    如果您确实更喜欢为难以理解的 XML 编写一个难以理解的架构,而不是为简单的 XML 编写一个简单的架构,请使用 XSD 1.1 和断言。

    【讨论】:

    • 感谢您的回复。我在迁移项目的上下文中需要它,因此很遗憾,XML 的结构无法更改。否则服务消费者将需要适应那里的请求,这是不希望的。目前,这是通过网关接收请求的方式设置的,网关进行 XSD 检查。然后将其转发到编排层,该层检查 PARTY_ID。我不喜欢两次验证请求的想法。这就是我问的原因。我们现在很可能会按原样迁移流程。
    猜你喜欢
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多