1

我有以下两个元素,产品和客户帐户。

产品结构如下,有两个元素 productSerialNumber 和 serviceGuidingIdentifer

<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>

现在我想有一个选择,用户只能声明上述三个元素之一,即 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>

在选择中重新声明不同组元素的正确方法是什么。

任何帮助都感激不尽

感谢和问候, 开发

4

2 回答 2

1

至少有两个元素不是顶级的,所以你不能“引用”它们。以下模式是有效的(在 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

If you define them as complex types you can as type of ref instead.

<?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 回答