2013-04-13 51 views
1

我有以下XML:如何在XSD中使用key和keyref?

<?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讓在書元素「作者」屬性包含author元素的「援助」屬性的值的值/列表?

我測試了以下在Visual Studio中創建的XSD,但出現錯誤「The Keyref'books'無法找到引用的鍵或唯一的範圍。」我不知道如何解決這個問題:

<?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機制不會在其成分打破它值。爲了使它工作,你將不得不將作者屬性轉換爲重複元素,並且kave keyref檢查它是否爲,而不是每個元素(以防萬一屬性無法重複)。