2013-02-15 30 views
5

के साथ डुप्लिकेट आईडी की अनुमति दे रहा है, मैं पुस्तकों के लिए एक एक्सएमएल स्कीमा तैयार करने की कोशिश कर रहा हूं जहां प्रत्येक पुस्तक प्रविष्टि के लिए एक अद्वितीय आईडी निर्दिष्ट की जानी चाहिए। हालांकि यह काम नहीं कर रहा है। नीचे XSD मैं उपयोग कर रहा हूँ,एक्सएमएल स्कीमा अभी भी अद्वितीय

<?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> 

एक्सएमएल मैं इस के साथ मान्य करने के लिए कोशिश कर रहा हूँ,

<?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> 

जो भी ऐसा नहीं होना चाहिए, हालांकि ठीक मान्य है (मैं एक ही आईडी का उपयोग किया है है 2 प्रविष्टियों के लिए)। मैं एक्सएमएल में बहुत नया हूं और अगर कोई यह बता सकता है कि मैं यहां क्या गलत कर रहा हूं तो कृपया सराहना होगी?

उत्तर

10

आप गलत जगह पर <xs:unique> मिल गया है - यह पूर्वज तत्व के भीतर जो Book तत्वों अनन्य होना चाहिए, Book तत्व परिभाषा अपने आप में नहीं की परिभाषा के अंदर की जरूरत है। निम्नलिखित पुस्तिका आईडी प्रत्येक शेल्फ के भीतर अद्वितीय होना करने के लिए मजबूर है, लेकिन ये भिन्न अलमारियों में एक ही आईडी की अनुमति होगी:

<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 स्तर और उचित रूप से चयनकर्ता को समायोजित करें:

<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> 

भविष्य में संदर्भ के लिए, ध्यान दें के रूप में है कि फिर उन चयनकर्ताओं काम नहीं होता अगर अपने स्कीमा एक targetNamespace था, क्योंकि चयनकर्ता XPaths में बिना उपसर्ग नाम का मतलब हमेशा यह "कोई नाम स्थान"। आपको xmlns:tns="<target namespace URI>" को अपने xs:schema तत्व में जोड़ने की आवश्यकता होगी और फिर tns:Shelf/tns:Book के चयनकर्ता का उपयोग करें।

3

क्या आपको विशेष रूप से आईडी मानों के रूप में अंकों का उपयोग करने की आवश्यकता है? यदि नहीं, तो एक संभावना xs:ID उपयोग कर रहा है के रूप में id विशेषता xs:string के बजाय टाइप करें:

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

इस तरह केवल unique XML identifiersid विशेषता के मूल्यों के रूप में अनुमति दी जाती है। एक वैध एक्सएमएल पहचानकर्ता एक अंक से शुरू नहीं हो सकता है, हालांकि, आपको उदाहरण के लिए id-1 जैसे कुछ आईडी प्रकार को बदलना होगा।