在xsd中如何重新选择不同的组元素

时间:2013-10-30 22:00:01

标签: xml xsd

我有以下两个元素,product和customerAccount。

该产品具有以下结构,包含两个元素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>

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

非常感谢任何帮助

谢谢和问候, 开发

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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>