當你開始移動到「驗證邏輯」你打的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>
元素,只選擇一個類型的元素與這樣你就可以在它們中的至少一個和maxOccurs="6"
擁有全部。但是現在你可以多次選擇相同的元素,所以你必須限制它,這就是<unique>
的作用。
但請注意,此示例並非沒有限制,因爲您無法限制元素的順序(即強化<sequence>
限制)。