XSD-схема для XML с одинаковыми именами узлов

#xml #xsd #xsd-validation

#xml #xsd #xsd-проверка

Вопрос:

Существует XML

 <a>
    <b info="Info1">
        <c info="Info2" />
        <d info="Info3" />
    </b>
    <b info="Info4">
        <e info="Info5" />
        <f info="Info6" />
    </b>
</a>
 

Оба блока с

 <b info=...>...</b>  
 

элемент может присутствовать или отсутствовать в XML-файле в зависимости от какого-то неизвестного внешнего условия. Таким образом, для проверки возможны 4 типа XML:

 <a/>
<a><b info="Info1"><c info="Info2" /><d info="Info3" /></b></a>
<a><b info="Info4"><e info="Info5" /><f info="Info6" /></b></a>
<a><b info="Info1"><c info="Info2" /><d info="Info3" /></b><b info="Info4"><e info="Info5" /><f info="Info6" /></b></a>
 

Схема XSD генерируется программно. Для такого случая генерируется следующая схема:

 <element name="a">
    <complexType>
        <sequence>
            <sequence minOccurs="0">
                <element name="b">
                    <annotation>
                        <documentation>
                            <info>Info1</info>
                        </documentation>
                    </annotation>
                    <complexType>
                        <sequence>
                            <element name="c">
                                <annotation>
                                    <documentation>
                                        <info>Info2</info>
                                    </documentation>
                                </annotation>
                            </element>
                            <element name="d">
                                <annotation>
                                    <documentation>
                                        <title>Info3</title>
                                    </documentation>
                                </annotation>
                            </element>
                        </sequence>
                    </complexType>
                </element>
            </sequence>
            <sequence minOccurs="0">
                <element name="b">
                    <annotation>
                        <documentation>
                            <info>Info4</info>
                        </documentation>
                    </annotation>
                    <complexType>
                        <sequence>
                            <element name="e">
                                <annotation>
                                    <documentation>
                                        <info>Info5</info>
                                    </documentation>
                                </annotation>
                            </element>
                            <element name="f">
                                <annotation>
                                    <documentation>
                                        <title>Info6</title>
                                    </documentation>
                                </annotation>
                            </element>
                        </sequence>
                    </complexType>
                </element>
            </sequence>
        </sequence>
    </complexType>
</element>
 

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

Но такая схема недопустима, так как на одном и том же уровне есть два блока «b» с одинаковым именем. Поскольку эти блоки содержат разные информационные атрибуты, которые должны быть включены в блок «аннотации», они не могут быть объединены в один.

Как я могу составить такую схему для всех возможных случаев?

Ответ №1:

Вы не разъяснили, каковы фактические правила, вы показали нам только несколько примеров.

Но у XSD есть абсолютное правило, что если два родственных элемента имеют одинаковое имя, то они должны иметь одинаковый объявленный тип.

Комментарии:

1. Что еще я могу добавить к своему примеру? Я попытался объяснить это как можно проще и подробнее. Я не могу объединить их в одно объявление, поскольку у них разные аннотации с описанием

2. Даже если я объединю элементы <b>, как мне убедиться, что они не потеряют свою жесткую связь с вложенными элементами? И ошибка проверки XSD, например, для такого XML <a><b info = «Info1» /></a> без вложенных элементов