1

次の 2 つの要素、product と customerAccount があります。

製品は、productSerialNumber と serviceGuidingIdentifer の 2 つの要素を持つ次の構造を持っています。

<xs:element name="product">
  <xs:complexType>
   <xs:sequence>
     <xs:element name="productSerialNumber" type="xs:string" />
     <xs:element name="serviceGuidingIdentifer">
       <xs:complexType>
         <xs:sequence>
             <xs:element name="ID" type="xs:string" />
             <xs:element name="type" type="xs:string" />
         </xs:sequence>
       </xs:complexType>
    </xs:element> 
  </xs:sequence>                                                                     
 </xs:complexType>
</xs:element>

顧客アカウントには次の構造があります

<xs:element name="customerAccount">
  <xs:complexType>
      <xs:sequence>
        <xs:element name="ID"type="xs:string" />
      </xs:sequence>
  </xs:complexType>

ここで、ユーザーが上記の 3 つの要素のうち 1 つだけを宣言できる選択肢が必要です。つまり、1)productSerialNumber または 2)serviceGuidingIdentifer または 3)customerAccount のいずれかです。

選択を宣言しようとするたびに、要素が見つからないか、要素定義が矛盾しているというエラーに直面します。

次の選択宣言を試しました

<xs:choice>
    <xs:element ref="tns:productSerialNumber"/>
    <xs:element ref="tns:serviceGuidingIdentifer"/>
    <xs:element ref="tns:customerAccount"/>
</xs:choice>

Choice で異なるグループ要素を再宣言する正しい方法は何ですか?

どんな助けでも大歓迎です

よろしくお願いします。

4

2 に答える 2

1

少なくとも 2 つの要素がトップレベルではないため、それらを「参照」することはできません。次のスキーマは有効です (Eclipse の場合)。

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

    <xs:element name="product">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="tns:productSerialNumber" />
                <xs:element ref="tns:serviceGuidingIdentifer" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="productSerialNumber" type="xs:string" />
    <xs:element name="serviceGuidingIdentifer">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ID" type="xs:string" />
                <xs:element name="type" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="customerAccount">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="ID" type="xs:string" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:element name="choice-element">
        <xs:complexType>
            <xs:choice>
                <xs:element ref="tns:productSerialNumber" />
                <xs:element ref="tns:serviceGuidingIdentifer" />
                <xs:element ref="tns:customerAccount" />
            </xs:choice>
        </xs:complexType>
    </xs:element>
</schema>
于 2013-10-30T22:29:00.810 に答える
0

それらを複雑な型として定義すると、代わりにrefの型として定義できます。

<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://Scratch.Product" targetNamespace="http://Scratch.Product" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Root">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="product">
          <xs:complexType>
            <xs:sequence>
              <xs:choice minOccurs="0">
                <xs:element name="productSerialNumber" type="xs:string" />
                <xs:element name="serviceGuidingIndetifier" type="serviceGuidingIdentiferType" />
                <xs:element name="customerAccount" type="customerAccountType" />
              </xs:choice>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="serviceGuidingIdentiferType">
    <xs:sequence>
      <xs:element name="ID" type="xs:string" />
      <xs:element name="type" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="customerAccountType">
    <xs:sequence>
      <xs:element name="ID" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
于 2013-10-30T22:40:10.210 に答える