Тип данных XSD дочернего элемента в зависимости от атрибута родительского элемента
У меня есть несколько отчетов, которые выглядят так:
<report>
<dataset datatype="integer">
<data timestamp="1970-01-01T00:00:00+01:00">25</data>
<data timestamp="1970-01-01T00:01:00+01:00">25</data>
<data timestamp="1970-01-01T00:02:00+01:00">25</data>
<data timestamp="1970-01-01T00:03:00+01:00">25</data>
</dataset>
<dataset datatype="string">
<data timestamp="1970-01-01T00:00:00+01:00">foo</data>
<data timestamp="1970-01-01T00:01:00+01:00">bar</data>
<data timestamp="1970-01-01T00:02:00+01:00">baz</data>
<data timestamp="1970-01-01T00:03:00+01:00">foobar</data>
</dataset>
</report>
Мне нужно определение схемы xml, описывающее XML выше. Пока без проблем. Проблема, которую я не мог решить, заключается в следующем: Типdata
элементы должны зависеть от datatype
атрибут data set
элемент.
Тип данных может быть: строка, число с плавающей запятой или целое число. Например,datatype
атрибут установлен на "integer" все дочерние элементы "data" должны быть ограничены типом "xs: integer".
Вот мой XSD, за исключением ограничения типа:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="DataTypes">
<xs:restriction base="xs:string">
<xs:enumeration value="string"/>
<xs:enumeration value="integer"/>
<xs:enumeration value="float"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="Data">
<xs:simpleContent>
<xs:extension base="xs:anySimpleType">
<xs:attribute name="timestamp" type="xs:dateTime" use="required" />
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="Dataset">
<xs:sequence>
<xs:element name="data" type="Data" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="datatype" type="DataTypes" use="required" />
</xs:complexType>
<xs:element name="report">
<xs:complexType>
<xs:sequence>
<xs:element name="dataset" type="Dataset" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Я благодарен за каждую полезную идею!
1 ответ
Тип элементов данных должен зависеть от атрибута типа данных элемента набора данных.
Это очень точное описание функции "условного типа", которая была добавлена в XSD 1.1. Это также известно как "альтернативы типов". Имейте в виду, что не все процессоры XSD поддерживают XSD 1.1.
Вы можете найти несколько примеров в XSD 1.1 xs:alternate/xs:assert
Это невозможно сделать в XSD 1.0.