2013-01-09 32 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

这个解决方案依赖于列表被限制到一个小的字符串枚举 - 这是给出的例子是真实的,但不是一般问题。 –

相关问题