2013-01-09 33 views
0

在XML Schema中可能使用簡單類型表示一個列表,它有進一步的限制,即列表中的每個項目只能出現一次?換言之,是否可以在XML模式中定義一個「set」簡單類型?定義一個xsd:列表,其中每個項目必須是唯一的?

例如,使用下面的架構:

<xs:schema version="1.1" attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:simpleType name="item"> 
    <xs:restriction base="xs:token"> 
     <xs:enumeration value="A"/> 
     <xs:enumeration value="B"/> 
    </xs:restriction> 
    </xs:simpleType> 

    <xs:simpleType name="itemSet"> 
    <xs:list itemType="item"/> 
    </xs:simpleType> 

    <xs:element name="root"> 
    <xs:complexType> 
     <xs:attribute name="set" type="itemSet"/> 
    </xs:complexType> 
    </xs:element> 

</xs:schema> 

這份文件證實:

<root set="A B"/> 

不過,所以沒有這個文件,,我想驗證失敗因爲B重複:

<root set="A B B"/> 

我懷疑單獨使用XML Schema是不可能的,但我不太清楚,所以我在尋找確認。

回答

3

這是不可能在XSD 1.0,但它在XSD 1.1非常簡單:

<xs:simpleType name="uniqueList"> 
    <xs:restriction base="xs:NMTOKENS"> 
    <xs:assert test="count($value) = count(distinct-values($value))"/> 
    </xs:restriction> 
</xs:simpleType> 
+0

不幸的是我沒有一個理解1.1的處理器(哎呀!我以爲我這麼做了。)另外NMTOKEN對開始字符的限制太多。我想我必須使用'xs:list'創建'itemList'類型,然後使用'xs:assert'限制*另一個*'itemSet'類型,是否正確? –

+0

是的,當然你可以在這個例子中用你自己的用戶自定義列表類型代替xs:NMTOKENS。 –

1

有可能通過正則表達式。如果我們強制要排序的屬性值可能會容易得多。如果沒有,我們可能不得不與所有組合

<xs:simpleType name="itemSet1"> 
<xs:restriction base="itemSet"> 
<xs:pattern value="(A\s?)?(B\s?)?(C\s?)?"/> 
</xs:restriction> 

<xs:element name="root"> 
    <xs:complexType> 
     <xs:attribute name="set" type="itemSet1"> 
     </xs:attribute> 
    </xs:complexType> 
    </xs:element> 

現在

<root set="A B A"/> 

無效打造 'N' 模式表達等是

<root set="B A"/> 

如果你想要上面的那個也是有效的我們需要在此順序中添加另一種模式。

+0

對於我的特殊情況,要求特定的訂單太嚴格了,對不起,但它可能有助於其他人瞭解此選項。 –

+0

這個解決方案依賴於列表被限制到一個小的字符串枚舉 - 這是給出的例子是真實的,但不是一般問題。 –

相關問題