Вопрос по schema, xsd, xml – Схема XML: все, последовательность и группы

0

Я впервые пишу XML-схему и нашел несколько полезных инструментов, которые помогут мне ее написать.

Сейчас я в странной ситуации. Схема, которую я написал, действительна для некоторых инструментов, а не для некоторых других. Эта схема представляет собой смесь «все», «последовательность» и "группа". Вот моя XML-схема:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
     <xsd:group name="test">

        <xsd:all>
                <xsd:element name="e2" minOccurs="0" maxOccurs="1"/>
                <xsd:element name="e3" minOccurs="0" maxOccurs="1"/>
                <xsd:element name="e4" minOccurs="0" maxOccurs="1"/>
        </xsd:all>
    </xsd:group>

    <xsd:element name="e0">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="e1" maxOccurs="unbounded"/>
                <xsd:group ref="test"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

Правильна ли эта схема? Это идет прямо сэтот валидатор а такжеэтот тоже но плагин XML Tools для Notepad ++ сообщает "Невозможно проанализировать файл схемы".

П.С .: Я написал эту схему, потому что хотел иметь элемент "e0" с этим возможность иметь смесь e1, e2, e3 и e4. e2, e3 и e4 должны появляться 0 или 1 раз, а e1 может возникать в незапланированное время. Например, эти XML-файлы должны пройти:

<e0>
   <e1/>
   <e1/>
   <e1/>
   <e1/>
   <e1/>
   <e2/>
</e0>

<e0>
   <e2/>
   <e3/>
   <e4/>
</e0>

<e0>
   <e1/>
   <e2/>
   <e3/>
   <e4/>
</e0>

Вы знаете другой способ сделать это?

Спасибо

Ваш Ответ

1   ответ
5

что ваша схема недействительна в соответствии с версией 1.0, в которой говоритсяпрямо здесь (учебник для начинающих) тот

XML Schema stipulates that an all group must appear as the sole child at the top of a content model.

Либо попробуйте прочитать раздел 3.8.6 структур XML-схем.Вот, В ваш список я бы добавил XSD-процессор .NET, который в вашем случае будет жаловаться на:

The group ref to 'all' is not the root particle, or it is being used as an extension.

В XSD 1.0 не существует решения, которое дало бы вам то, что вы хотите, и с кратким синтаксисом, если вы не создадите оболочку для элементов e1 (ниже как e1s).

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:group name="test">
        <xsd:all>
            <xsd:element name="e1s" minOccurs="0">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="e1" maxOccurs="unbounded"/>
                    </xsd:sequence>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="e2" minOccurs="0"/>
            <xsd:element name="e3" minOccurs="0"/>
            <xsd:element name="e4" minOccurs="0"/>
        </xsd:all>
    </xsd:group>
    <xsd:element name="e0">
        <xsd:complexType>
            <xsd:group ref="test"/>
        </xsd:complexType>
    </xsd:element>
</xsd:schema> 

Когда дело доходит до элементов e1, они должны быть заключены в e1s

<e0>
    <e1s>
        <e1/>
        <e1/>
        <e1/>
        <e1/>
        <e1/>
    </e1s>
    <e2/>
</e0>  

или же

<e0>
    <e1s>
        <e1/>
    </e1s>
    <e2/>
    <e3/>
    <e4/>
</e0>     

Тогда это все подтвердит ...

Довольно часто можно найти инструменты, которые чрезмерно либеральны в том, что они принимают. И Xerces, и Saxon достаточно согласны: если эти двое принимают это, то это, вероятно, допустимо. Что, к сожалению, не означает, что оно будет работать везде, потому что некоторые инструменты чрезмерно ограничивают то, что они принимают ...
Очень странно, что нет решения (по крайней мере, простого) для такой простой задачи.
ОК, спасибо за ваши ответы! Я постараюсь сделать это по-другому. TheArsenik

Похожие вопросы