Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как сделать ключ внутри сложного класса? / 10 сообщений из 10, страница 1 из 1
28.05.2008, 21:31
    #35341489
Dims
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать ключ внутри сложного класса?
У меня есть сложный тип DimensionType, который описывает "измерение" (понятие из задачи). DimensionType включает шкалу (Scale), множитель (Factor) и роль (role). Шкала и множитель задаются соответствующими дочерними элементами, а роль задаётся атрибутом. Роль может принимать три возможных значения: X, P и B.

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

Я объявил, что Affector3 обязательно должно содержать 3 элемента Dimension типа DimensionType. Теперь надо потребовать, чтобы значения атрибута role обязательно были уникальными. Я стал для этого использовать ключ, но, что-то не получается.

Наверное, я неправильно указал пути XPath?

Вот моя схема. Там ещё есть обычные ключи, они тоже не работают:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
<?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:key name="roleKey">
               <xsd:selector xpath="tns:Dimension"/>
               <xsd:field xpath="@role"/>
            </xsd:key>
         </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="ParamNumberUnique">
                           <xsd:selector xpath="DataPoint"/>
                           <xsd:field xpath="@Number"/>
                        </xsd:key>
                     </xsd:element>
                  </xsd:sequence>
               </xsd:complexType>
            </xsd:element>
            <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:sequence>
      </xsd:complexType>
   </xsd:element>
</xsd:schema>


А вот неправильный документ, который всё-таки проходит валидацию:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
<?xml version="1.0" encoding="UTF-8"?>
<cont:Context  xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
   xmlns:cont='TexasHoldem/data/context'
   xsi:schemaLocation='TexasHoldem/data/context context.xsd'>
   <cont:Params>
      <cont:Param>
         <cont:Number> 1 </cont:Number>
         <cont:Dimension role="X">
            <cont:Scale>Logarithm</cont:Scale>
            <cont:Factor> 1 </cont:Factor>
         </cont:Dimension>
         <cont:Dimension role="P">
            <cont:Scale>None</cont:Scale>
            <cont:Factor> 2 . 3 </cont:Factor>
         </cont:Dimension>
         <cont:Dimension role="B">
            <cont:Scale>Linear</cont:Scale>
            <cont:Factor> 1 . 2 </cont:Factor>
         </cont:Dimension>
      </cont:Param>
      <cont:Param>
         <cont:Number> 1 </cont:Number>
         <cont:Dimension role="X">
            <cont:Scale>Linear</cont:Scale>
            <cont:Factor> 3 . 2 </cont:Factor>
         </cont:Dimension>
         <cont:Dimension role="P">
            <cont:Scale>Linear</cont:Scale>
            <cont:Factor> 1 </cont:Factor>
         </cont:Dimension>
         <cont:Dimension role="P">
            <cont:Scale>Linear</cont:Scale>
            <cont:Factor> 2 </cont:Factor>
         </cont:Dimension>
      </cont:Param>
   </cont:Params>
   <cont:DataPoints>
      <cont:DataPoint>
         <cont:Number> 1 </cont:Number>
         <cont:X> 10 </cont:X>
         <cont:X> 20 </cont:X>
         <cont:P> 3 </cont:P>
         <cont:B> 2 </cont:B>
      </cont:DataPoint>
      <cont:DataPoint>
         <cont:Number> 2 </cont:Number>
         <cont:X> 10 </cont:X>
         <cont:X> 20 </cont:X>
         <cont:P> 3 </cont:P>
         <cont:B> 2 </cont:B>
      </cont:DataPoint>
   </cont:DataPoints>
   <cont:Results>
      <cont:Result>
         <cont:ParamNumber> 1 </cont:ParamNumber>
         <cont:DataPointNumber> 2 </cont:DataPointNumber>
         <cont:R> 3 . 4 </cont:R>
         <cont:Generated> 2008 - 05 -28T17: 16 : 00 </cont:Generated>
         <cont:Remark></cont:Remark>
      </cont:Result>
      <cont:Result>
         <cont:ParamNumber> 2 </cont:ParamNumber>
         <cont:DataPointNumber> 1 </cont:DataPointNumber>
         <cont:R> 7 . 2 </cont:R>
         <cont:Generated> 2008 - 05 -28T17: 16 : 00 </cont:Generated>
         <cont:Remark></cont:Remark>
      </cont:Result>
   </cont:Results>
</cont:Context>

Димс.
Теория относительности
...
Рейтинг: 0 / 0
28.05.2008, 22:20
    #35341559
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать ключ внутри сложного класса?
Спасибо, за огромные куски кода (хорошо, что хоть src поставили)

По сути - Вам нужно вынести xsd: key в элемент Context и дописать соответствующие пути до конкретного элемента (с указанием пространств имен). Т.е. что-то тип такого
[src] <xsd:element name="Context">
<xsd:key name="ParamNumberUnique">
<xsd:selector xpath="tns:Params/tns:Param/tns:DataPoint"/>
<xsd:field xpath="./tns:Number"/>
</xsd:key>
<xsd:complexType>
....................
</xsd:complexType>
</<xsd:element>/src]
И еще вы пишите <xsd:field xpath="@Number"/> зачем вы ставите ", Атрибута Number я у Вас не увидел

С уважением, Vasilisk
...
Рейтинг: 0 / 0
28.05.2008, 22:22
    #35341560
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать ключ внутри сложного класса?
Предыдущий пост должен был выглядеть так

Спасибо, за огромные куски кода (хорошо, что хоть src поставили)

По сути - Вам нужно вынести xsd: key в элемент Context и дописать соответствующие пути до конкретного элемента (с указанием пространств имен). Т.е. что-то тип такого
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
   <xsd:element name="Context">
        <xsd:key name="ParamNumberUnique">
          <xsd:selector xpath="tns:Params/tns:Param/tns:DataPoint"/>
          <xsd:field xpath="./tns:Number"/>
        </xsd:key>
      <xsd:complexType>
         ....................
      </xsd:complexType>
  </<xsd:element>
И еще вы пишите <xsd:field xpath="@Number"/> зачем вы ставите ", Атрибута Number я у Вас не увидел

С уважением, Vasilisk
...
Рейтинг: 0 / 0
29.05.2008, 00:38
    #35341704
Dims
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать ключ внутри сложного класса?
Спасибо, да, в этом месте у меня тоже была ошибка.

Но меня интересовало больше определение класса Affector3

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    <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:key name="roleKey">
               <xsd:selector xpath="tns:Dimension"/>
               <xsd:field xpath="@role"/>
            </xsd:key>
         </xsd:element>
      </xsd:sequence>
   </xsd:complexType>

Как его определить нужным образом? Не могу разобраться.

Димс.
Теория относительности
...
Рейтинг: 0 / 0
29.05.2008, 15:41
    #35343511
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать ключ внутри сложного класса?
DimsКак его определить нужным образом? Не могу разобраться.
Я же сказал ВСЕ КЛЮЧИ должны быть в элементе Context
...
Рейтинг: 0 / 0
29.05.2008, 21:03
    #35344438
Dims
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать ключ внутри сложного класса?
Получается, что нет возможности присвоить ключ самому классу?

Димс.
Теория относительности
...
Рейтинг: 0 / 0
29.05.2008, 21:23
    #35344456
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать ключ внутри сложного класса?
DimsПолучается, что нет возможности присвоить ключ самому классу?
Переведите пожалуйста.

Если не ошибаюсь, то область действия ключа ограничивается тем элементом, в котором он определен
...
Рейтинг: 0 / 0
30.05.2008, 00:50
    #35344601
Dims
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать ключ внутри сложного класса?
Допустим, я хочу создать такой сложный тип, в котором может быть только три элемента Dimension и все с разными атрибутами role. Получается, я этого сделать не могу (в том месте, где я определяю тип).

Димс.
Теория относительности
...
Рейтинг: 0 / 0
30.05.2008, 13:18
    #35345687
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать ключ внутри сложного класса?
не можешь
...
Рейтинг: 0 / 0
30.05.2008, 14:48
    #35345924
Dims
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как сделать ключ внутри сложного класса?
Понятно, пасиб.
...
Рейтинг: 0 / 0
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как сделать ключ внутри сложного класса? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]