2012-05-02 63 views
0

我有下面這段XSD的:複選框種領域的XML模式

<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個或更多字段 - 多項選擇)。

任何一個可以幫助我如何實現這一目標?

回答

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>元素,只選擇一個類型的元素與這樣你就可以在它們中的至少一個和maxOccurs="6"擁有全部。但是現在你可以多次選擇相同的元素,所以你必須限制它,這就是<unique>的作用。

但請注意,此示例並非沒有限制,因爲您無法限制元素的順序(即強化<sequence>限制)。