Попытка схемы XSD сделать значение атрибута уникальным - PullRequest
2 голосов
/ 13 августа 2011

Я пытался использовать xs: unique, но пока безуспешно.У меня есть следующая простая схема:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema xmlns="http://testuri/test.xsd" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://testuri/test.xsd" 
      elementFormDefault="qualified" 
      id="XMLSchema1">
      <xs:element name="root">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="items">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="item" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:attribute name="id" type="xs:string" use="required"/>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:schema>

С помощью этого проверяется следующий простой XML-файл:

    <?xml version="1.0" encoding="utf-8" ?>
    <root xmlns="http://testuri/test.xsd">
      <items>
        <item id="1"/>
        <item id="1"/>
        <item id="1"/>
      </items>
    </root>

Теперь предположим, что мы хотим сделать идентификатор атрибута уникальным.Я думал о том, чтобы просто изменить схему на:

    <?xml version="1.0" encoding="utf-8"?>
    <xs:schema 
      xmlns="http://testuri/test.xsd" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="http://testuri/test.xsd" 
      elementFormDefault="qualified" id="XMLSchema1">
      <xs:element name="root">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="items">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="item" maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:attribute name="id" type="xs:string" use="required"/>
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
        <xs:unique name="itemKey">
          <xs:selector xpath="items/item"/>
          <xs:field xpath="@id"/>
        </xs:unique>
      </xs:element>
    </xs:schema>

Однако приведенный выше xml все еще проверяется.

Я уверен, что проблема заключается в xpath селектора.Есть идеи?

1 Ответ

2 голосов
/ 13 августа 2011

Я думаю, вы должны квалифицировать выражение xpath префиксами пространства имен (поскольку XPath 1.0 не имеет понятия пространства имен по умолчанию).Поэтому добавьте объявление пространства имен для целевого пространства имен:

<xs:schema 
  xmlns="http://testuri/test.xsd" 
  xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  targetNamespace="http://testuri/test.xsd" 
  xmlns:p="http://testuri/test.xsd"
  elementFormDefault="qualified" id="XMLSchema1">

, а затем используйте этот префикс в выражении xpath:

    <xs:unique name="itemKey">
      <xs:selector xpath="p:items/p:item"/>
      <xs:field xpath="@id"/>
    </xs:unique>

Я не проверял это, хотя.

...