Неоднозначная XML-схема
Я пытаюсь создать довольно простую XML-схему для XML, аналогичную следующей:
<messages>
<item>
<important_tag></important_tag>
</item>
<item>
<important_tag></important_tag>
<tag2></tag2>
</item>
<item>
<tag2></tag2>
<tag3></tag3>
</item>
</messages>
идея в том, что <important_tag>
будет иметь конкретное определение, и он может или не может появиться в <item>
. Он также может появляться несколько раз.
Кроме того, могут быть другие теги до и после <important_tag>
что я не могу назвать заранее.
Я хотел бы дать конкретное определение для <important_tag>
. Например, определите атрибуты, которые он должен содержать.
Что я имею в виду это если important_tag присутствует, он должен соответствовать моему определению. Любой другой тег не должен соответствовать какому-либо определению.
Я попытался использовать следующую схему:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="messages">
<xs:complexType>
<xs:sequence>
<xs:element ref="item" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item">
<xs:complexType>
<xs:sequence>
<xs:element ref="important_tag" minOccurs="0"/>
<xs:any minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="important_tag">
<xs:complexType>
<xs:simpleContent>
... specific definitions for important_tag ...
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:schema>
это приводит к ошибке, говорящей, что схема неоднозначна.
точное сообщение об ошибке:
cos-nonambig: '<xs:element ref="important_tag">' makes the content model non-deterministic against '<xs:any>'. Possible causes: name equality, overlapping occurrence or substitution groups.
Я использую XML-шпиона Altova.
как мне решить эту проблему?
спасибо, Дану
3 ответов
относительно ошибки: это сообщение об ошибке упоминает строку, которая не находится в XSD, который вы включили, но эти две строки в нем неоднозначны:
<xs:element ref="important_tag" minOccurs="0"/>
<xs:any minOccurs="0"/>
самый простой пример, чтобы показать неоднозначность, если бы был только один <important_tag>
:
<important_tag></important_tag>
проблема в том, что его можно интерпретировать как один "important_tag" и ноль "любых" тегов (что вы и хотели), но его также можно интерпретировать как ноль "important_tag" и один "любой" теги. Это потому, что" любой " тег может сопоставьте любой тег, включая "important_tag".
Я читал, что следующая версия схемы XML позволяет вам сказать, что вы имели в виду: любой тег кроме important_tag.
сопоставление XML двумя разными способами аналогично регулярному выражению "a*a*", сопоставляющему " a "двумя разными способами (один первый" a"; или один второй"a"). Эта неоднозначность раньше называлась "недетерминированной" в спецификации XML для DTDs, но спецификация схемы XML называет ее уникальной частицей Правило атрибуции (UPA), означающее, что вы должны иметь возможность определить, какая часть схемы получает каждую часть XML-документа.
в MSDN есть отличная статья, в которой говорится о разработке расширяемых схем, которые вы можете найти здесь, Я предлагаю вам пройти через все это, но конкретно к вашей точке это объясняет, почему вы получаете эту ошибку в пункте 2. в разделе "использование XML-схемы для разработки версионного формата XML" (вы можете найти "недетерминированный" и получить прямо там.
в принципе, как только у вас есть xs:любой элемент, валидатор не может ничего предположить о другом родном брате элементы, поэтому-у вас может быть определение для important_tag, которое не требует этих обязательных атрибутов, и поэтому эти элементы не могут быть проверены
с вашими требованиями (например, " любой другой тег не должен соответствовать какому-либо определению."), в schematron, который основан на правилах ("это должно быть истинно"," это должно быть ложно"), может быть лучшим решением, чем схема W3C, которая больше"все должно быть так".