2013-02-11 52 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

相关问题