Уникальное ограничение в XML-схеме - PullRequest
16 голосов
/ 10 октября 2011

Допустим, у меня есть следующий 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>

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

Ответы [ 2 ]

22 голосов
/ 11 октября 2011

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

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

Документ

<?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>
1 голос
/ 11 октября 2011

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

...