Уникальное ограничение в XML-схеме

Скажем, у меня есть следующий XML файл:

<authors>
   <author>a1</author>
   <author>a2</author>
   <lastmodified>2010</lastmodified>
</authors>

и фрагмент схемы XML:

<xs:element name="authors" maxOccurs="1">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="author" maxOccurs="unbounded" type="xs:string"> </xs:element>
      <xs:element name="lastmodified" type="xs:date" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:unique name="uniqueAuthor">
     <xs:selector xpath="."/>
     <xs:field xpath="author"/>
  </xs:unique>
</xs:element>

Я хочу создать ограничение, которое не допускает двух одинаковых значений автора, но одно выше не работает. Что я делаю неправильно?

Ответ 1

selector XPath выбирает узлы, которые должны быть уникальными (в этом случае он должен выбирать узлы автора).

field XPath выбирает, что "делает их уникальными" (в этом случае использование . приведет к их типизированному значению, в этом случае используется текст между тегами, обрабатываемый как строка).

Документ

<?xml version="1.0" encoding="UTF-8"?>
<authors>
  <author>a1</author>
  <author>a2</author>
  <lastmodified>2010-01-01</lastmodified>
</authors>

должен быть действителен в отношении следующей схемы:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="authors">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="author" maxOccurs="unbounded" type="xs:string"/>
        <xs:element name="lastmodified" type="xs:date" minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
    <xs:unique name="uniqueAuthor">
      <xs:selector xpath="author"/>
      <xs:field xpath="."/>
    </xs:unique>
  </xs:element>
</xs:schema>

в то время как этого не следует:

<?xml version="1.0" encoding="UTF-8"?>
<authors>
  <author>a1</author>
  <author>a1</author>
  <lastmodified>2010-01-01</lastmodified>
</authors>

Ответ 2

Вы можете использовать type = "xs: ID" в элементе author. Существует также тип IDREF для обращения к идентификатору.