Вопрос по XML Schema

Crys

Двинутый новичок
Вопрос по XML Schema

Может кто знает... Возможно ли (если да, то как) описать в схеме такую ситуацию:

Правильный XML
Код:
<?xml version="1.0"?>
<data>
    <field type="type1" param1="value" />
    <field type="type2" param2="value" />
</data>
В схеме должно быть описано,
> в "data" могут находиться "field" (сделано)
> в "field" должен находиться обязательный атрибут"type" с возможными значениями "type1|type2" (сделано)
> в "field" могут/должны находиться другие атрибуты, имя и значения которых задаётся исходя из значений "type"

То есть (при type==type1, должен быть атрибут param1, при type==type2, должен быть атрибут param2:

правильно
Код:
<?xml version="1.0"?>
<data>
    <field type="type1" param1="value" />
    <field type="type2" param2="value" />
</data>

не правильно
Код:
<?xml version="1.0"?>
<data>
    <field type="type1" param[b]2[/b]="value" />
    <field type="type2" param2="value" />
</data>

Возможно ли такое сделать?
 

crocodile2u

http://vbolshov.org.ru
Определи отдельные типы (complextype) для каждого значения type.
Что-то вроде:

Код:
<xs:complexType name="type1">
...
</xs:complexType>
<xs:complexType name="type2">
...
</xs:complexType>

<xs:sequence>
    <xs:element type="type1" minOccurs="0" maxOccurs="?" />
    <xs:element type="type2" minOccurs="0" maxOccurs="?" />
</xs:sequence>
 

Crys

Двинутый новичок
Это же определение для элемента. Как это к атрибуту применить-то?

-~{}~ 05.02.08 15:20:

А... Может ты имел ввиду, что создавать отдельные правила для field..
Но у меня их может быть неограниченное количество :(
 

Scud

Новичок
В RelaxNG такое можно сделать. Да и проще он гораздо чем W3C Schema.
 

Crys

Двинутый новичок
В RelaxNG такое можно сделать. Да и проще он гораздо чем W3C Schema.
Может быть проще. Но все-равно - как? :)

Код:
<element name="data" xmlns="http://relaxng.org/ns/structure/1.0">
  <zeroOrMore>
    <element name="field">
        <attribute name="type">
        <choice>
            <value type="string">type1</value>
            <value type="string">type2</value>
        </choice>
        </attribute>
    </element>
  </zeroOrMore>
</element>
а как задать дальнейшие атрибуты исходя из атрибута type?
 

Scud

Новичок
Там всё так же как в контекстно-независимых граматиках:
Код:
<element name="data">
 <zeroOrMore>
  <element name="field">
   <choice>
    <group>
     <attribute name="type">
      <value>type1</value>
     </attribute>
     <attribute name="param1" />
    </group>
    <group>
     <attribute name="type">
      <value>type2</value>
     </attribute>
     <attribute name="param2" />
    </group>
   </choice>
  </element>
 </zeroOrMore>
</element>
 

Crys

Двинутый новичок
Scud

Там всё так же как в контекстно-независимых граматиках
Мне это ничего не говорит.
По крайней мере понял, как должно быть. Спасибо большое :)


З.Ы - всё-таки было бы интересно узнать, можно ли такое сделать при помощи XML Schema?
 

crocodile2u

http://vbolshov.org.ru
Crys
Точно такое, насколько мне известно, нельзя реализовать. Мне кажется, можно лишь что-то вроде того, что я нарисовал - но это, скорее всего, не совсем то, что нужно - и дело не в количестве - это можно задать. Дело в том, что в моей реализации проверится порядок узлов: сначала в ХМЛ должны идти узлы с type="type1", а потом - с type="type2".
 
Сверху