2012-06-15 3 views
4

У меня есть XML следующим образомXML-схемы для повторения последовательности элементов

<Search> 
    <Term /> 
    <And /> 
    <Term /> 
    <And /> 
    <Term /> 
</Search> 

Там может быть п число терминов и п-1 Ands (п> 0) в последовательности, как показано на рисунке. Я попробовал следующую схему xml, но выше xml не получил подтверждения от схемы. Ошибка: cvc-complex-type.2.4.b: Содержимое элемента «Поиск» не заполнено. Ожидается одно из «{И}».

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="Search"> 
     <xs:complexType> 
      <xs:sequence>    
       <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
        <xs:element name="Term" type="xs:string" /> 
        <xs:element name="And" type="xs:string" /> 
       </xs:sequence>    
       <xs:element name="Term" minOccurs="1" maxOccurs="1" type="xs:string" />    
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Цените любую помощь со схемой XML.

+0

Какова цель «А» элемента? Вы используете его как оператор? – Kelly

+0

Да, это оператор. Существует несколько типов операторов, например, или нет, и т. Д. Но я работаю над ним, используя абстрактные типы. – bluetech

+0

Ваш XSD недействителен. Это нарушает правило уникальной частичной атрибуции. – toniedzwiedz

ответ

9

Переупорядочить их, как это, похоже, сделать это. Я что-то пропустил?

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="Search"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Term" minOccurs="1" maxOccurs="1" type="xs:string" /> 
       <xs:sequence minOccurs="0" maxOccurs="unbounded"> 
        <xs:element name="And" type="xs:string" /> 
        <xs:element name="Term" type="xs:string" /> 
       </xs:sequence> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 
4

Пересмотренная форма модели контента действительно распознает описанный язык.

Но ваш XML может быть немного более идиоматичным и почти наверняка будет легче обрабатывать, если бы вы подумали о XML в терминах абстрактного дерева синтаксиса, который вы хотите, а не в терминах литературной транскрипции поверхности синтаксис, предназначенный для последовательности токенов, а не деревьев.

Вместо использования пустого элемента And между условиями оберните соединение терминов в элементе And.

<Search> 
    <And> 
    <Term>...</Term> 
    <Term>...</Term> 
    <Term>...</Term> 
    </And> 
</Search> 

Это теперь тривиальным легко сделать произвольные булевы комбинации, не беспокоясь о том, что приоритет для того, чтобы приписывать операторов:

<Search> 
    <Or> 
    <And> 
     <Term>...</Term> 
     <Or> 
     <Term>...</Term> 
     <Term>...</Term> 
     </Or> 
    </And> 
    <And> 
     <Term>...</Term> 
     <not><Term>...</Term></not> 
    </And> 
    </Or> 
</Search> 
Смежные вопросы