Какой самый краткий способ сделать выбор зависит от атрибута? - PullRequest
1 голос
/ 26 января 2011

У меня есть какой-то XML, где вы могли бы иметь

<a type="b">
    <b></b>
</a>

или

<a type="c">
    <c></c>
</a>

или

<a type="d">
    <d></d>
</a>

, но следующее недопустимо:

<a type="c">
    <b></b>
</a>

Я пытаюсь создать XML-схему, которая представляет это, но, если я правильно понимаю, следующее не правильно связывает атрибут type с содержимым тега.

<?xml version="1.0" encoding="UTF-8" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="a" type="A" minOccurs="1" maxOccurs="1" />

    <xs:complexType name="A">
        <xs:attribute name="type" type="AType" use="required" />
        <xs:choice>
            <xs:group ref="B" />
            <xs:group ref="C" />
            <xs:group ref="D" />
        </xs:choice>
    </xs:complexType>

    <xs:simpleType name="AType">
        <restriction base="xs:string">
            <enumeration value="b"/>
            <enumeration value="c"/>
            <enumeration value="d"/>
        </restriction>
    </xs:simpleType>

    <xs:complexType name="B">
        STUFF
    </xs:complexType>

    <xs:complexType name="C">
        OTHER STUFF
    </xs:complexType>

    <xs:complexType name="D">
        YET MORE STUFF
    </xs:complexType>
</xs:schema>

Это единственный способ сделать это правильно, чтобы быть невероятно многословным, как:

<?xml version="1.0" encoding="UTF-8" ?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="a" type="A" minOccurs="1" maxOccurs="1" />

    <xs:complexType name="A">
        <xs:choice>
            <xs:group ref="B" />
            <xs:group ref="C" />
            <xs:group ref="D" />
        </xs:choice>
    </xs:complexType>

    <xs:complexType name="B">
        <xs:attribute name="type" type="xs:string" fixed="b" />
        STUFF
    </xs:complexType>

    <xs:complexType name="C">
        <xs:attribute name="type" type="xs:string" fixed="c" />
        OTHER STUFF
    </xs:complexType>

    <xs:complexType name="D">
        <xs:attribute name="type" type="xs:string" fixed="d" />
        YET MORE STUFF
    </xs:complexType>
</xs:schema>

1 Ответ

2 голосов
/ 26 января 2011

Нет прямого способа сделать это в XSD 1.0. Это легко сделать в XSD 1.1, используя новую функцию «условного назначения типов». Эта функция поддерживается в последних выпусках процессоров схемы, поставляемых с Saxon и Xerces.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...