2011-11-25 28 views
1
我在與架構驗證問題

,這是我的XMLXSD:關鍵和keyref驗證

<?xml version="1.0" encoding="utf-8" ?> 
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:noNamespaceSchemaLocation='favorites.xsd'> 
    <Favorites> 
     <Folder> 
      <Name>Entertainment</Name> 
      <Bookmarks> 
       <Bookmark ID="1"/> 
       <Bookmark ID="200"/> <!-- This should fail validation --> 
      </Bookmarks> 
     </Folder> 
    </Favorites> 
    <Bookmarks> 
     <Bookmark> 
      <ID>1</ID> 
      <URL>www.website1.com</URL> 
     </Bookmark> 
     <Bookmark> 
      <ID>2</ID> 
      <URL>www.website2.com</URL> 
     </Bookmark> 
     <Bookmark> 
      <ID>3</ID> 
      <URL>www.website3.com</URL> 
     </Bookmark> 
    </Bookmarks> 
</root> 

在書籤標識元素應該是關鍵,以及收藏夾/文件夾/書籤/書籤ID屬性應始終引用一個書籤ID。

這裏是我的xsd:

<?xml version="1.0"?> 
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'> 
    <xs:element name="root"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Favorites" type="Favorites"/> 
       <xs:element name="Bookmarks" type="Bookmarks"/> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:keyref name="bookmarkIDKeyRef" refer="bookmarkIDKey"> 
      <xs:selector xpath="root/Favorites/Folder/Bookmarks/*"/> 
      <xs:field xpath="@ID"/> 
     </xs:keyref> 
     <xs:key name="bookmarkIDKey"> 
      <xs:selector xpath="root/Bookmarks/Bookmark/ID"/> 
      <xs:field xpath="ID"/> 
     </xs:key> 
    </xs:element> 

    <xs:complexType name="Favorites"> 
     <xs:sequence maxOccurs="unbounded"> 
      <xs:element name="Folder" type="Folder"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="Folder"> 
     <xs:sequence> 
      <xs:element name="Name" type="xs:string"/> 
      <xs:element name="Bookmarks"> 
       <xs:complexType> 
        <xs:sequence maxOccurs="unbounded"> 
         <xs:element name="Bookmark"> 
          <xs:complexType> 
           <xs:attribute name="ID" type="xs:string"/> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="Bookmarks"> 
     <xs:sequence maxOccurs ="unbounded"> 
      <xs:element name="Bookmark" type="Bookmark"/> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="Bookmark"> 
     <xs:sequence> 
      <xs:element name="ID" type="xs:string"/> 
      <xs:element name="URL" type ="xs:string"/> 
     </xs:sequence> 
    </xs:complexType> 

</xs:schema> 

XML的格式良好的,但對ID屬性的驗證是行不通的。

回答

1

您的密鑰的上下文是<root>元素,因爲在架構中它們是<xs:element name="root">元素的子代。因此,您的<xs:selector> XPath失敗,因爲它們以root/...開頭,該元素不是<root>元素的子元素。將其放置在keykeyref之間。由於類似的問題,密鑰的<xs:field>也失敗。您已經選擇<ID>元素作爲上下文,然後嘗試查找此元素的<ID>子元素。將<xs:field>的XPath切換爲.(點)或從選擇器中刪除尾部/ID

這裏是一個工作代碼示例。

<xs:element name="root"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="Favorites" type="Favorites"/> 
      <xs:element name="Bookmarks" type="Bookmarks"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:keyref name="bookmarkIDKeyRef" refer="bookmarkIDKey"> 
     <xs:selector xpath="Favorites/Folder/Bookmarks/*"/> 
     <xs:field xpath="@ID"/> 
    </xs:keyref> 
    <xs:key name="bookmarkIDKey"> 
     <xs:selector xpath="Bookmarks/Bookmark"/> 
     <xs:field xpath="ID"/> 
    </xs:key> 
</xs:element>