我是一名经验丰富的程序员,但最近才开始维护一个使用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>
现在看看用户想要什么,我发现我可以使用union来封装多个检查。这就是我现在正在使用的。
<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:类型属性值'对元素'LOCLONGITUDE'无效,因为它不是来自模式中的类型有效的类型,或者因为它有XSI:类型派生被阻止。
我的问题是,我是否可以让这个工作仍然允许供应商包含xsi:type =“xsd:string”?
答案 0 :(得分:0)
不,为xs:type
选择的类型必须从关联元素提供的类型中有效地派生。您不能一方面定义限制值空间的类型,另一方面支持更广泛的xs:type
声明。
另请参阅:How to restrict the value of an XML element using xsi:type in XSD?