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

Пробовал по следующей схеме:

<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 Spy от Altova.

Как мне это решить?

Спасибо, Дана


person Dana    schedule 22.12.2008    source источник
comment
Не могли бы вы опубликовать точное сообщение об ошибке, которое вы получаете, и какие инструменты вы использовали?   -  person Tomalak    schedule 22.12.2008


Ответы (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 для DTD, но спецификация схемы XML называет ее правилом уникальной атрибуции частиц (UPA), что означает, что вы должны быть в состоянии сказать, какая часть схемы получает каждую часть. XML-документа.

person 13ren    schedule 02.01.2009
comment
Вы правы, это была именно проблема. Я преодолел это, изменив правила, то есть введя более строгую схему. И спасибо за примечание к названию тега - оно тоже изменилось :) - person Dana; 11.01.2009

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

По сути, когда у вас есть элемент xs:any, валидатор не может ничего предположить о других родственных элементах, поэтому у вас вполне может быть определение для Important_tag, которое не требует этих обязательных атрибутов, и поэтому эти элементы не могут быть проверены.

person Yossi Dahan    schedule 22.12.2008

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

person bortzmeyer    schedule 22.12.2008