Модераторы: diadiavova
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> XSD: потребовать всевозможные значения параметров 
:(
    Опции темы
Dims
Дата 27.5.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



У меня есть сложный тип DimensionType, который описывает измерение. DimensionType описывает шкалу (Scale), множитель (Factor) и роль (role). Шкала и множитель задаются соответствующими дочерними элементами, а роль задаётся атрибутом. Роль может принимать три возможных значения: X, P и B.

Теперь у меня есть сложный тип Affector3Params, который описывает параметры модели. По задаче, в этих параметрах обязательно должны быть описаны три измерения всех трёх возможных ролей.

Я объявил, что Affector3Params обязательно должно содержать 3 элемента Dimension типа DimensionType, а вот как потребовать, чтобы среди этих трёх элементов обязательно бы встречались все три роли, я не знаю.

Возможно ли запрограммировать такое ограничение? Или, быть может, следует иначе подойти к самой структуре?

Вот файл:

Код

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="TexasHoldem/data/context"
            xmlns:tns="TexasHoldem/data/context"
            elementFormDefault="qualified">
    <xsd:simpleType name="ScaleType">
        <xsd:annotation>
            <xsd:documentation>Допустимые виды шкалы</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:NCName">
            <xsd:enumeration value="None"/>
            <xsd:enumeration value="Linear"/>
            <xsd:enumeration value="Logarithm"/>
            <xsd:enumeration value="Exponent"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="DimensionType">
        <xsd:annotation>
            <xsd:documentation>Все параметры измерения</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="Scale" type="tns:ScaleType"></xsd:element>
            <xsd:element name="Factor" type="xsd:double"></xsd:element>
        </xsd:sequence>
        <xsd:attribute name="role" type="tns:DimensionRole"/>
    </xsd:complexType>
    <xsd:simpleType name="DimensionRole">
        <xsd:annotation>
            <xsd:documentation>Измерения, используемые в программе</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:NCName">
            <xsd:annotation/>
            <xsd:enumeration value="X"/>
            <xsd:enumeration value="P"/>
            <xsd:enumeration value="B"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="Affector3Params">
        <xsd:annotation>
            <xsd:documentation>Параметры модели Affector3</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="Dimension" type="tns:DimensionType" maxOccurs="3" minOccurs="3"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>


PM MAIL   Вверх
LSD
Дата 27.5.2008, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 8
Всего: 538



Можно потребовать, чтобы элементов было 3 (это ты и так уже сделал) и потребовать уникальности этого атрибута.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Dims
Дата 27.5.2008, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



А как? :->
PM MAIL   Вверх
LSD
Дата 27.5.2008, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 8
Всего: 538





--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Dims
Дата 27.5.2008, 23:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Да я читал, но не врубаюсь. 

Я пришёл к выводу, что нужно куда-то поместить элемент key? Но куда? Внутрь sequence?

И что указать в selector и field?
PM MAIL   Вверх
Dims
Дата 27.5.2008, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Я написал вот так, правильно ли это:

Код

<xsd:complexType name="Affector3Params">
        <xsd:annotation>
            <xsd:documentation>Параметры модели Affector3</xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="Number" type="xsd:int"></xsd:element>
            <xsd:element name="Dimension" type="tns:DimensionType" maxOccurs="3" minOccurs="3">
                <xsd:key name="newKey">
                    <xsd:selector xpath="Dimension"/>
                    <xsd:field xpath="@role"/>
                </xsd:key>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>


Добавлено через 13 минут и 52 секунды
Не работает :(
Валидатор не находит ошибок если два раза P.
PM MAIL   Вверх
Dims
Дата 28.5.2008, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Вот такой файл успешно проходит валидацию, хотя не должен:

Код

<cont:Params  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns:cont='TexasHoldem/data/context'
   xsi:schemaLocation='TexasHoldem/data/context context.xsd'>
   <cont:Param>
      <cont:Number>1</cont:Number>
      <cont:Dimension role="X">
         <cont:Scale>None</cont:Scale>
         <cont:Factor>1.0</cont:Factor>
      </cont:Dimension>
      <cont:Dimension role="P">
         <cont:Scale>Logarithm</cont:Scale>
         <cont:Factor>2.3</cont:Factor>
      </cont:Dimension>
      <cont:Dimension role="P">
         <cont:Scale>Linear</cont:Scale>
         <cont:Factor>0.2</cont:Factor>
      </cont:Dimension>
   </cont:Param>
</cont:Params>


PM MAIL   Вверх
Dims
Дата 28.5.2008, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Когда я переписал вот так, стало частично работать:

Код

<xsd:element name="Dimension" type="tns:DimensionType" maxOccurs="3" minOccurs="3" xmlns:tns="TexasHoldem/data/context">
            <xsd:key name="newKey">
               <xsd:selector xpath=".//tns:Dimension"/>
               <xsd:field xpath="@tns:role"/>
            </xsd:key>
         </xsd:element>


В этой ситуации выдаёт ошибку: Identity Constraint error (cvc-identity-constraint.4.2.1):  element "Dimension" has a key with no value. [18] 

То есть, как я понимаю, она поняла, к какому элементу относится требование, но не поняла, к какому полю. Как-то я неправильно путь к атрибуту указываю...

Добавлено через 2 минуты и 11 секунд
Хм...

Когда я переписал вот так, то снова перестало работать:

Код

<xsd:element name="Dimension" type="tns:DimensionType" maxOccurs="3" minOccurs="3" xmlns:tns="TexasHoldem/data/context">
            <xsd:key name="newKey">
               <xsd:selector xpath=".//tns:Dimension"/>
               <xsd:field xpath="@role"/>
            </xsd:key>
         </xsd:element>


Добавлено через 2 минуты и 32 секунды
(то есть, проходит валидацию, хотя не должно)
PM MAIL   Вверх
LSD
Дата 28.5.2008, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 8
Всего: 538



Дай полную схему без уникальности и пример XML, а то сейчас тут какие-то куски схемы, сиди и гадай по ним.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Dims
Дата 28.5.2008, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Вот так сейчас выглядит схема:

Код

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="TexasHoldem/data/context"
            xmlns:tns="TexasHoldem/data/context"
            elementFormDefault="qualified">
   <xsd:simpleType name="ScaleType">
      <xsd:annotation>
         <xsd:documentation>Допустимые виды шкалы</xsd:documentation>
      </xsd:annotation>
      <xsd:restriction base="xsd:NCName">
         <xsd:enumeration value="None"/>
         <xsd:enumeration value="Linear"/>
         <xsd:enumeration value="Logarithm"/>
         <xsd:enumeration value="Exponent"/>
      </xsd:restriction>
   </xsd:simpleType>
   <xsd:complexType name="DimensionType">
      <xsd:annotation>
         <xsd:documentation>Все параметры измерения</xsd:documentation>
      </xsd:annotation>
      <xsd:sequence>
         <xsd:element name="Scale" type="tns:ScaleType">
         </xsd:element>
         <xsd:element name="Factor" type="xsd:double">
         </xsd:element>
      </xsd:sequence>
      <xsd:attribute name="role" type="tns:DimensionRole"/>
   </xsd:complexType>
   <xsd:simpleType name="DimensionRole">
      <xsd:annotation>
         <xsd:documentation>Измерения, используемые в программе</xsd:documentation>
      </xsd:annotation>
      <xsd:restriction base="xsd:NCName">
         <xsd:enumeration value="X"/>
         <xsd:enumeration value="P"/>
         <xsd:enumeration value="B"/>
      </xsd:restriction>
   </xsd:simpleType>
   <xsd:complexType name="Affector3Params">
      <xsd:annotation>
         <xsd:documentation>Параметры модели Affector3</xsd:documentation>
      </xsd:annotation>
      <xsd:sequence>
         <xsd:element name="Number" type="xsd:int">
         </xsd:element>
         <xsd:element name="Dimension" type="tns:DimensionType" maxOccurs="3" minOccurs="3" xmlns:tns="TexasHoldem/data/context">
            <xsd:key name="roleKey">
               <xsd:selector xpath="tns:Dimension"/>
               <xsd:field xpath="@role"/>
            </xsd:key>
         </xsd:element>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:element name="Params">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element name="Param" type="tns:Affector3Params" maxOccurs="unbounded">
               <xsd:key name="ParamNumberUnique">
                  <xsd:selector xpath="DataPoint"/>
                  <xsd:field xpath="@Number"/>
               </xsd:key>
            </xsd:element>
         </xsd:sequence>
      </xsd:complexType>
   </xsd:element>
   <xsd:complexType name="DataPointType">
      <xsd:sequence>
         <xsd:element name="Number" type="xsd:int">
         </xsd:element>
         <xsd:element name="X" type="xsd:int" maxOccurs="10" minOccurs="2">
         </xsd:element>
         <xsd:element name="P" type="xsd:int">
         </xsd:element>
         <xsd:element name="B" type="xsd:int">
         </xsd:element>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="ResultType">
      <xsd:sequence>
         <xsd:element name="ParamNumber" type="xsd:int">
         </xsd:element>
         <xsd:element name="DataPointNumber" type="xsd:int">
         </xsd:element>
         <xsd:element name="R" type="xsd:double">
         </xsd:element>
         <xsd:element name="Generated" type="xsd:dateTime">
         </xsd:element>
         <xsd:element name="Remark" type="xsd:string">
         </xsd:element>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:element name="DataPoints">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element name="DataPoint" type="tns:DataPointType" maxOccurs="unbounded">
               <xsd:key name="DataPointNumberUnique">
                  <xsd:selector xpath="DataPoint"/>
                  <xsd:field xpath="@Number"/>
               </xsd:key>
            </xsd:element>
         </xsd:sequence>
      </xsd:complexType>
   </xsd:element>
   <xsd:element name="Results">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element name="Result" type="tns:ResultType" maxOccurs="unbounded">
               <xsd:key name="ResultUnique">
                  <xsd:selector xpath="Result"/>
                  <xsd:field xpath="@ParamNumber"/>
                  <xsd:field xpath="@DataPointNumber"/>
               </xsd:key>
            </xsd:element>
         </xsd:sequence>
      </xsd:complexType>
   </xsd:element>
</xsd:schema>



Добавлено через 1 минуту и 19 секунд
А вот так выглядит файл, который проходит валидацию, но который, по моему мнению, не должен:

Код

<?xml version="1.0" encoding="UTF-8"?>
<cont:Params  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns:cont='TexasHoldem/data/context'
   xsi:schemaLocation='TexasHoldem/data/context context.xsd'>
   <cont:Param>
      <cont:Number>1</cont:Number>
      <cont:Dimension role="X">
         <cont:Scale>None</cont:Scale>
         <cont:Factor>1.0</cont:Factor>
      </cont:Dimension>
      <cont:Dimension role="P">
         <cont:Scale>Logarithm</cont:Scale>
         <cont:Factor>2.3</cont:Factor>
      </cont:Dimension>
      <cont:Dimension role="P">
         <cont:Scale>Linear</cont:Scale>
         <cont:Factor>0.2</cont:Factor>
      </cont:Dimension>
   </cont:Param>
</cont:Params>


Добавлено через 3 минуты и 19 секунд
И такой теоретический вопрос: зачем внутри тега key требуется параметр selector? Для меня, по аналогии с СУБД, это не совсем понятно. Получается, ключ находится внутри одной таблицы, а ограничение может накладывать на другую. Зачем это нужно?
PM MAIL   Вверх
Dims
Дата 29.5.2008, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Нижеследующий код заработал. Получается, что ключ нельзя присвоить классу, а можно объявить только там, где класс используется, то есть, в другом месте с тем же классом ключа может и не быть?

Код

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="TexasHoldem/data/context"
            xmlns:tns="TexasHoldem/data/context"
            elementFormDefault="qualified">
   <xsd:simpleType name="ScaleType">
      <xsd:annotation>
         <xsd:documentation>Допустимые виды шкалы</xsd:documentation>
      </xsd:annotation>
      <xsd:restriction base="xsd:NCName">
         <xsd:enumeration value="None"/>
         <xsd:enumeration value="Linear"/>
         <xsd:enumeration value="Logarithm"/>
         <xsd:enumeration value="Exponent"/>
      </xsd:restriction>
   </xsd:simpleType>
   <xsd:complexType name="DimensionType">
      <xsd:annotation>
         <xsd:documentation>Все параметры измерения</xsd:documentation>
      </xsd:annotation>
      <xsd:sequence>
         <xsd:element name="Scale" type="tns:ScaleType">
         </xsd:element>
         <xsd:element name="Factor" type="xsd:double">
         </xsd:element>
      </xsd:sequence>
      <xsd:attribute name="role" type="tns:DimensionRole"/>
   </xsd:complexType>
   <xsd:simpleType name="DimensionRole">
      <xsd:annotation>
         <xsd:documentation>Измерения, используемые в программе</xsd:documentation>
      </xsd:annotation>
      <xsd:restriction base="xsd:NCName">
         <xsd:enumeration value="X"/>
         <xsd:enumeration value="P"/>
         <xsd:enumeration value="B"/>
      </xsd:restriction>
   </xsd:simpleType>
   <xsd:complexType name="Affector3">
      <xsd:annotation>
         <xsd:documentation>Параметры модели Affector3</xsd:documentation>
      </xsd:annotation>
      <xsd:sequence>
         <xsd:element name="Number" type="xsd:int">
         </xsd:element>
         <xsd:element name="Dimension" type="tns:DimensionType" maxOccurs="3" minOccurs="3" xmlns:tns="TexasHoldem/data/context">
         </xsd:element>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="DataPointType">
      <xsd:sequence>
         <xsd:element name="Number" type="xsd:int">
         </xsd:element>
         <xsd:element name="X" type="xsd:int" maxOccurs="10" minOccurs="2">
         </xsd:element>
         <xsd:element name="P" type="xsd:int">
         </xsd:element>
         <xsd:element name="B" type="xsd:int">
         </xsd:element>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:complexType name="ResultType">
      <xsd:sequence>
         <xsd:element name="ParamNumber" type="xsd:int">
         </xsd:element>
         <xsd:element name="DataPointNumber" type="xsd:int">
         </xsd:element>
         <xsd:element name="R" type="xsd:double">
         </xsd:element>
         <xsd:element name="Generated" type="xsd:dateTime">
         </xsd:element>
         <xsd:element name="Remark" type="xsd:string">
         </xsd:element>
      </xsd:sequence>
   </xsd:complexType>
   <xsd:element name="Context">
      <xsd:complexType>
         <xsd:sequence>
            <xsd:element name="Params">
               <xsd:complexType>
                  <xsd:sequence>
                     <xsd:element name="Param" type="tns:Affector3" maxOccurs="unbounded">
                        <xsd:key name="roleKey">
                           <xsd:selector xpath="tns:Dimension"/>
                           <xsd:field xpath="@role"/>
                        </xsd:key>
                     </xsd:element>
                  </xsd:sequence>
               </xsd:complexType>
               <xsd:key name="ParamNumberUnique">
                  <xsd:selector xpath="tns:Param"/>
                  <xsd:field xpath="tns:Number"/>
               </xsd:key>
            </xsd:element>
            <xsd:element name="DataPoints">
               <xsd:complexType>
                  <xsd:sequence>
                     <xsd:element name="DataPoint" type="tns:DataPointType" maxOccurs="unbounded"/>
                  </xsd:sequence>
               </xsd:complexType>
               <xsd:key name="DataPointNumberUnique">
                  <xsd:selector xpath="tns:DataPoint"/>
                  <xsd:field xpath="tns:Number"/>
               </xsd:key>
            </xsd:element>
            <xsd:element name="Results">
               <xsd:complexType>
                  <xsd:sequence>
                     <xsd:element name="Result" type="tns:ResultType" maxOccurs="unbounded"/>
                  </xsd:sequence>
               </xsd:complexType>
               <xsd:key name="ResultUnique">
                  <xsd:selector xpath="tns:Result"/>
                  <xsd:field xpath="tns:ParamNumber"/>
                  <xsd:field xpath="tns:DataPointNumber"/>
               </xsd:key>
            </xsd:element>
         </xsd:sequence>
      </xsd:complexType>
   </xsd:element>
</xsd:schema>

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

Прежде чем опубликовать вопрос, попробуйте воспользоваться поиском - возможно тема уже поднималась.

Также рекомендуем Вам зайти в раздел FAQ ,раздел дополняется и, возможно, там вы увидите готовое решение.

Для ответов на часто задаваемые вопросы существует FAQ раздела. Новости можно публиковать в разделе новостей. Для статей так же есть специальный раздел

Желаем удачи в Вашем деле!


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, diadiavova.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | XML, XSL | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.