Как указать уникальные значения в схеме XML - PullRequest
5 голосов
/ 20 октября 2011

Я не могу получить спецификатор xs: unique для работы в файле XML. Я просто не могу разработать XPath, который работает. Приношу свои извинения за количество кода в этом вопросе, но я был бы чрезвычайно признателен всем, кто может указать ниже, что я делаю неправильно Независимо от того, что я делаю, я не могу получить атрибут @ref в элементе, чтобы сообщить об ошибке для моего дублирования значения (каждый ref должен быть уникальным).

Любая помощь или указатели на информацию будут приняты с благодарностью.

Добрые пожелания, Патрик

Это моя схема:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Artworks"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:aw="http://www.fourthwish.co.uk/data/Artworks.xsd"
xmlns="http://www.fourthwish.co.uk/data/Artworks.xsd"
targetNamespace="http://www.fourthwish.co.uk/data/Artworks.xsd"
elementFormDefault="qualified"
>
<xs:element name="artworks">
    <xs:complexType>
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
            <xs:element name="artwork" type="ArtworkType">
                <xs:unique name="uniqueRef">
                    <xs:selector xpath="artwork"/>
                    <xs:field xpath="@ref"/>
                </xs:unique>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>
<xs:complexType name="ArtworkType">
    <xs:sequence>
        <xs:element name="title" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="ref" type="xs:nonNegativeInteger"/>
</xs:complexType>
</xs:schema>

А это мой XML-файл:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<artworks
xmlns="http://www.fourthwish.co.uk/data/Artworks.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.fourthwish.co.uk/data/Artworks.xsd Artworks.xsd"
>
<artwork ref="1">
    <title>Title String</title>
</artwork>
<artwork ref="1">
    <title>Title String</title>
</artwork>
</artworks>

Почему я не получаю ошибку для повторяющихся значений ref? Arrrggghhh! Я прочитал все в Интернете. Пожалуйста, помогите кому-нибудь.

Ответы [ 3 ]

3 голосов
/ 20 октября 2011

Используйте это:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Artworks"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:aw="http://www.fourthwish.co.uk/data/Artworks.xsd"
xmlns="http://www.fourthwish.co.uk/data/Artworks.xsd"
targetNamespace="http://www.fourthwish.co.uk/data/Artworks.xsd"
elementFormDefault="qualified"
>
  <xs:element name="artworks">
    <xs:complexType>
      <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:element name="artwork" type="ArtworkType"/>
      </xs:sequence>
    </xs:complexType>

    <xs:unique name="uniqueRef">
      <xs:selector xpath="aw:artwork"/>
      <xs:field xpath="@ref"/>
    </xs:unique>

  </xs:element>

  <xs:complexType name="ArtworkType">
    <xs:sequence>
      <xs:element name="title" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="ref" type="xs:nonNegativeInteger"/>
  </xs:complexType>
</xs:schema>
1 голос
/ 20 октября 2011

Если вы запустите эту схему через Saxon-EE, она скажет вам:

Предупреждение: в строке 13 test.xsd: Сложный тип ArtworkType не допускает дочерний элемент с именем {} artwork

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

1 голос
/ 20 октября 2011

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

Как сделать univoque мое перечисление по xs: уникально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...