XSD中元素类型的“或”运算

时间:2018-10-01 09:52:13

标签: java xml xsd xsd-validation xjc

这是My question

的连续性

假设下面是我的xsd文件,

更新的XSD文件

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/wm" xmlns="http://www.example.com/wm" elementFormDefault="qualified" version="1.0">
    <xsd:include schemaLocation="Comm.xsd" />
    <xsd:element name="testEame1">
        <xsd:annotation>
            <xsd:documentation>       test       </xsd:documentation>
        </xsd:annotation>
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="id" type="xsd:string" minOccurs="1" />
                <xsd:element name="session" type="rawSess" minOccurs="1" />
            </xsd:sequence>
            <xsd:attribute name="pid" type="xsd:integer" use="required" />
            <xsd:attribute name="version" type="xsd:string" use="required" />
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

引用另一个定义了类型的XSD,

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" targetNamespace="http://www.example.com/wm" xmlns="http://www.example.com/wm" elementFormDefault="qualified">
    <xsd:complexType name="rawSess">
        <xsd:sequence>
            <xsd:element name="oldSessionVersion" type="Sessiontype1" />
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="sessInfo">
        <xsd:sequence>
            <xsd:element name="newSessionVersion" type="Sessiontype2" />
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="Sessiontype1">
        <xsd:sequence>
            <xsd:element name="ele1" type="xsd:string" minOccurs="0" />
            <xsd:element name="ele2" type="xsd:string" />
            <xsd:element name="ele3" type="xsd:string" minOccurs="0" />
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="Sessiontype2">
        <xsd:sequence>
            <xsd:element name="nele1" type="xsd:integer" minOccurs="0" />
            <xsd:element name="nele2" type="xsd:integer" />
            <xsd:element name="nele3" type="xsd:integer" minOccurs="0" />
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

在上面的xml中,对于 element会话,我希望它只有两种类型,如下所示。 sessInfo或rawSess

<xsd:element name="session" type='sessInfo| rawSess' minOccurs="1"/>

更新说明: userDefinedtypes是复杂类型。

如何配置xsd来实现这一目标

1 个答案:

答案 0 :(得分:1)

如果userDefinedType1userDefinedType2是简单的原子类型,则定义联合类型:

<xs:element name="session" type="one-or-two"/>

<xs:simpleType name="one-or-two">
  <xs:union memberTypes="userDefinedType1 userDefinedType2"/>
</xs:simpleType>

我们现在知道它们实际上是复杂类型。定义类型

<xs:complexType name="eitherType">
  <xs:choice>
    <xs:sequence>... content model of alternative 1</xs:sequence>
    <xs:sequence>... content model of alternative 2</xs:sequence>
  </xs:choice>
</xs:complexType>

并从元素声明中引用此类型。

NB:这仅在没有歧义的情况下有效,也就是说,如果验证者可以根据实例文档中看到的第一个元素名称确定要选择的哪个分支。例如,如果您在两个都以h1元素开头的内容模型之间进行选择,则必须重新组织内容模型以消除歧义。