我有以下XSD:
<xsd:complexContent>
<xsd:extension base="mes:Request">
<xsd:sequence>
<xsd:element name="empId" type="xsd:string"/>
<xsd:element name="empTaskId" type="xsd:int"/>
<xsd:element name="empStateName" type="xsd:string"/>
<xsd:element name="empTypeName" type="xsd:string"/>
<xsd:element name="empActionName" type="xsd:string"/>
<xsd:element name="empTransactionId" type="xsd:int"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
我想要的是,只允许在<sequence>
中列出的任何字段中强制使用一个字段。我尝试使用<choice>
,但它的行为类似于单选按钮;我想要复选框的功能(1个或多个字段 - 多选)。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:2)
当您开始进入“验证逻辑”时,您会遇到XML Schema的限制。 XML Schema无法做到这一点,因此您需要在应用程序的较低层使用XML Schema执行基本验证,并在上层加强XML Schema无法处理的逻辑或move to something with more expressive validation rules。
除此之外,我能想到用XML模式强制执行您的需求的最佳方法是这样的:
<?xml version="1.0" encoding="utf-8" ?>
<xsd:schema targetNamespace="http://tempuri"
elementFormDefault="qualified"
xmlns:t="http://tempuri"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Demo">
<xsd:complexType>
<xsd:choice minOccurs="1" maxOccurs="6">
<xsd:element name="empId" type="xsd:string"/>
<xsd:element name="empTaskId" type="xsd:int"/>
<xsd:element name="empStateName" type="xsd:string"/>
<xsd:element name="empTypeName" type="xsd:string"/>
<xsd:element name="empActionName" type="xsd:string"/>
<xsd:element name="empTransactionId" type="xsd:int"/>
</xsd:choice>
</xsd:complexType>
<xsd:unique name="unique1">
<xsd:selector xpath="."/>
<xsd:field xpath="t:empId"/>
</xsd:unique>
<xsd:unique name="unique2">
<xsd:selector xpath="."/>
<xsd:field xpath="t:empTaskId"/>
</xsd:unique>
<xsd:unique name="unique3">
<xsd:selector xpath="."/>
<xsd:field xpath="t:empStateName"/>
</xsd:unique>
<xsd:unique name="unique4">
<xsd:selector xpath="."/>
<xsd:field xpath="t:empTypeName"/>
</xsd:unique>
<xsd:unique name="unique5">
<xsd:selector xpath="."/>
<xsd:field xpath="t:empActionName"/>
</xsd:unique>
<xsd:unique name="unique6">
<xsd:selector xpath="."/>
<xsd:field xpath="t:empTransactionId"/>
</xsd:unique>
</xsd:element>
</xsd:schema>
您使用<choice>
元素仅选择一种带有minOccurs="1"
的元素,这样您就可以拥有至少一个元素和maxOccurs="6"
来拥有它们。但是现在你可以多次选择相同的元素,所以你必须限制它,这就是<unique>
发挥作用的地方。
但请注意,这个例子并非没有限制,因为你不能限制元素的顺序(即加强<sequence>
限制)。