#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> без вложенных элементов