powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Как сделать ключ внутри сложного класса?
10 сообщений из 10, страница 1 из 1
Как сделать ключ внутри сложного класса?
    #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
Как сделать ключ внутри сложного класса?
    #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
Как сделать ключ внутри сложного класса?
    #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
Как сделать ключ внутри сложного класса?
    #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
Как сделать ключ внутри сложного класса?
    #35343511
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimsКак его определить нужным образом? Не могу разобраться.
Я же сказал ВСЕ КЛЮЧИ должны быть в элементе Context
...
Рейтинг: 0 / 0
Как сделать ключ внутри сложного класса?
    #35344438
Dims
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получается, что нет возможности присвоить ключ самому классу?

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

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

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


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