Помогите написать схему XSD
От: andy73  
Дата: 03.02.06 08:52
Оценка:
Пример на XML:
<МояСемья>
  <Отец>...</Отец>
  <Мать>...</Мать>
  <Брат>...</Брат>
  <Брат>...</Брат>
  <Сестра>...</Сестра>
  <Брат>...</Брат>
  <Брат>...</Брат>
  <Сестра>...</Сестра>
  ...
</МояСемья>

Смысл в том,что отец и мать могут быть только по одному или отсутствовать, а сестер и братьев сколько угодно. Порядок не важен.
Re: Помогите написать схему XSD
От: V.Petrovski Беларусь  
Дата: 03.02.06 08:58
Оценка:
Здравствуйте, andy73, Вы писали:

A>Смысл в том,что отец и мать могут быть только по одному или отсутствовать, а сестер и братьев сколько угодно. Порядок не важен.


используй xsd:choice И min(max)Occurs
<< RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Помогите написать схему XSD
От: andy73  
Дата: 03.02.06 09:18
Оценка:
Если так:

<xs:choice minOccurs="0" maxOccurs="unbounded">
  <xs:element name="Мать"/>
  <xs:element name="Отец"/>
  <xs:element name="Брат"/>
  <xs:element name="Сетстра"/>
</xs:choice>

То вроде все нормально, но мать и отец могут повторяться, а должны быть максимум по одному.
Re: Помогите написать схему XSD
От: Gad  
Дата: 03.02.06 09:47
Оценка:
Здравствуйте, andy73, Вы писали:

A>Пример на XML:

A>
A><МояСемья>
A>  <Отец>...</Отец>
A>  <Мать>...</Мать>
A>  <Брат>...</Брат>
A>  <Брат>...</Брат>
A>  <Сестра>...</Сестра>
A>  <Брат>...</Брат>
A>  <Брат>...</Брат>
A>  <Сестра>...</Сестра>
A>  ...
A></МояСемья>
A>

A>Смысл в том,что отец и мать могут быть только по одному или отсутствовать, а сестер и братьев сколько угодно. Порядок не важен.


    <xs:element name="МояСемья">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Отец" minOccurs="0"/>
                <xs:element name="Мать" minOccurs="0"/>
                <xs:element name="Брат" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="Сестра" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

P.S.
если minOccurs/maxOccurs не указаны, то по умолчанию они 1/1 насколько я помню.
Re[2]: Помогите написать схему XSD
От: Gad  
Дата: 03.02.06 09:58
Оценка:
Здравствуйте, Gad, Вы писали:

Gad>Здравствуйте, andy73, Вы писали:


A>>Пример на XML:

A>>
A>><МояСемья>
A>>  <Отец>...</Отец>
A>>  <Мать>...</Мать>
A>>  <Брат>...</Брат>
A>>  <Брат>...</Брат>
A>>  <Сестра>...</Сестра>
A>>  <Брат>...</Брат>
A>>  <Брат>...</Брат>
A>>  <Сестра>...</Сестра>
A>>  ...
A>></МояСемья>
A>>

A>>Смысл в том,что отец и мать могут быть только по одному или отсутствовать, а сестер и братьев сколько угодно. Порядок не важен.


Gad>
Gad>    <xs:element name="МояСемья">
Gad>        <xs:complexType>
Gad>            <xs:sequence>
Gad>                <xs:element name="Отец" minOccurs="0"/>
Gad>                <xs:element name="Мать" minOccurs="0"/>
Gad>                <xs:element name="Брат" minOccurs="0" maxOccurs="unbounded"/>
Gad>                <xs:element name="Сестра" minOccurs="0" maxOccurs="unbounded"/>
Gad>            </xs:sequence>
Gad>        </xs:complexType>
Gad>    </xs:element>
Gad>

Gad>P.S.
Gad>если minOccurs/maxOccurs не указаны, то по умолчанию они 1/1 насколько я помню.

Хотя это неверно, если порядок элементов "Брат"и "Сестра" определяется только тем, что эти элементы идут после элементов родителей.
тогда как вариант можно воспользоваться substitutionGroup:

    <xs:element name="МояСемья">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Отец" minOccurs="0"/>
                <xs:element name="Мать" minOccurs="0"/>
                <xs:element ref="Брат" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="Брат"/>
    <xs:element name="Сестра" substitutionGroup="Брат"/>


Вроде как раз то что надо.
Re[3]: Помогите написать схему XSD
От: V.Petrovski Беларусь  
Дата: 03.02.06 10:18
Оценка:
Здравствуйте, andy73, Вы писали:

A>Если так:


A>
A><xs:choice minOccurs="0" maxOccurs="unbounded">
A>  <xs:element name="Мать" minOccurs="0" maxOccurs="1"/>
A>  <xs:element name="Отец" minOccurs="0" maxOccurs="1"/>
A>  <xs:element name="Брат"/>
A>  <xs:element name="Сетстра"/>
A></xs:choice>
A>


A>То вроде все нормально, но мать и отец могут повторяться, а должны быть максимум по одному.

А теперь?
<< RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Помогите написать схему XSD
От: achp  
Дата: 03.02.06 12:38
Оценка:
Здравствуйте, V.Petrovski, Вы писали:

A>>
A>><xs:choice minOccurs="0" maxOccurs="unbounded">
A>>  <xs:element name="Мать" minOccurs="0" maxOccurs="1"/>
A>>  <xs:element name="Отец" minOccurs="0" maxOccurs="1"/>
A>>  <xs:element name="Брат"/>
A>>  <xs:element name="Сетстра"/>
A>></xs:choice>
A>>


VP>А теперь?


Нарушается правило "Unique Particle Attribution".
Re[3]: Помогите написать схему XSD
От: Аноним  
Дата: 03.02.06 13:16
Оценка:
Проядок элементов в <МоейСемье> не важен!!! Хотя всех братьев и сестер можно собрать в кучу. <xs:sequence/> это не позволяет,а в <xs:all> — нельзя для элементов задавать maxOccurs="unbounded". В <xs:choice> нельзя ограничить повторяемость для <мать> <отец>.
Re[3]: Помогите написать схему XSD
От: andy73  
Дата: 03.02.06 14:04
Оценка:
В моем случае все элементы имеют разные сложные типы, а substitutionGroup вроде можно только для однотипных применять
Re[4]: Помогите написать схему XSD
От: achp  
Дата: 03.02.06 14:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Проядок элементов в <МоейСемье> не важен!!! Хотя всех братьев и сестер можно собрать в кучу. <xs:sequence/> это не позволяет,а в <xs:all> — нельзя для элементов задавать maxOccurs="unbounded". В <xs:choice> нельзя ограничить повторяемость для <мать> <отец>.


Первый вариант — определить ограничения уникальности (<unique>) для элементов <мать> и <отец>. Тогда невозможно будет создать дубляжи без нарушения этих ограничений.

Второй вариант — определить модель данных так (извините за краткое схематичное описание):

choice 0-unb
  <брат> 1-1
  <сестра> 1-1
choice 0-1
  sequence 1-1
    <мать>
    choice 0-unb
      <брат> 1-1
      <сестра> 1-1
    sequence 0-1
      <отец>
      choice 0-unb
        <брат> 1-1
        <сестра> 1-1
  sequence 1-1
    <отец>
    choice 0-unb
      <брат> 1-1
      <сестра> 1-1
    sequence 0-1
      <мать>
      choice 0-unb
        <брат> 1-1
        <сестра> 1-1


Если определить абстрактный элемент <sibling>, а <брат> и <сестра> включить в его группу подстановки, то модель данных запишется лаконичнее:

<sibling> 0-unb
choice 0-1
  sequence 1-1
    <мать>
    <sibling> 0-unb
    sequence 0-1
      <отец>
      <sibling> 0-unb
  sequence 1-1
    <отец>
    <sibling> 0-unb
    sequence 0-1
      <мать>
      <sibling> 0-unb
Re[4]: Помогите написать схему XSD
От: achp  
Дата: 03.02.06 14:09
Оценка:
Здравствуйте, andy73, Вы писали:

A>В моем случае все элементы имеют разные сложные типы, а substitutionGroup вроде можно только для однотипных применять


Или для элементов, типы данных которых связаны отношениями наследования.
Re[5]: Помогите написать схему XSD
От: andy73  
Дата: 06.02.06 07:51
Оценка:
Здравствуйте, achp, Вы писали:

A>Первый вариант — определить ограничения уникальности (<unique>) для элементов <мать> и <отец>. Тогда невозможно будет создать дубляжи без нарушения этих ограничений.


А можно поподробней про unique. какие выражения в selector и field. Уникальность по атрибуту я понимаю, а как по элементу?

Для меня этот вариант был бы проще, потому что мне этот xsd еще и парсить для разбора типов.
Re[5]: Помогите написать схему XSD
От: andy73  
Дата: 06.02.06 08:46
Оценка:
Здравствуйте, achp, Вы писали:

A>Второй вариант ...


Вообще-то я привел пример с семьей, чтобы было проще представить мой xml. Реально в нем есть много типов элементов типа <мать>, <отец> (maxOccurs=1), и много элементов типа <брат>, <сестра> (maxOccurs="unbounded"). В этом случае второй вариант слишком быстро разрастается.

Спасибо.
Re[6]: Помогите написать схему XSD
От: andy73  
Дата: 06.02.06 09:39
Оценка:
Если только к элементу добавить fixed атрибут, а потом его указывать в field. Это будет правильно?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.