Ограничить порядок элементов XML на основе атрибута - PullRequest
0 голосов
/ 04 апреля 2011

У меня есть следующий XML:

<?xml version="1.0"?>

<coll xmlns="http://www.example.org/coll" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/coll coll.xsd">

    <collection>
        <item action="remove">1</item>
        <item action="add">2</item>
        <item action="add">3</item>
    </collection>

    <collection>
        <item action="add">2</item>
        <item action="remove">1</item>
        <item action="add">3</item>
    </collection>

</coll>   

И XSD:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/coll"
    xmlns:tns="http://www.example.org/coll" elementFormDefault="qualified">

    <element name="coll" type="tns:coll">
    </element>

    <complexType name="coll">
        <sequence>
            <element name="collection" type="tns:collection" minOccurs="0" maxOccurs="unbounded"></element>
        </sequence>
    </complexType>

    <complexType name="collection">
        <sequence>
            <element name="item" type="tns:item" minOccurs="0" maxOccurs="unbounded"></element>
        </sequence>
    </complexType>

    <complexType name="item">
        <simpleContent>
            <extension base="string">
                <attribute name="action">
                    <simpleType>
                        <restriction base="string">
                            <enumeration value="add"></enumeration>
                            <enumeration value="remove"></enumeration>
                        </restriction>
                    </simpleType>
                </attribute>
            </extension>
        </simpleContent>
    </complexType>

</schema>

Я бы хотел ограничить порядок элементов элемента таким образом, чтобы удаление всегда происходило до добавления. То есть первая коллекция действительна, а вторая недействительна.

Я пробовал с двумя элементами item, один с типом add_item и один с remove_item. Но это не в состоянии проверить XSD с ошибкой, что я не могу иметь два элемента с одинаковыми именами разных типов.

Есть идеи? Или это вообще возможно?

1 Ответ

0 голосов
/ 04 апреля 2011

Единственный способ, которым это возможно (с XSD), заключается в рефакторинге вашей схемы для использования действия в качестве имени элемента вместо атрибута:

<collection>
    <remove>1</remove>
    <add>2</add>
    <add>3</add>
</collection>

Таким образом, вы можете использовать последовательность в своей схеме для определения порядка.

На более общей ноте: ваш дизайн схемы выглядит немного запутанным. Кажется, что ваши имена элементов описывают состояние (коллекция, элемент), но ваши атрибуты элемента, кажется, содержат фактическую информацию о действии, которое ваш код (предположительно) должен выполнить. Если у вас есть выбор дизайна, вы можете подумать о небольшом изменении дизайна.

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