xsd相同的元素,不同的类型?

15 xml xsd

我有一种情况,XML文件中的元素在XSD中可以是两种不同的类型.

我想要做的是首先将输入的值验证为更严格的类型(如果它是填写表单的人),如果没有通过,请将其验证为较严格的类型(如果它是一个组织,填写表格),否则如果根本不验证则验证失败.

所以这基本上是这样的:

<xsd:complexType name="ForminfoType"> `
    <xsd:sequence>
        <xsd:element name="formname" type="xsd:string" />
        <xsd:element name="timestamp" type="xsd:dateTime" />
        <xsd:element name="sender" type="PersonType" minOccurs="0" />
        <xsd:element name="receiver" type="OrganizationType" minOccurs="0" />
        <xsd:element name="signature" type="xsd:string" minOccurs="0" />
    </xsd:sequence>
</xsd:complexType> 
Run Code Online (Sandbox Code Playgroud)

PersonType声明的内容基本上是根据特定模式构造的12位数字.组织类型声明的基本上只是一个10位数字.

所以我在逻辑上想要做的就是把它:

<xsd:element name="sender" type="OrganizationType" minOccurs="0" />
Run Code Online (Sandbox Code Playgroud)

进入序列,但你不能有两个具有相同名称和不同类型的元素.所以我认为我必须以其他方式解决它.

我发现的是:http: //xsd.stylusstudio.com/2007Oct/post05003.htm

这几乎是我想要做的,但我不确定这是可能的.有没有人对如何解决这个问题有任何进一步的想法?

提前致谢.

mar*_*c_s 12

不,你真的不能这样做.您有一个选项可以创建"PersonOrOrgSender"复杂类型:

  <xsd:complexType name="PersonOrOrgType">
    <xsd:choice>
      <xsd:element minOccurs="0" name="PersonSender" type="PersonType" />
      <xsd:element minOccurs="0" name="OrgSender" type="OrganizationType" />
    </xsd:choice>
  </xsd:complexType>
Run Code Online (Sandbox Code Playgroud)

然后使您的"发件人"成为该类型的实例:

<xsd:element name="sender" type="PersonOrOrgType" minOccurs="0" />
Run Code Online (Sandbox Code Playgroud)

但是你会得到这样的XML数据:

<FormInfo>
  <formname>string</formname>
  <sender>
    <OrgSender>
      <Name>string</Name>
    </OrgSender>
  </sender>  
  ...
</FormInfo>
Run Code Online (Sandbox Code Playgroud)

要么

<FormInfo>
  <formname>string</formname>
  <sender>
    <PersonSender>
      <Name>string</Name>
    </PersonSender>
  </sender>  
  ...
</FormInfo>
Run Code Online (Sandbox Code Playgroud)

你不能让一个标签(例如"发送者")在一个案例中成为一件事,而在另一个案例中成为另一个标签 - 一个标签必须具有一个明确定义的类型并且一次又一次具有该类型.