0

是否可以在 XML Schema 中表示一个简单类型,它是一个列表并且具有进一步的限制,即列表中的每个项目只能出现一次?换句话说,是否可以在 XML Schema 中定义一个“set”简单类型?

例如,使用以下架构:

<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 是不可能的,但我不太了解它,所以我正在寻找确认。

4

2 回答 2

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>
于 2013-01-09T09:05:19.247 回答
1

可以通过正则表达式。如果我们强制对属性值进行排序,这可能会容易得多。如果不是,我们可能必须使用所有组合创建“N”模式表达式

  <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"/>

是无效的,所以是

<root set="B A"/>

如果您希望上述模式也有效,我们需要使用此订单向限制添加另一种模式。

于 2013-01-09T10:05:30.247 回答