【问题标题】:How to add a unique id to a child element in an XSD file?如何为 XSD 文件中的子元素添加唯一 ID?
【发布时间】:2013-02-13 01:28:36
【问题描述】:

我不知道如何创建我的 XSD 文件以使子元素具有唯一的 ID。它适用于根元素,但复制此代码并更改值不起作用,所以我认为我做错了什么。这是我的 XML:

<?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 创建有效架构的正确方法是什么?

【问题讨论】:

    标签: xsd


    【解决方案1】:

    以下架构确保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>
    

    【讨论】:

    • 这太棒了,这正是我想要的!我还需要知道让飞机在全球范围内独一无二,或者只是在飞行中的区别!非常感谢!!!
    【解决方案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。 还向节点 flightplane

    添加了 maxOccurs="unbounded"

    希望这能回答你的问题。

    【讨论】:

    • 声明xs:ID 类型的属性不足以将其值限制为唯一。
    • @MiMo,我想你一定在想别的东西。将属性声明为 xs:ID 类型肯定会限制其值在文档内(或验证根内)的 xs:ID 值集中是唯一的。这比 OP 要求的要强一些,但并不弱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2013-08-20
    • 1970-01-01
    • 2013-01-23
    • 2022-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多