Схема XML - только один элемент должен иметь атрибут, установленный в true - PullRequest
7 голосов
/ 18 декабря 2009

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

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

Ответы [ 5 ]

5 голосов
/ 18 декабря 2009

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

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

4 голосов
/ 18 декабря 2009

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

3 голосов
/ 28 февраля 2014

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

<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» необязательным перечислением одного значения «Да», тогда может быть только один атрибут 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>
3 голосов
/ 18 декабря 2009

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

1 голос
/ 14 января 2010

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

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

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

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