2013-04-13 3 views
1

У меня есть следующий XML:Как использовать ключ и keyref в XSD?

<?xml version="1.0" encoding="ISO-8859-1"?> 
<library xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:noNamespaceSchemaLocation="library.xsd"> 
<!--<!DOCTYPE library SYSTEM "library.dtd">--> 

<authors> 
    <author aid="a1">Bill Evjen</author> 
    <author aid="a2">Michael Kay</author> 
    <author aid="a3">Kevin Goldberg</author> 
    <author aid="a4">Michael Morrison</author> 
</authors> 

<books> 

<book bookID="b001" author="a2"> 
    <title>XSLT 2.0 and XPath 2.0 Programmer's Reference</title> 
    <stock>4</stock> 
    <publisher>John Wiley</publisher> 
    <year>2009</year> 
    <use type="advanced" /> 
    <use type="reference" /> 
</book> 

<book bookID="b002" author="a1 a2"> 
    <title>Professional XML (Programmer to Programmer) </title> 
    <stock>2</stock> 
    <publisher>John Wiley</publisher> 
    <year>2007</year> 
    <use type="professional" /> 
    <use type="advanced" /> 
    <use type="reference" /> 
</book> 

<book bookID="b003" author="a3"> 
    <title>XML: Visual QuickStart Guide</title> 
    <stock>3</stock> 
    <publisher>Peachpit Press</publisher> 
    <year>2008</year> 
    <use type="introductory" /> 
    <use type="reference" /> 
</book> 

<book bookID="b004" author="a4"> 
    <title>Sams Teach Yourself XML in 24 Hours</title> 
    <stock>5</stock> 
    <publisher>SAMS</publisher> 
    <year>2005</year> 
</book> 

</books> 

</library> 

Как использовать ключ/KeyRef в XSD, так что «автор» атрибут в книге элемент содержит значение/список значений «помощи» атрибута автора элемента?

Я протестировал следующий XSD, который я создал в визуальной студии, но получаю сообщение об ошибке «Книги Keyref» не могут найти упомянутый ключ или уникальный по области ». и я не знаю, как исправить это:

<?xml version="1.0"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="library"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="authors"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="author" maxOccurs="unbounded" type="theAuthor"/> 
      </xs:sequence> 
      </xs:complexType> 
      <xs:key name="uniqueAuthorID"> 
      <xs:selector xpath="author"/> 
      <xs:field xpath="@aid"/> 
      </xs:key> 

     </xs:element> 
     <xs:element name="books"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element name="book" type="theBook" maxOccurs="unbounded"/> 
      </xs:sequence> 
      </xs:complexType> 
      <xs:unique name="uniqueBookID"> 
      <xs:selector xpath="book"/> 
      <xs:field xpath="@bookID"/> 
      </xs:unique> 
      <xs:keyref refer="uniqueAuthorID" name="authorKeyRef"> 
      <xs:selector xpath="book"></xs:selector> 
      <xs:field xpath="@author"></xs:field> 
      </xs:keyref> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 




    <xs:complexType name="theAuthor"> 
    <xs:simpleContent> 
     <xs:extension base="xs:string"> 
     <xs:attribute name="aid" type="xs:string"> 
     </xs:attribute> 
     </xs:extension> 
    </xs:simpleContent> 
    </xs:complexType> 



    <xs:complexType name="theBook"> 
    <xs:sequence> 
     <xs:element name="title" type="xs:string"/> 
     <xs:element name="stock" type="xs:integer"/> 
     <xs:element name="publisher" type="xs:string"/> 
     <xs:element name="year" type="xs:string"/> 
     <xs:element name="use" minOccurs="0" maxOccurs="unbounded"> 
     <xs:complexType> 
      <xs:attribute name="type" type="useType" default="advanced"/> 
     </xs:complexType> 
     </xs:element> 
    </xs:sequence> 
    <xs:attribute name="bookID" type="xs:string"/> 
    <xs:attribute name="author" type="xs:string"/> 
    </xs:complexType> 

    <xs:simpleType name="useType"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="advanced" /> 
     <xs:enumeration value="reference" /> 
     <xs:enumeration value="professional" /> 
     <xs:enumeration value="introductory" /> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:schema> 

ответ

4

Проблема заключается в макете/области ваших объявлений ограничений. Давайте посмотрим на диаграмму ниже:

enter image description here

Так же, как в «фигурных скобках» программирование мире (Java/C#), ваши элементы действуют как «блок», который автоматически привязывает имя деклараций. В этом случае ваши uniqueAuthorID видны авторам и ниже, поэтому не видно, что определено под books.

Так что вам нужно сделать, это переместить и внести изменения в библиотеку uniqueAuthorID.

enter image description here

Это должно заботиться о ваших вопросов XSD.

Ваш XML не будет проверять, хотя, как вы ожидали:

The key sequence 'a1 a2' in Keyref fails to refer to some key. 

Даже если бы правильно определить автора в список ограничивается простой тип, то KeyRef механизм не нарушает его в компоненте значения. Чтобы заставить его работать, вам нужно будет преобразовать атрибут author в повторяющиеся элементы, а kave keyref проверить его на каждый элемент (на всякий случай, атрибуты не могут повторяться).

Смежные вопросы