Добавить атрибуты в simpletype или ограничение на complextype в Xml Schema

Проблема заключается в следующем:

У меня есть следующий фрагмент XML:

<time format="minutes">11:60</time>

Проблема заключается в том, что я не могу одновременно добавить атрибут и ограничение. Формат атрибута может иметь только значения минут, часов и секунд. Время имеет ограничение на ограничение \d{2}:\d{2}

<xs:element name="time" type="timeType"/>
...
<xs:simpleType name="formatType">
<xs:restriction base="xs:string">
    <xs:enumeration value="minutes"/>
    <xs:enumeration value="hours"/>
    <xs:enumeration value="seconds"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="timeType">
    <xs:attribute name="format">
        <xs:simpleType>
            <xs:restriction base="formatType"/>
        </xs:simpleType>
    </xs:attribute>
</xs:complexType>

Если я создаю сложный тип timeType, я могу добавить атрибут, но не ограничение, и если я сделаю простой тип, я могу добавить ограничение, но не атрибут. Есть ли способ обойти эту проблему. Это не очень странное ограничение, или оно?

Ответ 1

Чтобы добавить атрибуты, которые вы должны получить по расширению, добавьте грани, которые вы должны получить путем ограничения. Поэтому это должно быть сделано в два этапа для дочернего содержимого элемента. Атрибут может быть определен в строке:

<xsd:simpleType name="timeValueType">
  <xsd:restriction base="xsd:token">
    <xsd:pattern value="\d{2}:\d{2}"/>
  </xsd:restriction>
</xsd:simpleType>

<xsd:complexType name="timeType">
  <xsd:simpleContent>
    <xsd:extension base="timeValueType">
      <xsd:attribute name="format">
        <xsd:simpleType>
          <xsd:restriction base="xsd:token">
            <xsd:enumeration value="seconds"/>
            <xsd:enumeration value="minutes"/>
            <xsd:enumeration value="hours"/>
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:extension>
  </xsd:simpleContent>
</xsd:complexType>

Ответ 2

Я хотел бы предложить свой пример с более подробным объяснением того, что на самом деле требуется для смешивания унаследованного типа с ограничениями при добавлении атрибута.

это место, где вы определяете свой унаследованный тип (в моем случае это xs: строка, основанная на одном из ограничений длины поля 1024). вы не можете использовать это как стандартный тип для своего поля, так как вы также добавите "атрибут" в свое поле.

  <xs:simpleType name="string1024Type">
    <xs:restriction base="xs:string">
      <xs:maxLength value="1024"/>
    </xs:restriction>
  </xs:simpleType>

это место, где ваш элемент определен на основе вашего частного типа (в моем случае это "string1024Type" ) и добавленный необходимый атрибут:

<xs:element maxOccurs="unbounded" name="event">
  <xs:complexType>
    <xs:simpleContent>
      <xs:extension base="string1024Type">
        <xs:attribute default="list" name="node" type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

оба блока могут находиться в совершенно разных местах вашей схемы. важный момент повторится только один раз - вы не можете смешивать наследование и атрибуцию в одном и том же определении элемента.