XML-схема — только один элемент должен иметь атрибут true

Как я могу определить логический атрибут, который может быть установлен «true» только в одном элементе. Следующий фрагмент должен быть недействительным.

<products>
  <product featured="yes">Prod 1</product>
  <product featured="yes">Prod 2</product>
</products>

person Jozef    schedule 18.12.2009    source источник
comment
Я не верю, что это возможно с XML-схемой.   -  person skaffman    schedule 18.12.2009


Ответы (5)


arrow_upward
5
arrow_downward

Вы не можете сделать это с XML-схемами.

Вы можете определить атрибуты элемента, но не ограничивать их одним экземпляром элемента.

person Oded    schedule 18.12.2009

arrow_upward
4
arrow_downward

Вы можете добавить атрибут в элемент products, указывающий, какой product показан.

person paolot    schedule 18.12.2009
comment
@AOI Карасу: я думаю, что проверить это точно невозможно - person paolot; 26.01.2010

arrow_upward
3
arrow_downward

Вы не можете сделать это с помощью XMLSchema. Если вы хотите указать эти ограничения в среде XML, попробуйте Schematron (http://www.schematron.com/).

person peter.murray.rust    schedule 18.12.2009

arrow_upward
3
arrow_downward

Вы можете сделать следующее...

<products>
    <product featured="Yes">Prod 1</product>
    <product>Prod 2</product>
</products>

Затем используйте уникальный элемент, чтобы ограничить атрибут таким образом...

<xs:unique name="UniqueFeaturedProduct">
      <xs:selector xpath="product"/>
      <xs:field xpath="@featured"/>
</xs:unique>

Если бы вы ограничили атрибут 'featured' необязательным перечислением одного значения "Да", тогда мог бы быть только один рекомендуемый атрибут. Что-то вроде этого...

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="products">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="product" type="productType" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
        <xs:unique name="UniqueFeaturedProduct">
            <xs:selector xpath="product"/>
            <xs:field xpath="@featured"/>
        </xs:unique>
    </xs:element>
    <xs:simpleType name="featuredType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Yes"/>
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="productType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="featured" type="featuredType" use="optional"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:schema>
person Objeron    schedule 28.02.2014