2016-12-13 4 views
1

У меня есть XSD-файл:XSD хз: уникальные не удалось обнаружить дубликаты

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="library" 
      xmlns="library" 
      elementFormDefault="qualified"> 

    <xs:element name="library"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="book" minOccurs="1" maxOccurs="unbounded"/> 
      </xs:sequence> 
     </xs:complexType> 

     <xs:unique name="book-name"> 
      <xs:selector xpath="book"/> 
      <xs:field xpath="name"/> 
     </xs:unique> 
    </xs:element> 

    <xs:element name="book"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

</xs:schema> 

И в XML-экземпляр:

<library xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="library uniqueness.xsd" 
     xmlns="library"> 
    <book> 
     <name>Hihi</name> 
    </book> 
    <book> 
     <name>Hihi</name> 
    </book> 
</library> 

я использую this валидатор, чтобы проверить мои документы.

Я предположил, что экземпляр XML должен быть недействительным, так как имена обеих книг в библиотеке: Hihi, что означает, что каждое имя книги не является уникальным.

Я попытался добавить префикс пространства имен ко всему, переместив элементы xs:unique в элемент book, но все это не работает, и валидаторы XML говорят, что документ действителен.

Что я сделал не так? Любая помощь будет высоко ценится.

ответ

1

Вы говорите: «Я попробовал добавить префикс пространства имен ко всему», , но, похоже, вы допустили ошибку, потому что это проблема вашей схемы.

Обычные объявления пространства имен не применяются к выражениям XPath.

В XML-схеме 1.1 вы можете просто добавить xpathDefaultNamespace="##defaultNamespace" в элемент xs:schema.

В XML Schema 1.0, необходимо добавить явный префикс пространства имен по умолчанию и использовать этот префикс в ограничениях:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      targetNamespace="library" 
      xmlns="library" 
      xmlns:lib="library" 
      elementFormDefault="qualified"> 

    <xs:element name="library"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element ref="book" maxOccurs="unbounded"/> 
      </xs:sequence> 
     </xs:complexType> 

     <xs:unique name="book-name"> 
      <xs:selector xpath="lib:book"/> <!-- Prefixed --> 
      <xs:field xpath="lib:name"/> <!-- Prefixed --> 
     </xs:unique> 
    </xs:element> 

    <xs:element name="book"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="name" type="xs:string"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 

</xs:schema> 

Обратите внимание, что library не хорошее пространство имен. Это должен быть правильный URI, например http://example.com/library, но, конечно же, для вашего собственного домена. URI не обязательно должен быть разыменованным, но он должен быть уникальным, чтобы исключить конфликты имен.

+0

Спасибо! Однако у меня есть следующий вопрос. Почему префикс пространства имен является обязательным при указании XPath? Какова цель стандарта? –

+1

Я не знаю аргументов в пользу этого решения. Однако это просто кажется упущением, потому что оно было «исправлено» в XSD 1.1 с атрибутом «xpathDefaultNamespace». – Meyer

0

в ответ, прежде чем был прав, вы также можете изменить ваш XSD в:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 

и в вашем XML:

<library xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
Смежные вопросы