Операция «ИЛИ» над типом элемента в XSD - PullRequest
0 голосов
/ 01 октября 2018

Это непрерывность Мой вопрос

Предположим, ниже приведен мой 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 для сеанса элемента я хочу, чтобы он имел только два типа, как показано ниже.Либо sessInfo, либо rawSess

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

Примечание по обновлению: userDefinedtypes - сложные типы.

Как мне настроить xsd для достижения этой цели

1 Ответ

0 голосов
/ 01 октября 2018

Если userDefinedType1 и userDefinedType2 являются простыми атомарными типами, то определите тип объединения:

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

и обратитесь к этому типу из объявления элемента.

Примечание: это работает, только если нет неоднозначность , то есть, если валидаторможет определить, какую ветвь выбора выбрать, основываясь на первом имени элемента, которое он видит в экземпляре документа.Если бы вы выбрали между двумя моделями контента, которые обе начинаются, например, с элемента h1, вам пришлось бы реорганизовать модели контента, чтобы устранить неоднозначность.

...