XML-схема - обойти ограничение уникального тега
Вопрос
Я должен сделать схему для формата XML, который уже используется. Существующий XML уже генерируется другой программой, и кажется, что будет трудно отследить все места, которые необходимо изменить, чтобы использовать более регулярный формат XML.
Вот пример, похожий на нашу структуру XML:
<data>
<summary>some info</summary>
<error>error message (only if there was an error)</error>
<details>more info
<x>more</x>
<y>even more</y>
</details>
<error>another error message</error>
<z>some extra info</z>
</data>
Обратите внимание, что тег ошибки используется повторно на том же уровне и следует за определенными элементами, но не за другими, поэтому я не могу просто установить maxOccurs = " unbounded " ;. Я попытался обернуть связанные пары тегов error / other в xsd: sequence, но это не сработало, потому что я все еще эффективно нарушаю правило уникальной атрибуции частиц.
Можно ли это даже сделать или мне нужно сообщить другим разработчикам, что эта схема не будет проверяться?
Решение
Мое чтение стандарта XML-схемы говорит о том, что вы, вероятно, в безопасности. Вы просто определяете непоследовательные элементы с одинаковыми именами в своей схеме, чтобы отразить XML, как он будет (или может быть) создан. Пока все & Quot; error & Quot; экземпляры всегда разделены другими элементами и не являются последовательными, это не должно быть проблемой. Например, что-то вроде:
<xs:element name="data"> <xs:complexType> <xs:sequence> <xs:element name="summary" minOccurs="1" maxOccurs="1" type="xs:string" /> <xs:element ref="error" minOccurs="1" maxOccurs="1" /> <xs:element name="details" minOccurs="1" maxOccurs="1" type="detailsType" /> <xs:element ref="error" minOccurs="1" maxOccurs="1" /> <xs:element name="z" minOccurs="0" maxOccurs="1" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="error" type="xs:string"/> <xs:complexType name="detailsType"> .... </xs:complexType>
Если в сведениях есть minOccurs = " 0 " и первый " error " выше имеет maxOccurs > 1, тогда вы не выполняете правило уникальной атрибуции частиц, потому что проверка не может проверить, если у вас есть два элемента ошибки в строке, какой экземпляр & Quot; error & Quot; в схеме они принадлежат. Однако до тех пор, пока каждый экземпляр & Quot; error & Quot; может быть однозначно идентифицирован в схеме благодаря правильному использованию " minOccurs " и " maxOccurs " для элементов ошибок и для промежуточных элементов, тогда вы хороши.
Вы даже можете иметь последовательные экземпляры " error " при условии, что средство проверки схемы всегда может однозначно определить, на какой экземпляр ссылаются, например, с помощью minOccurs и maxOccurs.
Подумайте о xhtml, в котором элементы могут встречаться в любом порядке с произвольным повторением.
РЕДАКТИРОВАТЬ: Обновлено, чтобы отразить изменения в исходном вопросе.