Схема XMl: уникальные значения ключей в родительском - PullRequest
3 голосов
/ 07 декабря 2010

У меня есть следующий XML:

    <enumTypes xmlns="tempURI">
    <enumType id="1">
        <enumValue id="1" value="Item1"/>
        <enumValue id="2" value="Item2"/>
        <enumValue id="3" value="Item3"/>
    </enumType>
    <enumType id="2">
        <enumValue id="1" value="Item1"/>
        <enumValue id="2" value="Item2"/>
    </enumType>
</enumTypes>

У меня также есть следующая схема:

                <xs:element name="enumTypes">
                <xs:complexType>
                    <xs:sequence minOccurs="1" maxOccurs="unbounded">
                        <xs:element name="enumType">
                            <xs:complexType>
                                <xs:sequence minOccurs="1" maxOccurs="unbounded">
                                    <xs:element name="enumValue">
                                        <xs:complexType>
                                            <xs:attribute name="id" type="xs:string" use="required"/>
                                            <xs:attribute name="value" type="xs:string" use="required"/>
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                                <xs:attribute name="id" type="xs:string"/>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
    <xs:key name="enumTypeKey">
        <xs:selector xpath="enumTypes/enumType"/>
        <xs:field xpath="@id"/>
    </xs:key>
    <xs:key name="enumValueKey">
        <xs:selector xpath="enumTypes/enumType/enumValue"/>
        <xs:field xpath="@id"/>
    </xs:key>

Я пытаюсь сделать так, чтобы идентификаторы enumValue были уникальными В пределах enumTypeно пока я могу заставить его быть уникальным для ВСЕХ типов enumTypes.

Я предполагаю, что есть проблема с моим селектором XPath, но я не могу разобраться с этим.

Любая помощь будет оценена!

Ответы [ 2 ]

3 голосов
/ 11 декабря 2010

Я думаю, что вы дали только фрагмент вашего xsd? Отладка проще, если вы можете предоставить рабочий фрагмент. Я добавил окружение <element name="root">, чтобы оно подтвердилось.

Кажется, проблема в том, что селектор enumValueKey группирует все enumValues по всем enumType; но вы хотите сгруппировать их только в пределах одного enumType.

Единственный способ исправить это - переместить <key> для enumValues в элемент enumType (и отрегулировать селектор xpath), так что все становится так:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="enumTypes">
          <xs:complexType>
            <xs:sequence minOccurs="1" maxOccurs="unbounded">
              <xs:element name="enumType">
                <xs:complexType>
                  <xs:sequence minOccurs="1" maxOccurs="unbounded">
                    <xs:element name="enumValue">
                      <xs:complexType>
                        <xs:attribute name="id" type="xs:string" use="required"/>
                        <xs:attribute name="value" type="xs:string" use="required"/>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="id" type="xs:string"/>
                </xs:complexType>
                <xs:key name="enumValueKey">
                  <xs:selector xpath="enumValue"/>
                  <xs:field xpath="@id"/>
                </xs:key>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:key name="enumTypeKey">
      <xs:selector xpath="enumTypes/enumType"/>
      <xs:field xpath="@id"/>
    </xs:key>
  </xs:element>
</xs:schema>

Это работает, поскольку позволяет использовать ваш XML-пример и запрещает следующий фрагмент (с двумя 1), как следует:

...
<enumType id="2">
  <enumValue id="1" value="Item1"/>
  <enumValue id="1" value="Item2"/>
</enumType>
...

Дайте мне знать, если это работает для вас. Мне также интересно, есть ли другой способ выразить это.

0 голосов
/ 09 декабря 2010

Я думаю, что ваши операторы xs: key будут записаны внутри элемента <xs:element name="enumTypes">. Итак:

<xs:element name="enumTypes">
 ... what you want ...
 <xs:key ... and so on
</xs:element> 
...