2013-02-15 14 views
5

Her kitap girişi için benzersiz bir kimliğin belirtilmesi gereken kitaplara yönelik bir XML şeması tasarlamaya çalışıyorum. Ancak sadece işe yaramıyor. Aşağıda ben kullanıyorum XSD,XML şeması hala benzersiz kimlik ile benzersiz bir kimlik izin verir

<?xml version="1.0"?> 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified" 
      attributeFormDefault="unqualified"> 

    <xs:element name="BookShelf"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Description" type="xs:string" minOccurs="0"/> 
     <xs:element name="Shelf" type="ShelfType" minOccurs="1" maxOccurs="10"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:complexType name="ShelfType"> 
    <xs:sequence> 
     <xs:element ref="Book" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:sequence> 
    </xs:complexType> 


<xs:element name="Book"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="Title" type="xs:token"/> 
     <xs:element name="Language" type="xs:language"/> 
    </xs:sequence> 
    <xs:attribute name="id" type="xs:string" use="required"/> 
    </xs:complexType> 
    <xs:unique name="unique-bookId"> 
    <xs:selector xpath="Book"/> 
    <xs:field xpath="@id"/> 
    </xs:unique> 
</xs:element> 
</xs:schema> 

bunun ne ile doğrulamak çalışıyorum XML, hatta bu olmamalı gerçi ince doğruluyor

<?xml version="1.0"?> 

<BookShelf> 
    <Description>My bookshelf</Description> 
    <Shelf> 
     <Book id="1"> 
      <Title>Seitsemän veljestä</Title> 
      <Language>fi</Language> 
     </Book> 
     <Book id="1"> 
      <Title>Another title</Title> 
      <Language>en</Language> 
     </Book> 
    </Shelf> 
</BookShelf> 

(aynı id kullandım olduğunu 2 giriş için). Ben XML'de oldukça yeniyim ve birileri burada yanlış yaptığımı gösterebilirse memnun olur muyum?

cevap

10

Yanlış yerde <xs:unique> lazım - Book elemanları değil Book eleman tanımı kendisinde, benzersiz olmalıdır, içinde atası elemanın tanımının içinde olması gerekiyor. Aşağıdaki her bir rafın içinde benzersiz olması Kitap kimlikleri zorlayacaktır, ancak farklı raflarda aynı kimliği olanak sağlayacak: Tüm raflar sonra en benzersiz kısıtlama koymak genelinde kimlikleri genel benzersiz olmak istiyorum Bunun yerine

<xs:element name="BookShelf"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Description" type="xs:string" minOccurs="0"/> 
     <xs:element name="Shelf" type="ShelfType" minOccurs="1" maxOccurs="10"> 
      <xs:unique name="unique-bookId"> 
      <xs:selector xpath="Book"/><!-- selects books on this shelf --> 
      <xs:field xpath="@id"/> 
      </xs:unique> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

BookShelf seviyesi ve uygun seçici ayarlayın: ileride

<xs:element name="BookShelf"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="Description" type="xs:string" minOccurs="0"/> 
     <xs:element name="Shelf" type="ShelfType" minOccurs="1" maxOccurs="10"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="unique-bookId"> 
     <xs:selector xpath="Shelf/Book"/><!-- selects books on all shelves --> 
     <xs:field xpath="@id"/> 
    </xs:unique> 
    </xs:element> 

, şema bir targetNamespace olsaydı olduğu gibi selektör XPath'lerdeki öneksiz isimler hep "hayır ad" demek çünkü daha sonra bu seçiciler, işe yaramaz unutmayın. xs:schema öğenize xmlns:tns="<target namespace URI>" öğesini eklemeniz ve ardından tns:Shelf/tns:Book seçicisini kullanmanız gerekir.

3

Özellikle kimlik değerleri olarak basamak kullanmak gerekir mi?

<xs:attribute name="id" type="xs:ID" use="required"/> 

Bu şekilde sadece unique XML identifiersid özelliğin değer olarak izin verilmektedir: id yerine xs:string ait tip öznitelik olarak Değilse, bir olasılık xs:ID kullanıyor. Geçerli bir XML tanımlayıcısı bir rakamla başlayamaz, bu nedenle, kimlik türünüzü örneğin id-1 gibi bir şeye değiştirmeniz gerekecektir.

İlgili konular