Есть ли способ обеспечить уникальность элементов в списке XML с помощью XSD? - PullRequest
0 голосов
/ 04 мая 2011

У меня есть файл XML и соответствующий файл XSD.
В файле XSD я определяю атрибут списка, в котором элементы списка являются частью перечисления.

Вот пример того, что я делаю.

<xs:simpleType name="Colors">
    <xs:list itemType="ColorEnum"/>
</xs:simpleType>

<xs:simpleType name="ColorEnum">
    <xs:restriction base="xs:token">
        <xs:enumeration value="Red"/>
        <xs:enumeration value="Blue"/>
        <xs:enumeration value="Green"/>
    </xs:restriction>
</xs:simpleType>

<xs:element name="Color">
    <xs:complexType>
        <xs:attribute name="ColorList" type="Colors" />
    </xs:complexType>
</xs:element>

XML будет выглядеть примерно так:

<Color ColorList="Red Blue Green"></Color>

Есть ли способ убедиться, что элементы в списке уникальны? Например, есть ли способ предотвратить попадание красных в этот список дважды?

Ответы [ 3 ]

4 голосов
/ 04 мая 2011

Я думаю, что единственный способ использовать xsd:pattern.Вы хотите:

<xs:simpleType name="ColorEnum">
 <xs:restriction base="xs:string">
   <xs:pattern value="(Red){0,1}\s(Blue){0,1}\s(Green){0,1}"/>
 </xs:restriction>
</xs:simpleType>

Это должно также обеспечить порядок.Я имею в виду, что вы не можете предоставить последовательность "Blue Green Red".В любом случае это должна быть отправная точка.


РЕДАКТИРОВАТЬ Очень противный:

<xs:simpleType name="ColorEnum">
 <xs:restriction base="xs:string">
   <xs:pattern value="((Red)?\s(Blue)?\s(Green)?)|((Red)?\s(Green)?\s(Blue)?)|((Green)?\s(Blue)?\s(Red)?)|((Green)?\s(Red)?\s(Blue)?)|((Blue)?\s(Green)?\s(Red)?)|((Blue)?\s(Red)?\s(Green)?)"/>
 </xs:restriction>
</xs:simpleType>

РЕДАКТИРОВАТЬ

Количество комбинаций определяется как факториал от общего количества элементов, которые вы используете в последовательности.Я надеюсь, что тогда вы не превысите три элемента:)

1 голос
/ 05 мая 2011

В XSD 1.1 (теперь доступно в Xerces и Saxon) вы можете сделать

<xs:assertion test="count(tokenize($value, '\s+')) = 
                    count(distinct-values(tokenize($value, '\s+')))"/>
0 голосов
/ 04 мая 2011

Я боюсь, что это невозможно с xs:enumeration, вы можете использовать некоторые неприятные регулярные выражения, такие как:

  <xs:simpleType name="ColorEnum">
    <xs:restriction base="xs:string">
      <xs:pattern value="(Red)?( Blue)?( Green)?"/>
    </xs:restriction>
  </xs:simpleType>

В этом случае порядок элементов фиксирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...