如何在XSD中表示具有耦合属性类型的元素序列?

时间:2011-03-10 02:30:08

标签: xsd

我有以下要求,并且正在尝试确定如何最好地对XSD进行建模以表示这些要求。

我有许多XML元素的实例,比如<box>。每个<box>都有一个必需的属性t="[box-type]",每个具有特定类型的框(例如t="tall")都有另一个必需属性v="10",表示高框的高度。所有<box> es都具有tv属性,但对v属性接受的值的限制取决于其t属性的值

例如,采用以下XML:

<box t="tall" v="10"/>
<box t="named" v="George"/>
<box t="colored" v="green"/>

现在,在我的XSD中,我需要能够代表一系列这样的元素。我的想法是做类似下面的事情,只列出我的序列中所有允许的框类型(在下面的代码片段末尾):

<xsd:simpleType name="box_types">
    <xsd:restriction base="xsd:token">
        <xsd:enumeration value="tall" />
        <xsd:enumeration value="named" />
        <xsd:enumeration value="colored" />
    </xsd:restriction>
</xsd:simpleType>

<!--Box base-->
<xsd:complexType name="box_type">
    <xsd:attribute name="t" use="required" type="box_types"/>
    <xsd:attribute name="v" use="required"/>
</xsd:complexType>

<!--Box concrete types-->
<xsd:complexType name="tall_box_type">
    <xsd:complexContent>
        <xsd:extension base="box_type">
            <xsd:attribute name="t" fixed="tall" use="required"/>
            <xsd:attribute name="v" type="xsd:int" use="required"/>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="named_box_type">
    <xsd:complexContent>
        <xsd:extension base="box_type">
            <xsd:attribute name="t" fixed="named" use="required"/>
            <xsd:attribute name="v" type="xsd:string" use="required"/>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<xsd:complexType name="colored_box_type">
    <xsd:complexContent>
        <xsd:extension base="box_type">
            <xsd:attribute name="t" fixed="colored" use="required"/>
            <xsd:attribute name="v" type="xsd:token" use="required"/>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>

<!--And finally, the place where boxes show up-->
<xsd:complexType name="box_usage">
    <xsd:sequence>
        <xsd:element name="box" type="tall_box_type"/>
        <xsd:element name="box" type="named_box_type"/>
        <xsd:element name="box" type="colored_box_type"/>
    </xsd:sequence>
</xsd:complexType>

不幸的是,这不是一个有效的XSD - VS给了我几个错误,最不幸的是Elements with the same name and in the same scope must have the same type。关于如何在XSD中表示这些t / v耦合属性限制的任何建议?

1 个答案:

答案 0 :(得分:1)

XML Schema 1.0无法验证值之间的依赖关系。您的选择是:

  1. 更改您的XML。例如,使用tallBoxcolorBoxnameBox作为元素名称。
  2. 使用XSD验证常规结构并使用程序逻辑(或Schematron或XSLT样式表等其他工具)验证值。
  3. 使用XML Schema 1.1,它可以验证值约束但尚未得到普遍支持。