Кажется, я не могу получить правильный XPATH для XSD UNIQUE Constraint - PullRequest
4 голосов
/ 30 августа 2009

Я пытался установить ограничение UNIQUE на некоторые атрибуты, которые у меня есть, в довольно простой схеме XSD. Я использую XMLSpy и хочу наложить уникальные ограничения на TEMPLATE.ID для моих узлов (т. Е. Важно, чтобы они оставались уникальными).

Я поставил нижеследующее на место и попробовал следующее:

Сценарий 1

<xs:unique name="uniqueviewid">
  <xs:selector xpath="./views"/>
  <xs:field xpath="@id"/>
</xs:unique>

Результат: XSD: проверяет нормально XML проверяет, но не поддерживает уникальное ограничение (т. Е. Два или более элемента с одинаковым идентификатором не обнаруживаются

Сценарий 2

<xs:unique name="uniqueviewid">
  <xs:selector xpath="views"/>
  <xs:field xpath="@id"/>
</xs:unique>

** Результаты * То же, что и в сценарии 1. XSD проверяет, XML проверяет, но игнорирует дубликат @id в элементе представления

Сценарий 3

<xs:unique name="uniqueviewid">
  <xs:selector xpath="*"/>
  <xs:field xpath="@id"/>
</xs:unique>

Результаты: XSD Validates и XML Validats и он учитывает УНИКАЛЬНОЕ ограничение (т. Е. Если дублирующиеся представления с @id, то это вызывает отклонение в соответствии с проектом).

Проблема в том, что подстановочный знак равен "*", что означает, что все подузлы в VIEWPODS будут проверены, а это не то, что я хочу. Вместо этого я хочу сфокусировать противопоказание на точном пути VIEWPOS / VIEWS / @ ID.

Я думаю, что у меня XPATH - все не так, но я не могу вспомнить, что я делаю именно неправильно?


Пример XML.

Это пример XML.

<config xmlns="http://tempuri.org/RIAGenicConfig.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tempuri.org/RIAGenicConfig.xsd RIAGenicConfig.xsd">
  <view>
    <viewpods>
      <views id="view1"/>
      <views id="view1"/>
    </viewpods>
  </view>
</config>

XSD в вопросе.

<xs:schema xmlns="http://tempuri.org/RIAGenicConfig.xsd" xmlns:mstns="http://tempuri.org/RIAGenicConfig.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://tempuri.org/RIAGenicConfig.xsd" elementFormDefault="qualified" id="RIAGenicConfig">
  <xs:element name="config">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="view">
          <xs:complexType>
            <xs:choice>
              <xs:element name="viewpods">
                <xs:complexType>
                  <xs:choice>
                    <xs:element name="views" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:attribute name="id"/>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="blah"/>
                  </xs:choice>
                </xs:complexType>
                <xs:unique name="uniqueviewid">
                  <xs:selector xpath="*"/>
                  <xs:field xpath="@id"/>
                </xs:unique>
              </xs:element>
            </xs:choice>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

1 Ответ

4 голосов
/ 30 августа 2009

Определите выбор xpath для mstns: представления вместо * (все элементы):

<xs:unique name="uniqueviewid">
  <xs:selector xpath="mstns:views"/>
   <xs:field xpath="@id"/>
</xs:unique>
...