Неоднозначная XML-схема - PullRequest
       22

Неоднозначная XML-схема

7 голосов
/ 22 декабря 2008

Я пытаюсь создать довольно простую 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>. Например, определите атрибуты, которые он должен содержать. Я имею в виду, что , если присутствует важный_ тег, он должен соответствовать моему определению. Любой другой тег не должен соответствовать какому-либо определению.

Я пытался использовать следующую схему:

<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.

Я использую Altova's XML Spy.

Как мне решить эту проблему?

Спасибо, Dana

Ответы [ 3 ]

7 голосов
/ 22 декабря 2008

На MSDN есть отличная статья, в которой рассказывается о разработке расширяемых схем, которую вы можете найти здесь , я предлагаю вам пройти через все это, но конкретно к вашей точке объясняет, почему вы получаете это ошибка в пункте 2. в разделе «Использование схемы XML для разработки версионного формата XML» (вы можете найти «недетерминированный» и получить прямо там.

Как правило, если у вас есть элемент xs: любой элемент, который валидатор не может предположить, что-либо о других элементах-братьях, поэтому - у вас вполне может быть определение важный_ тега, который не требует этих обязательных атрибутов, и поэтому эти элементы не могут быть проверены

6 голосов
/ 02 января 2009

Относительно ошибки: в этом сообщении об ошибке упоминается строка, которой нет в указанном вами xsd, но эти две строки в ней неоднозначны:

<xs:element ref="important_tag" minOccurs="0"/>
<xs:any minOccurs="0"/>

Самый простой пример, показывающий неоднозначность, - это если бы был только один <important_tag>:

  <important_tag></important_tag>

Проблема заключается в том, что он может быть интерпретирован как один «важный_таг» и ноль «любых» тегов (это то, что вы хотели), но его также можно интерпретировать как ноль «важный_таг» и один «любой» тег. Это связано с тем, что тег "any" может соответствовать любому тегу, включая тег важный_ *.

Я читал, что следующая версия XML-схемы позволяет вам сказать, что вы имели в виду: любой тег , за исключением важный_таг.

Сопоставление XML двумя различными способами аналогично регулярному выражению «a * a *», совпадающему с «a» двумя различными способами (одно первое «a» или одно второе «a»). Эту неоднозначность раньше называли «недетерминированной» в спецификации XML для DTD, но спецификация схемы XML называет ее правилом уникального атрибута частиц (UPA), что означает, что вы должны иметь возможность сказать, какая часть схемы получает каждую часть документа XML.

1 голос
/ 22 декабря 2008

С вашими требованиями (например, «Любой другой тег не должен соответствовать никакому определению»), Schematron , который основан на правилах («это должно быть правдой», быть ложным ") это может быть лучшим решением, чем схема W3C, которая более" все должно быть так ".

...