Can two elements have different names but same type in XSD?

泪湿孤枕 提交于 2021-02-11 07:13:46

问题


Consider the two scenarios:

I have one XML that looks like:

<personinfo>
   <info> 
        <option1>Coke</option1>
   </info>
</personinfo>

where I should have a choice between an option1 and option2 element.

I have another XML that looks like:

 <personinfo>
       <info> 
            <firstname>Yair</firstname>
            <lastname>Zaslavsky</lastname>
       </info>
    </personinfo>

where both firstname and lastname should appear (hence a sequence).

I have tried to use the following schema:

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

  <xs:complexType name="optionsChoice">
    <xs:choice>
      <xs:element name="option1" type="xs:string"/>
      <xs:element name="option2" type="xs:string"/>
    </xs:choice>
  </xs:complexType>

  <xs:complexType name="optionsSequence">
     <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
  </xs:complexType>

<xs:complexType name="personinfo">
  <xs:choice>
      <xs:element name="info" type="optionsSequence"/>
      <xs:element name="info" type="optionsChoice"/>
    </xs:choice>
</xs:complexType>


</xs:schema>

With no luck.

Bear in mind that I must have "info" as an element name in both cases.

How can I fix this issue?


回答1:


You cannot have two elements with the same name but different types appear in a content model together.

You can, however, push the choice down such that personinfo can be either a choice of option1 or option2 or a sequence of firstname and lastname:

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

  <xs:element name="personinfo">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="info">
          <xs:complexType>
            <xs:choice>
              <xs:choice>
                <xs:element name="option1" type="xs:string"/>
                <xs:element name="option2" type="xs:string"/>
              </xs:choice>
              <xs:sequence>
                <xs:element name="firstname" type="xs:string"/>
                <xs:element name="lastname" type="xs:string"/>
              </xs:sequence>
            </xs:choice>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

This XSD would valid both of your XML documents successfully.



来源:https://stackoverflow.com/questions/33358817/can-two-elements-have-different-names-but-same-type-in-xsd

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!