Как определить несколько элементов в XML-схеме с одинаковым именем и допустимым значением другого атрибута? - PullRequest
7 голосов
/ 07 октября 2008

Я хотел бы создать XML-схему для этого фрагмента xml, я хотел бы ограничить значения атрибута «name», чтобы в выходном документе был разрешен только один экземпляр дня для каждого дня недели:

<a>
  <day name="monday" />
  <day name="tuesday" />
  <day name="wednesday" />
</a>

Я пытался использовать это:

 <xs:complexType name="a">
  <xs:sequence>
    <xs:element name="day" minOccurs="1" maxOccurs="1">
      <xs:complexType>
        <xs:attribute name="name" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="monday" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:complexType>
    </xs:element>
    <xs:element name="day" minOccurs="1" maxOccurs="1">
      <xs:complexType>
        <xs:attribute name="name" use="required">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:enumeration value="tuesday" />
            </xs:restriction>
          </xs:simpleType>
        </xs:attribute>
      </xs:complexType>
    </xs:element>
  </xs:sequence>
</xs:complexType>

но валидатор XML-схемы в eclipse сообщает об ошибке «В группе моделей появляются несколько элементов с именем« день », с разными типами».

Есть ли другой способ?

Ответы [ 5 ]

12 голосов
/ 02 декабря 2008

Вам нужно что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
  <xs:element name="a">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="day"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="day">
    <xs:complexType>
      <xs:attribute name="name" use="required">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="monday"/>
                <xs:enumeration value="tuesday"/>
                <xs:enumeration value="wednesday"/>
            </xs:restriction>
        </xs:simpleType>
        </xs:attribute>
    </xs:complexType>
  </xs:element>
</xs:schema>
9 голосов
/ 06 мая 2010

Чтобы выполнить ограничение не более одного раза, описанное в исходном вопросе, вам необходимо использовать элемент xs: unique в своей схеме.

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">

  <xs:element name="a">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="day" maxOccurs="7" minOccurs="1">
          <xs:complexType>
            <xs:attribute name="name" use="required">
              <xs:simpleType>
                <xs:restriction base="xs:string">
                  <xs:pattern value="(mon|tues|wednes|thurs|fri|satur|sun)day"/>
                </xs:restriction>
              </xs:simpleType>
            </xs:attribute>
          </xs:complexType>
          <xs:unique name="eachDayAtMostOnce">
            <xs:selector xpath="day"/>
            <xs:field xpath="@name"/>
          </xs:unique>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

</xs:schema>
0 голосов
/ 16 мая 2009

Используйте выбор вместо последовательности

Таким образом, вы можете иметь только один элемент дня в элементе

А для атрибута name используйте атрибут ref и укажите для него перечисление

0 голосов
/ 07 октября 2008

Рассматривали ли вы что-то подобное? (т.е. день - это тип, а элементы названы по дням недели)

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="day" />
  <xs:element name="a">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="monday" maxOccurs="1" minOccurs="0" type="day" />
        <xs:element name="tuesday" maxOccurs="1" minOccurs="0" type="day" />
        <xs:element name="wednesday" maxOccurs="1" minOccurs="0" type="day" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>
0 голосов
/ 07 октября 2008

Попробуйте это:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="a">
    <xs:complexType>
        <xs:sequence>
            <xs:element maxOccurs="unbounded" name="day">
                <xs:complexType>
                    <xs:attribute name="atrib" type="xs:string" use="required" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Я думаю, что maxOccurs = "unbounded" - это то, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...