2009-12-18 3 views
7

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

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

Я не верю, что это возможно с помощью XML-схемы. – skaffman

ответ

5

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

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

4

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

+0

Спасибо за ваш совет. – Jozef

+0

@AOI Karasu: Я думаю, что проверить, что это определенно невозможно – paolot

3

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

0

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

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

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

<products featured_id="3"> 
    <product id="1">Prod 1</product> 
    <product id="2">Prod 2</product> 
</products> 
2

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

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

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

<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> 
Смежные вопросы