Добавление атрибутов в simpletype или ограничение на complextype в XML-схеме
проблема заключается в следующем:
у меня есть следующий XML-фрагмент:
<time format="minutes">11:60</time>
проблема в том, что я не могу добавить атрибут и ограничение одновременно. Формат атрибута может содержать только значения минут, часов и секунд. Время имеет restrictionpattern 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, я могу добавить атрибут, но не ограничение, и если я делаю простой тип, я могу добавить ограничение, но не атрибут. Есть ли способ обойти эту проблему. Это не очень странное ограничение, не так ли?
2 ответов
чтобы добавить атрибуты, вы должны получить расширение, чтобы добавить фасеты, вы должны получить ограничение. Поэтому это должно быть сделано в два этапа для дочернего содержимого элемента. Атрибут может быть определен inline:
<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>
Я хотел бы предложить свой пример с более подробным объяснением, что на самом деле требуется для смешивания унаследованного типа с ограничениями при добавлении атрибута.
это место, где вы определяете свой унаследованный тип (в моем случае это xs:string на основе одного с ограничением длины поля 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>
оба блока могут находиться в совершенно разных местах вашей схемы. важный момент заключается только в следующем - вы не можете смешивать наследование и атрибуцию в одном определении элемента.