2013-02-11 51 views
1

我無法弄清楚如何創建我的XSD文件來爲子元素賦予唯一的ID。它對根元素工作正常,但複製這些代碼並更改值不起作用,所以我認爲我做錯了什麼。下面是我的XML:如何將唯一的ID添加到XSD文件中的子元素?

<?xml version="1.0" encoding="UTF-8"?> 
<flights 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="test.xsd"> 

    <flight flightid="1"> 
     <plane planeid="1">Airbus A380-861</plane> 
    </flight> 

</flights> 

下面是XSD文件:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="qualified" 
    attributeFormDefault="unqualified"> 

    <xs:element name="flights"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="flight" 
          type="flighttype" 
          minOccurs='1' 
          maxOccurs='unbounded' /> 
      </xs:sequence> 
     </xs:complexType> 
     <xs:unique name="flightidisunique"> 
      <xs:selector xpath="flight"/> 
      <xs:field xpath="@flightid"/> 
     </xs:unique> 
    </xs:element> 

    <xs:complexType name="flighttype"> 
     <xs:sequence> 
      <xs:element name="plane" 
         type="planetype" 
         minOccurs='1' 
         maxOccurs='unbounded' /> 
     </xs:sequence> 
     <xs:unique name="planeidisunique"> 
      <xs:selector xpath="plane"/> 
      <xs:field xpath="@planeid"/> 
     </xs:unique> 
     <xs:attribute name="flightid" type="xs:string"/> 
    </xs:complexType> 

    <xs:complexType name="planetype"> 
     <xs:sequence> 
     </xs:sequence> 
     <xs:attribute name="planeid" type="xs:string"/> 
    </xs:complexType> 

</xs:schema> 

什麼是創造我已經發布了XML的有效模式的正確方法是什麼?

回答

3

下面的模式可以確保flightid是在所有flight元素獨特的,planeid是衆多同flight元素中的所有plane元素獨特:

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

    <xs:element name="flights"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="flight" type="flighttype" minOccurs='1' maxOccurs='unbounded'> 
      <xs:unique name="planeidisunique"> 
      <xs:selector xpath="plane"/> 
      <xs:field xpath="@planeid"/> 
      </xs:unique> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="flightidisunique"> 
     <xs:selector xpath="flight"/> 
     <xs:field xpath="@flightid"/> 
    </xs:unique> 
    </xs:element> 

    <xs:complexType name="flighttype"> 
    <xs:sequence> 
     <xs:element name="plane" type="planetype" minOccurs='1' maxOccurs='unbounded' /> 
    </xs:sequence> 
    <xs:attribute name="flightid" type="xs:string"/> 
    </xs:complexType> 

    <xs:complexType name="planetype" mixed="true"> 
    <xs:sequence> 
    </xs:sequence> 
    <xs:attribute name="planeid" type="xs:string"/> 
    </xs:complexType> 

</xs:schema> 

模式的這種變化使得planeid唯一在所有plane元素:

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

    <xs:element name="flights"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="flight" type="flighttype" minOccurs='1' maxOccurs='unbounded'> 
     </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="flightidisunique"> 
     <xs:selector xpath="flight"/> 
     <xs:field xpath="@flightid"/> 
    </xs:unique> 
    <xs:unique name="planeidisunique"> 
     <xs:selector xpath="flight/plane"/> 
     <xs:field xpath="@planeid"/> 
    </xs:unique> 
    </xs:element> 

    <xs:complexType name="flighttype"> 
    <xs:sequence> 
     <xs:element name="plane" type="planetype" minOccurs='1' maxOccurs='unbounded' /> 
    </xs:sequence> 
    <xs:attribute name="flightid" type="xs:string"/> 
    </xs:complexType> 

    <xs:complexType name="planetype" mixed="true"> 
    <xs:sequence> 
    </xs:sequence> 
    <xs:attribute name="planeid" type="xs:string"/> 
    </xs:complexType> 

</xs:schema> 
+0

這真是太神奇了,這完全是我在找的東西!我還需要知道使飛機在全球獨一無二,或者只是在飛機內部的區別!非常感謝! – deucalion0 2013-02-12 08:57:40

2

想象你想這樣的一個xml:

<flights xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test.xsd"> 

    <flight flightid="f1"> 
     <plane planeid="f1p1">Airbus A380-861</plane> 
     <plane planeid="f1p2">Airbus A380-861</plane> 
     <plane planeid="f1p3">Airbus A380-861</plane> 
     <plane planeid="f1p4">Airbus A380-861</plane> 
    </flight> 

    <flight flightid="f2"> 
     <plane planeid="f2p1">Airbus A380-862</plane> 
    </flight> 
</flights> 

你需要這樣的模式:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 
    <xs:element name="flights"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="flight" maxOccurs="unbounded"/> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="flight"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="plane" maxOccurs="unbounded"/> 
     </xs:sequence> 
     <xs:attribute name="flightid" use="required" type="xs:ID"/> 
    </xs:complexType> 
    </xs:element> 
    <xs:element name="plane"> 
    <xs:complexType mixed="true"> 
     <xs:attribute name="planeid" use="required" type="xs:ID"/> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

對於你的ID是唯一的那些屬性將需要類型「xs:ID」和xs:ID是NCName,意思是它的名稱不是數字,例如:one或a1。 還增加的maxOccurs =「無界」的節點飛行平面

希望這回答你的問題。

+0

聲明'xs:ID'類型的屬性不足以將其值限制爲唯一。 – MiMo 2013-02-12 00:45:45

+1

@MiMo,我想你一定在想別的事情。聲明一個屬性爲xs:ID類型,肯定會限制它的值在文檔內(或在驗證根內)的xs:ID值集合中是唯一的。這比OP要求的要強一些,但並不弱。 – 2013-02-12 15:30:09

+0

@ C.M.Sperberg-McQueen:你說得對,我站好了 – MiMo 2013-02-12 17:27:39

相關問題