【问题标题】:Validating XSD and reusing elements验证 XSD 和重用元素
【发布时间】:2014-03-27 14:26:16
【问题描述】:

我有一个用于多种服务的 XSD。 在 XSD 中,我有和“Order”复杂的类型。 另一个系统调用我的服务,并发送“订单”信息,我的服务使用发送到我的服务的“订单”信息做一些事情。

在“Order”中,我有几个元素,例如:“foo”和“bar”。 我的目标是将此 XSD 用于多个服务,例如 serviceA 和 serviceB。

两个服务都使用“Order”,但对于 serviceA,我想使“foo”成为必需,但对于 serviceB,我不希望“foo”成为必需。

我能否在 XSD 中控制它,或者是使“foo”可选的唯一方法,并检查代码(在服务调用之后)如果服务调用来自 serviceA,它不为空?

【问题讨论】:

    标签: xsd xsd-validation


    【解决方案1】:

    您可以通过派生获得它。假设你有一个类型 Order 包含可选的 foo 和 bar:

    <xs:complexType name="Order">
        <xs:sequence>
            <xs:element ref="foo" minOccurs="0"/>
            <xs:element ref="bar" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    

    我假设您有一个支持不同服务的根元素:

    <xs:element name="services">
        <xs:complexType>
            <xs:choice>
                <xs:element name="serviceA" type="ServiceAType" />
                <xs:element name="serviceB" type="ServiceBType" />
            </xs:choice>
        </xs:complexType>
    </xs:element>
    

    如果serviceB 允许可选的foo 和bar,您可以简单地将serviceB 的类型声明为Order,或者创建一个扩展Order 的ServiceBType:

    <xs:complexType name="ServiceBType">
        <xs:complexContent>
            <xs:extension base="Order"/>
        </xs:complexContent>
    </xs:complexType>
    

    如果您希望ServiceAType 限制Order 的内容,从而需要foo,那么您可以将其作为Order 的限制来实现:

    <xs:complexType name="ServiceAType">
        <xs:complexContent>
            <xs:restriction base="Order">
                <xs:sequence>
                    <xs:element ref="foo" minOccurs="1"/>
                    <xs:element ref="bar" minOccurs="0"/>
                </xs:sequence>
            </xs:restriction>
        </xs:complexContent>
    </xs:complexType>
    

    现在您可以让&lt;serviceB&gt; 不包含任何元素,包含&lt;foo&gt;、&lt;bar&gt; 或&lt;foo&gt;,后跟&lt;bar&gt;。 &lt;serviceA&gt; 将允许 &lt;foo&gt; 后跟 &lt;bar&gt; 或 &lt;foo&gt;,但仅此而已。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      相关资源
      最近更新 更多