【发布时间】:2016-12-02 07:09:55
【问题描述】:
我是一位经验丰富的程序员,但最近刚开始维护一个使用 xml 模式的应用程序。他们想对接受经度的项目添加一些验证。他们希望继续接受空白以及 0、0.0000000,或者如果输入了另一个值,他们希望确保至少它在美国。 (即介于 -125 和 -67 之间)
当前的 xml 模式只允许任何值。
<xs:element name="Location">
<xs:complexType>
<xs:sequence>
<xs:element name="LocLongitude"/>
</xs:sequence>
</xs:complexType>
</xs:element>
有多个供应商发送此信息。以下是他们可能发送的示例:
<Location>
<LocLongitude xsi:type="xsd:string"></LocLongitude>
</Location>
现在看看用户想要什么,我发现我可以使用联合来封装多个检查。这就是我现在使用的。
<xs:element name="Location">
<xs:complexType>
<xs:sequence>
<xs:element name="LocLongitude" nillable="true">
<xs:simpleType>
<xs:union>
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value=""/>
<xs:enumeration value="0"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="xs:double">
<xs:minInclusive value="0.00000000"/>
<xs:maxInclusive value="0.00000000"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType>
<xs:restriction base="xs:double">
<xs:minInclusive value="-125"/>
<xs:maxInclusive value="-67"/>
</xs:restriction>
</xs:simpleType>
</xs:union>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
如果我使用它会正确验证:
<Location>
<LocLongitude />
</Location>
现在,如果我使用当前供应商正在使用的东西(见下文):
<Location>
<LocLongitude xsi:type="xsd:string"></LocLongitude>
</Location>
我们得到一个错误:
XSI:TYPE 属性值“”对于元素“经度”无效,因为它不是从模式中的类型有效派生的类型,或者因为它的 XSI:TYPE 派生被阻止。
我的问题是,我可以在允许供应商包含 xsi:type="xsd:string" 的同时让它工作吗?
【问题讨论】: