我有一种情况,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)
你不能让一个标签(例如"发送者")在一个案例中成为一件事,而在另一个案例中成为另一个标签 - 一个标签必须具有一个明确定义的类型并且一次又一次具有该类型.
渣
| 归档时间: |
|
| 查看次数: |
18654 次 |
| 最近记录: |