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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Уникальность в рамках группы 2 
:(
    Опции темы
Compositum
  Дата 20.4.2012, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

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



Имеется такой код:
Код

        <xs:element name="acadItems">
          <xs:complexType>
            <xs:sequence>
              <xs:element maxOccurs="unbounded" name="acad">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="core" type="acadCoreNumberType" />
                    <xs:element name="year" type="xs:gYear" />
                  </xs:sequence>
                  <xs:attribute name="key" type="xs:ID" use="required"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
          <xs:unique name="uniqCore">
            <xs:selector xpath="acad/core"/>
            <xs:field xpath="."/>
          </xs:unique>
          <xs:unique name="uniqYear">
            <xs:selector xpath="acad/year"/>
            <xs:field xpath="."/>
          </xs:unique>
        </xs:element>

Я ожидаю, что значения элементов core и year будут уникальны в рамках одного элемента acadItems. Но этого не происходит. Где ошибка?
PM   Вверх
Compositum
Дата 20.4.2012, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

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



Я попробовал и такой вариант:
Код

        <xs:element name="acadItems">
          <xs:complexType>
            <xs:sequence>
              <xs:element maxOccurs="unbounded" name="acad">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="core" type="acadCoreNumberType" />
                    <xs:element name="year" type="xs:gYear" />
                  </xs:sequence>
                  <xs:attribute name="key" type="xs:ID" use="required"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
          <xs:unique name="uniqCore">
            <xs:selector xpath="acad"/>
            <xs:field xpath="core"/>            
          </xs:unique>
          <xs:unique name="uniqYear">
            <xs:selector xpath="acad"/>
            <xs:field xpath="year"/>
          </xs:unique>
        </xs:element>

тоже не пашет.
PM   Вверх
diadiavova
Дата 20.4.2012, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Да вообще-то первый вариант должен работать


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Compositum
Дата 20.4.2012, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

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



Цитата(diadiavova @ 20.4.2012,  18:56)
Да вообще-то первый вариант должен работать

можешь пояснить по поводу использования xs:selector и xs:field?
Насколько я понял - xs:selector выбирает элемент, в котором нужно выбирать уникальные элементы. А элемент(ы) xs:field указывают дочерние элементы или атрибуты, значения которых должны быть уникальны. Если указано несколько xs:field, то уникальной должна быть указанная комбинация.
Я верно понял? Если да, то тогда верным скорее должен был бы быть второй вариант кода...
PM   Вверх
diadiavova
Дата 20.4.2012, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Compositum, посмотрел твой пример более внимательно, поначалу не совсем понял проблему. Селектор определяет набор элементов внутри которых значение должно быть уникальным, а поле - сами уникальные поля. 
Для твоего случая действительно надо использовать второй вариант. Но опять-таки, если ты не используешь префиксы пространств имен в xpath-выражениях, то это как раз и может быть проблемой.

Добавлено через 3 минуты и 2 секунды
Вот посмотри, я в твой старый пример вставил ту часть схемы, что ты выложил, внес изменения и вроде работает как надо
Код

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://mea-orbis.com/2012/XMLSchema/unique" 
    targetNamespace="http://mea-orbis.com/2012/XMLSchema/unique" 
            xmlns:t="http://mea-orbis.com/2012/XMLSchema/unique"
            elementFormDefault="qualified">
  <xsd:element name="document">
    <xsd:complexType>
      <xsd:sequence>
        <!--Группа-->
        <xsd:element name="group" minOccurs="0" maxOccurs="unbounded">
          <xsd:complexType>
            <xsd:sequence>
              <!--Параметр-->
              <xsd:element name="parameter" minOccurs="0" maxOccurs="unbounded">
                <xsd:complexType>
                  <xsd:choice>
                    <xs:element name="acadItems">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element maxOccurs="unbounded" name="acad">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element name="core" type="xs:integer" />
                                <xs:element name="year" type="xs:gYear" />
                              </xs:sequence>
                              <xs:attribute name="key" type="xs:ID" use="required"/>
                            </xs:complexType>
                            
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                      <xs:unique name="uniqCore">
                        <xs:selector xpath="t:acad"/>
                        <xs:field xpath="t:core"/>
                      </xs:unique>
                      <xs:unique name="uniqYear">
                        <xs:selector xpath="t:acad"/>
                        <xs:field xpath="t:year"/>
                      </xs:unique>
                    </xs:element>
                  </xsd:choice>
                </xsd:complexType>
                
              </xsd:element>
            </xsd:sequence>
            <xsd:attribute name="name" type="xsd:ID"/>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>


Код

<?xml version="1.0" encoding="utf-8"?>
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://mea-orbis.com/2012/XMLSchema/unique">
  
  <group name="variant-1">
    <parameter>
      <acadItems>
        <acad key="_111">
          <core>1</core>
          <year>1234</year>
        </acad>
        <acad key="_112">
          <core>11</core>
<!-- Здесь укажет на ошибку из-за повторения -->
          <year>1234</year>
        </acad>
      </acadItems>
      
    </parameter>
  </group>
</document>



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Compositum
Дата 20.4.2012, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

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



Вот полный вариант моего XML файла (комментами пометил идентичные записи):
Код

<?xml version="1.0" encoding="utf-8"?>
<versions xmlns="http://mea-orbis.com/2012/XMLSchema/versions"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://mea-orbis.com/2012/XMLSchema/versions ./docSchema.xsd">
  <!--Версии AutoCAD-->
  <acadItems>
    <!--Следующие две записи имеют одинаковые 
    значения для core и year-->
    <acad key="acad2007">
      <core>17.0</core>
      <year>2007</year>
    </acad>
    <acad key="acad2008">
      <core>17.0</core>
      <year>2007</year>
    </acad>
    <acad key="acad2009">
      <core>17.2</core>
      <year>2009</year>
    </acad>
    <acad key="acad2010">
      <core>18.0</core>
      <year>2010</year>
    </acad>
    <acad key="acad2011">
      <core>18.1</core>
      <year>2011</year>
    </acad>
    <acad key="acad2012">
      <core>18.2</core>
      <year>2012</year>
    </acad>
    <acad key="acad2013">
      <core>19.0</core>
      <year>2013</year>
    </acad>
  </acadItems>
  <!--Операционная система-->
  <osItems>
    <os key="winxp">
      <version>5.1.2600.196608</version>
      <name>Windows XP SP3</name>
    </os>
    <os key="win7">
      <version>6.1.7601.65536</version>
      <name>Windows 7 SP1</name>
    </os>
  </osItems>
  <!--Платформа .Net Framework-->
  <frameworkItems>
    <platform key="net20">
      <version>2.0.50727.5420</version>
      <name>.Net Framework 2.0</name>
    </platform>
    <platform key="net30">
      <version>3.0.30729.5420</version>
      <name>.Net Framework 3.0</name>
    </platform>
    <platform key="net35sp1">
      <version>3.5.30729.5420</version>
      <name>.Net Framework 3.5 SP1</name>
    </platform>
    <platform key="net4">
      <version>4.0.30319</version>
      <name>.Net Framework 4.0</name>
    </platform>
    <platform key="net45">
      <version>4.0.30319.261</version>
      <name>.Net Framework 4.5</name>
    </platform>
  </frameworkItems>
</versions>

Полный вариант схемы для файла таков:
Код

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified"
           xmlns="http://mea-orbis.com/2012/XMLSchema/versions"
           targetNamespace="http://mea-orbis.com/2012/XMLSchema/versions"
           elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="versions">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="acadItems">
          <xs:complexType>
            <xs:sequence>
              <xs:element maxOccurs="unbounded" name="acad">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="core" type="acadCoreNumberType" />
                    <xs:element name="year" type="xs:gYear" />
                  </xs:sequence>
                  <xs:attribute name="key" type="xs:ID" use="required"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
          <!--Условия уникальности-->
          <xs:unique name="uniqCore">
            <xs:selector xpath="acad"/>
            <xs:field xpath="core"/>
          </xs:unique>
          <xs:unique name="uniqYear">
            <xs:selector xpath="acad"/>
            <xs:field xpath="year"/>
          </xs:unique>
        </xs:element>
        <xs:element name="osItems">
          <xs:complexType>
            <xs:sequence>
              <xs:element maxOccurs="unbounded" name="os">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="version" type="versionType" />
                    <xs:element name="name" type="winNameType" />
                  </xs:sequence>
                  <xs:attribute name="key" type="xs:ID" use="required"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="frameworkItems">
          <xs:complexType>
            <xs:sequence>
              <xs:element maxOccurs="unbounded" name="platform">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="version" type="versionType" />
                    <xs:element name="name" type="platformNameType" />
                  </xs:sequence>
                  <xs:attribute name="key" type="xs:ID" use="required"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <!--Номер версии ядра AutoCAD-->
  <xs:simpleType name="acadCoreNumberType">
    <xs:restriction base="xs:string">
      <xs:pattern value="[0-9]{2}\.[0-9]"/>
    </xs:restriction>
  </xs:simpleType>

  <!--Год выпуска версии AutoCAD-->
  <xs:simpleType name="versionType">
    <xs:restriction base="xs:string">
      <xs:pattern value="([0-9]{1,7}\.){2,3}[0-9]{1,7}"/>
    </xs:restriction>
  </xs:simpleType>

  <!--Наименование версии операционной системы Windows-->
  <xs:simpleType name="winNameType">
    <xs:restriction base="xs:string">
      <xs:pattern value="Windows (XP|Vista|7|8)( SP(1|2|3|4|5)){0,1}"/>
    </xs:restriction>
  </xs:simpleType>

  <!--Наименование версии платформы .Net Framework-->
  <xs:simpleType name="platformNameType">
    <xs:restriction base="xs:string">
      <xs:pattern value="\.Net Framework (2.0|3.0|3.5|4.0|4.5)( SP(1|2|3|4|5)){0,1}"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

Однако Visual Studio не кашляет на предмет нарушения схемы...

2 diadiavova
Твой вариант работает, но я не понял, почему не работает мой... :( Как XML файл находит соответствующий ему XSD? Ведь в каталоге может быть несколько XSD... Просто у меня по факту XSD файл хранится совсем в др. каталоге. Это я для примера показываю код так, как будто в том же.

Оригинальная шапка в моём XML файле такая:
Код

<?xml version="1.0" encoding="utf-8"?>
<versions xmlns="http://mea-orbis.com/2012/XMLSchema/versions"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          
  xsi:schemaLocation="http://mea-orbis.com/2012/XMLSchema/versions 
                  ../../support/versions.xsd">


Это сообщение отредактировал(а) Compositum - 20.4.2012, 20:41
PM   Вверх
diadiavova
Дата 20.4.2012, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(Compositum @  20.4.2012,  21:11 Найти цитируемый пост)
Твой вариант работает, но я не понял, почему не работает мой...

Ну я же сказал уже, что проблема в пространствах имен в xpath-выражениях.

Добавлено через 4 минуты и 13 секунд
Цитата(Compositum @  20.4.2012,  21:11 Найти цитируемый пост)
 Как XML файл находит соответствующий ему XSD? 

 smile Да никак он ее не находит, я уже не знаю, как тебе это еще объяснять... никак. Находит программа, которую ты используешь. Если это студия, то она все схемы, присутствующие в проекте просматривает. Кроме того у нее есть специальный каталог со схемами и там еще есть файл, в котором можно указать другие каталоги, в которых она будет искать схему. Просто почитай об этом на мсдн. А хмл-файл ничего не находит. Но в нем можно указать местоположение схемы, если она не расположена в тех местах, где студия будет их искать. Другие программы могут руководствоваться собственной логикой в этом вопросе. Вот и все. Ну сколько уже можно к этому возвращаться?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
diadiavova
Дата 20.4.2012, 22:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Вот почитай как студия находит схемы
http://msdn.microsoft.com/ru-ru/library/ms...28VS.90%29.aspx
Плюс схемы проекта учитываются


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Compositum
Дата 20.4.2012, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

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



Цитата

Ну я же сказал уже, что проблема в пространствах имен в xpath-выражениях

Но ведь я использую пространство имён по умолчанию, и IDE корректно подсказывает, какие элементы я должен создавать. почему в xpath не работает?
Цитата

Да никак он ее не находит, я уже не знаю, как тебе это еще объяснять... никак. Находит программа, которую ты используешь. 

я не так выразился. этот вопрос снят smile
PM   Вверх
diadiavova
Дата 20.4.2012, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Цитата(Compositum @  20.4.2012,  23:21 Найти цитируемый пост)
 почему в xpath не работает?

Этого я не знаю. Видимо он использует пространство имен контекста, то есть в каком элементе ты пишешь выражение, такое пространство и и спользуется, а поскольку это пространство схемы, то и надо указывать другое. В гибридных хмл-документах вообще с элементами без префиксов надо быть осторожным по этой причине. В конце концов тебя ведь не удивляет, что для атрибутов ты не указываешь пространство имен, но оно понимается правильно, то есть таким же как и для элемента, в котором определен атрибут. 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Compositum
Дата 21.4.2012, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Senior developer
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 430
Регистрация: 6.1.2008
Где: Санкт-Петербург

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



Я прописал во всём XML документе нэймспейсы, но всё равно unique не работает... В первых двух записях оба вложенных значения совпадает. IDE не кашляет на эту тему.
Код

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="../../support/versions.xslt"?>
<doc:versions xmlns:doc="http://mea-orbis.com/2012/XMLSchema/versions"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://mea-orbis.com/2012/XMLSchema/versions 
                  ../../support/versions.xsd">
  <!--Версии AutoCAD-->
  <doc:acadItems>
    <doc:acad key="acad2007">
      <doc:core>17.0</doc:core>
      <doc:year>2007</doc:year>
    </doc:acad>
    <doc:acad key="acad2008">
      <doc:core>17.0</doc:core>
      <doc:year>2007</doc:year>
    </doc:acad>
    <doc:acad key="acad2009">
      <doc:core>17.2</doc:core>
      <doc:year>2009</doc:year>
    </doc:acad>
    <doc:acad key="acad2010">
      <doc:core>18.0</doc:core>
      <doc:year>2010</doc:year>
    </doc:acad>
    <doc:acad key="acad2011">
      <doc:core>18.1</doc:core>
      <doc:year>2011</doc:year>
    </doc:acad>
    <doc:acad key="acad2012">
      <doc:core>18.2</doc:core>
      <doc:year>2012</doc:year>
    </doc:acad>
    <doc:acad key="acad2013">
      <doc:core>19.0</doc:core>
      <doc:year>2013</doc:year>
    </doc:acad>
  </doc:acadItems>
  <!--Операционная система-->
  <doc:osItems>
    <doc:os key="winxp">
      <doc:version>5.1.2600.196608</doc:version>
      <doc:name>Windows XP SP3</doc:name>
    </doc:os>
    <doc:os key="win7">
      <doc:version>6.1.7601.65536</doc:version>
      <doc:name>Windows 7 SP1</doc:name>
    </doc:os>
  </doc:osItems>
  <!--Платформа .Net Framework-->
  <doc:frameworkItems>
    <doc:platform key="net2.0">
      <doc:version>2.0.50727.5420</doc:version>
      <doc:name>.Net Framework 2.0</doc:name>
    </doc:platform>
    <doc:platform key="net3.0">
      <doc:version>3.0.30729.5420</doc:version>
      <doc:name>.Net Framework 3.0</doc:name>
    </doc:platform>
    <doc:platform key="net3.5sp1">
      <doc:version>3.5.30729.5420</doc:version>
      <doc:name>.Net Framework 3.5 SP1</doc:name>
    </doc:platform>
    <doc:platform key="net4.0">
      <doc:version>4.0.30319</doc:version>
      <doc:name>.Net Framework 4.0</doc:name>
    </doc:platform>    
  </doc:frameworkItems>
</doc:versions>

PM   Вверх
diadiavova
Дата 21.4.2012, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 22
Всего: 142



Compositum, ну так ты выложи свою схему, чтобы можно было запустить и посмотреть. Или как?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "XML/XSLT"
diadiavova

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

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

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

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


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

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


 




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


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

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