子元素的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属性设置为“整数”,所有子“数据”元素应限制为“ 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>

我非常感谢每个有用的想法!

解决方法

数据元素的类型需要取决于数据集元素的datatype属性。

这是对XSD 1.1中添加的“条件类型归因”功能的非常精确的描述。也称为“类型替代”。请注意,并非所有XSD处理器都支持XSD 1.1。

您可以在XSD 1.1 xs:alternative/xs:assert

中找到一些示例

在XSD 1.0中无法做到这一点。