当您开始进入“验证逻辑”时,您会遇到 XML Schema 的限制。XML Schema 无法做到这一点,因此您要么需要在应用程序的较低层中使用 XML Schema 执行基本验证,要么在较高层中加强 XML Schema 无法处理的逻辑,或者使用更具表现力的验证规则移动到某些东西.
除此之外,我能想到的最好的使用 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>
限制)。