2013-04-03 110 views
0

我試圖寫一個XSD文件這個XSD究竟在哪裏出錯?

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:books" xmlns:bks="urn:books"> 
<xsd:element name="Books" type="bks:BooksForm"/> 
    <xsd:complexType name="BooksForm"> 
     <xsd:sequence> 
      <xsd:element name="Book" type="bks:BookForm" minOccurs="0"  maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="BookForm"> 
    <xsd:sequence> 
     <xsd:element name="Author" type="bks:AuthorForm" minOccurs="1" /><!--1--> 
     <xsd:element name="Isbn" type="xsd:string" minOccurs="1" /> 
     <xsd:element name="Title" type="xsd:string" minOccurs="1" /> 
     <xsd:element name="Publisher" type="xsd:string" minOccurs="1" /> 
     <xsd:element name="YearValue" type="bks:YearForm" minOccurs="1" /><!--2--> 
    </xsd:sequence> 
    <xsd:attribute name="Cover" type="xsd:string"/> 
    </xsd:complexType> 

    <xsd:complexType name="AuthorForm"> 
    <xsd:sequence> 
    <xsd:element name="Name" type="bks:NameForm"/><!--1--> 
     <xsd:element name="Contact" type="bks:ContactForm"/> <!--2--> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="YearForm"> 
     <xsd:sequence> 
      <xsd:element name="Year" type="xsd:integer"/><!--1--> 
     </xsd:sequence> 
    <xsd:attribute name="Edition" type="xsd:integer"/> 
    </xsd:complexType> 

    <xsd:complexType name="NameForm"> 
    <xsd:sequence> 
    <xsd:element name="First" type="xsd:string"/><!--1--> 
     <xsd:element name="Last" type="xsd:string"/> <!--2--> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="ContactForm"> 
    <xsd:sequence> 
    <xsd:element name="Phone" type="xsd:string"/><!--1--> 
    </xsd:sequence> 
    <xsd:attribute name="Office" type="xsd:string"/> 
    </xsd:complexType> 

</xsd:schema> 

與下面的XML文檔

<?xml version="1.0" encoding="utf-8"?> 
<?xml-stylesheet type="text/xsl" href="Courses.xsl"?> 
<Books> 
    <Book Cover="Paper back"> 
    <Isbn>978-1-4652-0558-2</Isbn> 
    <Title>Service-Oriented Computing</Title> 
    <Author> 
     <Name> 
     <First>John</First> 
     <Last>Doe</Last> 
     </Name> 
     <Contact Office="BY400"> 
     <Phone>480-965 000</Phone> 
     </Contact> 
    </Author> 
    <Publisher>Kendall Hunt</Publisher> 
    <Year Edition="3"> 
     <Year>2012</Year> 
    </Year> 
    </Book> 
....</Books> 

但是我得到了下面的錯誤匹配,當我嘗試在線驗證它

Line 3, 8 cvc-elt.1.a: Cannot find the declaration of element 'Books'. 

但據我所知,我宣佈正確。任何人都可以指出我在這裏做錯了什麼?謝謝

+0

你可以添加定義書籍的xsd到這個問題嗎? – 2013-04-03 19:51:29

+0

林不知道是否遺漏了一些東西,因爲我是新來的XML和XSD,但只有一個XSD和它的相應的XML。 – KodeSeeker 2013-04-03 19:53:36

回答

2

的第一個問題實際上是這一行: <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:books" xmlns:bks="urn:books">

books這裏沒有資本像它在文檔中的其他地方。

下面是一個更加「完整」的解決辦法:

我做了幾件事情。首先,我刪除了targetNamespacexmlns:bks部件。然後我重新排列BookForm類型中的一些項目,將其固定爲YearValueYear,因爲它在xml數據中。然後我刪除了對bks的所有引用。現在驗證。

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<xsd:element name="Books" type="BooksForm"/> 
    <xsd:complexType name="BooksForm"> 
     <xsd:sequence> 
      <xsd:element name="Book" type="BookForm" minOccurs="0"  maxOccurs="unbounded"/> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="BookForm"> 
    <xsd:sequence> 
     <xsd:element name="Isbn" type="xsd:string" minOccurs="1" /> 
     <xsd:element name="Title" type="xsd:string" minOccurs="1" /> 
     <xsd:element name="Author" type="AuthorForm" minOccurs="1" /><!--1--> 
     <xsd:element name="Publisher" type="xsd:string" minOccurs="1" /> 
     <xsd:element name="Year" type="YearForm" minOccurs="1" /><!--2--> 
    </xsd:sequence> 
    <xsd:attribute name="Cover" type="xsd:string"/> 
    </xsd:complexType> 

    <xsd:complexType name="AuthorForm"> 
    <xsd:sequence> 
    <xsd:element name="Name" type="NameForm"/><!--1--> 
     <xsd:element name="Contact" type="ContactForm"/> <!--2--> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="YearForm"> 
     <xsd:sequence> 
      <xsd:element name="Year" type="xsd:integer"/><!--1--> 
     </xsd:sequence> 
    <xsd:attribute name="Edition" type="xsd:integer"/> 
    </xsd:complexType> 

    <xsd:complexType name="NameForm"> 
    <xsd:sequence> 
    <xsd:element name="First" type="xsd:string"/><!--1--> 
     <xsd:element name="Last" type="xsd:string"/> <!--2--> 
    </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="ContactForm"> 
    <xsd:sequence> 
    <xsd:element name="Phone" type="xsd:string"/><!--1--> 
    </xsd:sequence> 
    <xsd:attribute name="Office" type="xsd:string"/> 
    </xsd:complexType> 

</xsd:schema> 
+0

如果你打算把它修改爲' KodeSeeker 2013-04-03 20:17:23

+0

@KodeSeeker:查看更新 – NotMe 2013-04-03 20:22:07

+0

非常感謝,它幫助! – KodeSeeker 2013-04-03 20:31:49

1

我爲你寫了一個新的XSD;希望它滿足您的需求:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Books"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Book"> 
      <xs:complexType> 
      <xs:sequence> 
       <xs:element type="xs:string" name="Isbn"/> 
       <xs:element type="xs:string" name="Title"/> 
       <xs:element name="Author"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element name="Name"> 
         <xs:complexType> 
         <xs:sequence> 
          <xs:element type="xs:string" name="First"/> 
          <xs:element type="xs:string" name="Last"/> 
         </xs:sequence> 
         </xs:complexType> 
        </xs:element> 
        <xs:element name="Contact"> 
         <xs:complexType> 
         <xs:sequence> 
          <xs:element type="xs:string" name="Phone"/> 
         </xs:sequence> 
         <xs:attribute type="xs:string" name="Office"/> 
         </xs:complexType> 
        </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
       </xs:element> 
       <xs:element type="xs:string" name="Publisher"/> 
       <xs:element name="Year"> 
       <xs:complexType> 
        <xs:sequence> 
        <xs:element type="xs:short" name="Year"/> 
        </xs:sequence> 
        <xs:attribute type="xs:byte" name="Edition"/> 
       </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
      <xs:attribute type="xs:string" name="Cover"/> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 
+1

也許更好的方法來重寫OP的工作將是解釋他的模式的問題是什麼。畢竟,這個問題是要求指出什麼是錯的。他似乎想從經驗中學到一些東西。 – NotMe 2013-04-03 20:09:26

+0

@Chris老實說,我不確定。我在工作,我沒有時間去研究它,但我很樂意給他一些有用的東西。 – Codeman 2013-04-03 20:10:09

+0

@ Pheonixblade9,實體圖書應該包含多個Book實例。我不認爲你的XSD支持 – KodeSeeker 2013-04-03 20:18:34

1

我沒有看到你的XSD沒有錯,但與XML。 您錯過了XMl中的名稱空間規範。 它應該是:<Books xmlns="urn:books">