验证XSD并重用元素

时间:2014-03-27 14:26:16

标签: xsd xsd-validation

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

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

两种服务都使用“Order”,但对于serviceA,我想要“foo”,但对于serviceB,我不需要“foo”。

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

1 个答案:

答案 0 :(得分:0)

您可以通过派生获得。假设您的类型Order包含可选的foobar

<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允许选择foobar,您只需将serviceB的类型声明为Order,或创建ServiceBType它扩展了Order

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

如果您希望ServiceAType限制Order的内容以便foo是必需的,那么您可以将其作为订单限制来实现:

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

现在,您可以让<serviceB>不包含任何元素,其中包含<foo><bar><foo>,后跟<bar><serviceA>允许<foo>后跟<bar><foo>,但不允许其他内容。