1

子要素に一意の ID を持つように XSD ファイルを作成する方法がわかりません。ルート要素に対しては正常に機能しますが、このコードをコピーして値を変更しても機能しないため、何か間違ったことをしていると思います。ここに私の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 の有効なスキーマを作成する正しい方法は何ですか?

4

2 に答える 2

3

次のスキーマは、がすべての要素間で一意であること、および が同じ要素内のすべての要素間でflightid一意であることを確認します。flightplaneidplaneflight

<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>
于 2013-02-12T00:54:31.810 に答える
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="unbounded" を追加しました

これがあなたの質問に答えることを願っています。

于 2013-02-12T00:35:08.497 に答える