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)


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

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

person Oded    schedule 18.12.2009

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

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

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

person peter.murray.rust    schedule 18.12.2009

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

<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

Мой ответ таков, потому что я пока не могу добавлять комментарии.

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

Это решение приводит к другой проблеме: проверке, указывает ли атрибут на существующий элемент.

<products featured_id="3">
  <product id="1">Prod 1</product>
  <product id="2">Prod 2</product>
</products>
person Aoi Karasu    schedule 14.01.2010
comment
Гарантировать, что атрибут featured_id указывает на существующий элемент, можно с помощью xs:key и xs:keyref. Подробнее см. здесь (datypic.com/books/defxmlschema/chapter17.html) - person Gediminas Rimsa; 29.08.2018