Неоднозначная 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, которая больше"все должно быть так".