XSD: как использовать ограничение на группу ключ-значение?

#xml #xsd #xsd-validation

#xml #xsd #xsd-проверка

Вопрос:

Мой фактический xml выглядит примерно так:

 <gender code="2" display="female />
  

Код для обозначения пола: 1-мужской, 2-женский. Теперь у меня уже есть xsd, подобный этому:

 <xs:element name="gender">
    <xs:complexType>
        <xs:attribute name="code" type="xs:int">
            <xs:simpleType>
                <xs:restriction base="int">
                    <xs:enumeration value="1"/>
                    <xs:enumeration value="2"/>
                </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
        <xs:attribute name="displayName" type="xs:string">
            <xs:simpleType>
                <xs:restriction>
                    <xs:enumeration value="male"/>
                    <xs:enumeration value="female"/>
                </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
    </xs:complexType>
</xs:element>
  

Но это также справедливо для этого xml:

 <gender code="2" display="male />
  

Я ищу xs: ограничение, но это кажется бесполезным.Есть ли другой способ исправить мой xsd?

Комментарии:

1. Я не могу понять, зачем вы вообще беспокоитесь об этих избыточных (ненормализованных) элементах. code уже содержит необходимую информацию и display кажется просто украшением для потребления человеком; Я не вижу смысла включать это в схему и тем более для каждого элемента person в отдельности.

Ответ №1:

Чтобы наложить ограничения на несколько атрибутов, вам нужны утверждения XSD 1.1:

 <xs:assert test="(@code=1 and @display='male') 
                or (@code=2 and @display='female')"/>
  

как дочерний элемент xs:element .

Но не все процессоры схем поддерживают XSD 1.1.